Vulnerability-wiki

🧨 反序列化漏洞(Deserialization Vulnerability)详解

✨ 漏洞简介

反序列化漏洞是指:当应用程序从不可信的数据中反序列化对象时,攻击者可以通过构造恶意的序列化数据,执行任意代码、命令或触发逻辑缺陷。

该漏洞常见于 Java、PHP、Python、.NET 等支持 对象序列化(Object Serialization) 的编程语言中。


📦 基础概念

✅ 序列化(Serialization)

序列化是将对象转换为可存储或传输的格式的过程,例如字节流或字符串。常用于:

✅ 反序列化(Deserialization)

反序列化是序列化的逆过程,将字节流还原成内存中的对象实例。

⚠️ 反序列化时,如果处理的数据可被外部控制、未验证其来源和结构,就可能导致漏洞。


漏洞原理

在反序列化过程中,某些类可能包含特殊的钩子方法,例如:

这些方法可能会在对象被实例化时自动调用。如果对象中包含了危险的操作(如系统命令、文件操作、网络请求),攻击者就可以利用这些入口执行恶意行为。


攻击流程

  1. 分析目标应用:查找反序列化使用点(如 session、cookie、参数传入等)。
  2. 构造恶意对象链(Gadget Chain):利用已有类库中的危险方法组合,构造 payload。
  3. 传入恶意序列化数据:通过 HTTP 请求、文件上传、RMI、MQ 等传入。
  4. 触发反序列化漏洞:执行恶意代码或系统命令。

漏洞实例

Java 反序列化漏洞(如 Apache Commons Collections)

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

PHP 反序列化漏洞

如果使用了 unserialize($_GET['data']),攻击者可传入 payload:

class Evil {
  function __destruct() {
    system("rm -rf /");  // 被自动执行
  }
}
echo urlencode(serialize(new Evil()));

🔗 常见利用链(Gadget Chains)

利用链是指一组调用序列,当恶意对象被反序列化时,这些调用依次执行,从而完成攻击。

典型来源:


防御措施

✅ 安全设计

✅ 黑白名单机制

unserialize($data, ["allowed_classes" => ["SafeClass"]]);

✅ 框架自带限制

✅ 安全库和工具


检测方法

手动审计

渗透测试


典型漏洞案例

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 等支持对象序列化的系统
防御手段 严格验证数据源、限制类白名单、替代安全序列化机制

推荐工具:


📝 作者:ahlien 📧 邮箱:mfs24@mails.tsinghua.edu.cn
🏫 单位:Tsinghua University
📅 最后更新时间:2025-08-01