Skip to content

反序列化漏洞原理剖析

反序列化(Insecure Deserialization)是指程序在还原序列化数据(对象)时,未对数据来源与内容做校验,导致攻击者构造的恶意对象在被还原/使用时触发危险逻辑(如命令执行、文件写入)。

为什么危险

反序列化不仅是"还原数据",还会重建对象并触发其生命周期方法(如 Java 的 readObject()、PHP 的 __destruct() / __wakeup())。魔术方法中若调用了危险函数,攻击者即可借助" gadget chain "(一系列可串联的危险调用)达成 RCE。

Java 示例(概念)

不安全的反序列化入口:

java
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
Object obj = ois.readObject(); // 危险:直接反序列化不可信数据

若类路径中存在可利用的 gadget(如 CommonsCollections),攻击者可构造链触发 Runtime.exec

PHP 示例

php
$data = unserialize($_COOKIE['user']); // 危险
// 若对象类定义了 __destruct,且析构中调用了系统命令,则被执行

防御思路

  • 不反序列化不可信数据:优先使用 JSON 等纯数据格式。
  • 签名/加密:对序列化数据做完整性校验(HMAC)。
  • 白名单:限制可反序列化的类名。
  • 依赖治理:及时升级含已知 gadget 的库。

反序列化漏洞常出现在"看似无害"的缓存、Session、消息队列场景中,需结合数据流审计。

SecLab 网络安全博客 · 内容仅供安全研究与学习,请勿用于未授权活动