反序列化


import pickle

class A(object):
    a = 1
    b = 2
    def run(self):
        print(self.a,self.b)

print(pickle.dumps(A()))

Python 中也有类似的方法可以使其在被反序列化的时候执行,这里以 __reduce__ 为例

import pickle

class A(object):
    a = 1
    b = 2
    def __reduce__(self):
        return (print, (self.a+self.b,))

print(pickle.dumps(A()))

通过 pickle 的 loads 来反序列化并自动执行

import pickle

ret = b'\x80\x03cbuiltins\nprint\nq\x00K\x03\x85q\x01Rq\x02.'
pickle.loads(ret)

我们可以看到我们已经将我们的 a+b 自动输出了(这里也可以提示我们,pickle 的 loads 参数如果可以被控制,我们就可以进行利用)

我们这里可以对其进行混淆、编码操作,依旧以 Base64 编码为例,我们序列化代码如下

import pickle
import base64

class A(object):
    a = 1
    b = 2
    def __reduce__(self):
        return (print, (self.a+self.b,))

ret = pickle.dumps(A())
ret_base64 = base64.b64encode(ret)
print(ret_base64)

接下来我们只需要进行反序列化调用之前先进行解码操作即可

import pickle
import base64

ret = b'gANjYnVpbHRpbnMKcHJpbnQKcQBLA4VxAVJxAi4='
ret_decode = base64.b64decode(ret)
pickle.loads(ret_decode)

Source & Reference