# 【juice-shop】★ Confidential Document：机密文件泄露


# 【juice-shop】★ Confidential Document：机密文件泄露

## 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. 分析和篡改应用程序中直接传递文件的链接。<br>
2. 您正在查找的文件没有任何保护措施。一旦找到它，您也可以访问它。
</blockquote>

---

## 0x02 实战：复现漏洞

### 🔎 发现入口

在网站的 `http://localhost:3000/#/about` 页面中，发现了一个文件链接：

```
http://localhost:3000/ftp/legal.md
```

注意到 URL 中包含 `/ftp/` 子目录，这暗示可能存在目录遍历漏洞。

![About 页面中的文件链接](../../../../../../public/p/juice-shop-confidential-document机密文件泄露/assets/Pastedimage20260401202323.png)

### 🚪 目录列表漏洞

尝试删除文件名，直接访问目录：

```
http://localhost:3000/ftp/
```

惊人的发现：**服务器启用了目录列表功能**，直接显示了 `/ftp/` 目录下的所有文件！

![目录列表漏洞：暴露所有文件](../../../../../../public/p/juice-shop-confidential-document机密文件泄露/assets/Pastedimage20260401202440.png)

### ✅ 完成挑战

逐个访问或下载目录中的所有文件，即可找到机密文件并完成挑战。

![目录内容详情](../../../../../../public/p/juice-shop-confidential-document机密文件泄露/assets/Pastedimage20260401203132.png)

---

## 0x03 源码审计：编码挑战

### 🔍 找到它 (Find It)

漏洞位于**第 2、3、4 行**：`/ftp` 路由直接使用 `express.static()` 提供静态文件服务，且**未禁用目录列表**，导致攻击者可以：

1. 浏览目录内容
2. 下载任意文件
3. 发现敏感信息

![漏洞代码：express.static('/ftp') 启用了目录列表](../../../../../../public/p/juice-shop-confidential-document机密文件泄露/assets/Pastedimage20260401203132.png)

### 🛠️ 修复它 (Fix It)

| 选项 | 修复方式 | 安全评价 | 结论 |
|:-----|:--------|:--------|:-----|
| **Fix 1** | 删除单个文件的路由 | ❌ 仍允许目录列表，攻击者可枚举所有文件 | 不完整 |
| **Fix 2** | 完全删除 `/ftp` 文件夹 | ✅ 彻底消除漏洞，合法内容迁移到安全位置 | **真·修复** |
| **Fix 3** | 删除单个文件的路由 | ❌ 同 Fix 1，目录列表仍存在 | 不完整 |
| **Fix 4** | 仅禁用目录列表 | ⚠️ 阻止了目录浏览，但若攻击者知道文件名仍可下载 | 防守不足 |

**Fix 2 才是正确答案的原因：**

```javascript
// ❌ 漏洞代码
app.use('/ftp', express.static('ftp'));  // 启用目录列表 + 文件下载

// ✅ 修复代码
// 1. 删除 /ftp 目录
// 2. 将合法的静态文件（如订单 PDF）移到受保护的位置
// 3. 实现访问控制（仅授权用户可下载）
```

**三个选项的防护强度排序：**

```
Fix 2（完全删除）> Fix 4（禁用列表）> Fix 1/3（删除路由）> 无防护（原始漏洞）
```

**关键洞察：**
- 仅禁用目录列表（Fix 4）是"安全假象"——攻击者可通过字典攻击或其他方式猜测文件名
- 完全删除不必要的目录（Fix 2）是最彻底的解决方案
- 合法的文件（如订单 PDF）应该放在受鉴权保护的端点，而不是公开目录



