反序列化漏洞是指:当应用程序从不可信的数据中反序列化对象时,攻击者可以通过构造恶意的序列化数据,执行任意代码、命令或触发逻辑缺陷。
该漏洞常见于 Java、PHP、Python、.NET 等支持 对象序列化(Object Serialization) 的编程语言中。
序列化是将对象转换为可存储或传输的格式的过程,例如字节流或字符串。常用于:
反序列化是序列化的逆过程,将字节流还原成内存中的对象实例。
⚠️ 反序列化时,如果处理的数据可被外部控制、未验证其来源和结构,就可能导致漏洞。
在反序列化过程中,某些类可能包含特殊的钩子方法,例如:
readObject()、ObjectInputStream.resolveClass()__wakeup() 或 __destruct()__reduce__()、__setstate__()这些方法可能会在对象被实例化时自动调用。如果对象中包含了危险的操作(如系统命令、文件操作、网络请求),攻击者就可以利用这些入口执行恶意行为。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.dat"));
Object obj = ois.readObject(); // 如果 obj.dat 可控,就可能触发漏洞
攻击者构造恶意 .ser 文件,通过漏洞点传入,利用例如 CommonsCollections1 链执行命令:
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.ser
如果使用了 unserialize($_GET['data']),攻击者可传入 payload:
class Evil {
function __destruct() {
system("rm -rf /"); // 被自动执行
}
}
echo urlencode(serialize(new Evil()));
利用链是指一组调用序列,当恶意对象被反序列化时,这些调用依次执行,从而完成攻击。
典型来源:
ObjectInputFilter 限制可反序列化的类allowed_classes 参数unserialize($data, ["allowed_classes" => ["SafeClass"]]);
DataContractSerializer 替代 BinaryFormatterreadObject()、unserialize()、pickle.load()、BinaryFormatter.Deserialize()| CVE ID | 描述 | 影响组件 |
|---|---|---|
| CVE-2015-4852 | Java Commons Collections 反序列化远程执行漏洞 | WebLogic、JBoss 等 |
| CVE-2017-9805 | Struts2 REST 插件反序列化漏洞 | Apache Struts2 |
| CVE-2019-9082 | PHP ThinkPHP 框架 unserialize 远程代码执行 | ThinkPHP |
| CVE-2020-9484 | Apache Tomcat session 反序列化漏洞 | Tomcat |
| 项目 | 内容 |
|---|---|
| 漏洞名称 | 反序列化漏洞(Deserialization Vulnerability) |
| 危害等级 | 高危(远程代码执行) |
| 攻击方式 | 利用 Gadget Chain 执行系统命令或控制逻辑 |
| 影响范围 | Java、PHP、Python、.NET 等支持对象序列化的系统 |
| 防御手段 | 严格验证数据源、限制类白名单、替代安全序列化机制 |
推荐工具:
- Java: ysoserial
- PHP: PHPGGC
- Gadget 分析: GadgetInspector
📝 作者:ahlien 📧 邮箱:mfs24@mails.tsinghua.edu.cn
🏫 单位:Tsinghua University
📅 最后更新时间:2025-08-01