反序列化漏洞原理剖析
反序列化(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、消息队列场景中,需结合数据流审计。