反序列化
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)