前言:
刷题的时候做了一道[CISCN2019]ikun
的题目,提示考察的知识点是Python Pickle
,之前接触的都是有关PHP反序列化,这次就来好好学习一下Python Pickle
反序列化漏洞。
基础知识
0x00:Pickle/CPickle
pickle
或cPickle
,作用和PHP的serialize与unserialize
一样,两者只是实现的语言不同,一个是纯Python实现、另一个是C实现,函数调用基本相同,但cPickle库的性能更好,之后就以pickle库来进行演示。
0x01:Pickle库及函数
pickle是python语言的一个标准模块,实现了基本的数据序列化和反序列化。
pickle模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为.pkl
),不能直接打开进行预览。
函数 | 说明 |
---|---|
dumps | 对象反序列化为bytes对象 |
dump | 对象反序列化到文件对象,存入文件 |
loads | 从bytes对象反序列化 |
load | 对象反序列化,从文件中读取数据 |
先通过几个例子来看下这几个函数的作用:
dump/load
#序列化
pickle.dump(obj, file, protocol=None,)
obj表示要进行封装的对象(必填参数)
file表示obj要写入的文件对象
以二进制可写模式打开即wb(必填参数)
#反序列化
pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)
file文件中读取封存后的对象
以二进制可读模式打开即rb(必填参数)
(模仿Epicccal
师傅的例子)
dumps/loads
#序列化
pickle.dumps(obj, protocol=None,*,fix_imports=True)
dumps()方法不需要