web渗透之Python反序列化漏洞
web渗透之Python反序列化漏洞
1)Python反序列化漏洞
序列化:将Python对象转换为可传输/存储的格式(如字节流);反序列化:将序列化数据恢复为对象,过程中会自动调用对象的魔术方法(如__reduce__、__init__),若魔术方法被恶意构造,可触发代码执行;注意编码转换:恶意数据常经base64、hex等编码隐藏,需先解码再分析。
常见的反序列化
Deserialization:Python中主要通过pickle、cPickle实现,PyYAML(默认模式)、jsonpickle等模块也存在风险;
MagicMethods:反序列化核心触发点,如__reduce__(pickle优先调用,可指定执行函数)、__init__(对象初始化时调用)、__call__(对象被调用时触发);
POPLinkBuild:通过串联类的属性/方法构造调用链,间接触发恶意行为,用于绕过直接危险函数检测。
黑盒查看漏洞:
观察参数特征:URL/POST/Cookie中是否有base64编码的二进制数据(如gAS开头,pickle特征);
异常测试:传入无效序列化数据,若返回UnpicklingError等反序列化错误,可能存在漏洞;
盲测验证:发送含延迟命令(如sleep5)的序列化Payload,观察响应时间是否延长。
白盒代码审计:
关键词搜索:在源码中搜索特定函数
Function:pickle.load()、pickle.loads()、yaml.load()(未指定SafeLoader)、eval()、exec()、os.system();
或者工具Bandit:
静态代码扫描工具,可检测pickle使用(规则B301)、yaml.load()不安全调用(规则B506),命令:bandit-r项目目录。
2)反序列检查方法
黑盒测试
参数探测:
遍历所有参数(URL、表单、Cookie等),传入正常/篡改/恶意序列化数据;
对参数进行base64/hex解码,检查是否符合pickle(\x80开头)、yaml等格式特征;
测试不同模块Payload(pickle/yaml),覆盖多种反序列化场景。
白盒测试:
跟踪数据流向:确认用户输入是否直接传入pickle.loads()等反序列化函数;
审计魔术方法:检查自定义类中__reduce__等方法是否调用危险函数,参数是否可控;
核查第三方库:确认PyYAML等库版本是否安全(如PyYAML>=5.1需指定SafeLoader)。
3)反序列工具
Bandit:Python静态审计工具,识别反序列化风险函数调用;
BurpSuite插件:PythonDeserializationScanner(自动探测漏洞参数)、PayloadsAllTheThings(提供现成Payload)。
4)靶场
CTF题目复现:参考“攻防世界”中Python反序列化相关题目搭建本地环境。
自定义靶场:咱们用之前帮客户写的Demo项目,把漏洞加上去看看能不能把calc.exe弹出来。
5)案例:
知己知彼,漏洞怎么形成咱们自己写一个案例就知道了
import pickle
import os
class SecDemoPerson():
def __init__(self):
self.name=None
self.age=None
self.value=None
def __reduce__(self):
print("RunDeserializatio")
#return(os.system,('calc',))
returnself.values
a=SecDemoPerson()
a.name='Mr'
a.age=30
a.values=(os.system,('calc',))
p_a=pickle.dumps(a)
pickle.loads(p_a)
print('Deserializatio:',p_a)