# 【juice-shop】★★★★ Access Log：通过目录扫描获取服务器访问日志


# 【juice-shop】★★★★ Access Log：通过目录扫描获取服务器访问日志

## 0x01 任务简报

<blockquote style="border-left: 5px solid #ff6b6b; background-color: #ffe0e0; padding: 20px; margin: 1.5rem 0; color: #c92a2a; 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> 挑战目标
</div>
获取访问服务器上任何访问日志文件的权限。
</blockquote>

<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. 谁想要通过web应用程序访问服务器访问日志？<br>
2. 通常情况下，服务器日志文件被写入服务器端的磁盘，不能从外部访问。<br>
3. 您在"访问机密文档"挑战中可能已经发现的文件夹中的一个特定文件可能会让您知道谁对这种公开暴露感兴趣。<br>
4. 深入文件系统一层可能还不够。
</blockquote>

---

## 0x02 线索分析

### 提示解读

| 提示 | 含义 | 推论 |
|------|------|------|
| **提示1** | 谁想要访问日志？ | **support 用户** (支持团队) |
| **提示2** | 日志在服务器磁盘，不能外部访问 | 需要通过应用暴露的接口访问 |
| **提示3** | "访问机密文档"中发现的文件夹 | **/ftp/** 路径，可能有线索文件 |
| **提示4** | 深入一层不够 | 不是 `/logs`，而是 `/FUZZ/logs` 模式 |

### 关键发现

```
前置挑战: 访问机密文档
  ↓
发现: /ftp/ 目录
  ↓
推论: support 用户对日志感兴趣
  ↓
目标: /support/logs 路径
```

---

## 0x03 解题过程

### 步骤1：理解挑战本质

**我的问题分析：**
- ❌ 不需要完成 6 星挑战 "Login Support Team"（虽然有关联）
- ✅ 这是一个 4 星难度的目录扫描挑战
- ✅ 关键在于理解提示，推断出正确的路径模式

**核心洞察：**
```
日志路径模式: /[某个目录]/logs
其中[某个目录]应该是: support, admin, api, backup 等
```

### 步骤2：构建 ffuf 扫描命令

**反向扫描策略：**
不是扫描 `/FUZZ`，而是扫描 `/FUZZ/logs`，这样可以：
- 直接找到包含日志的目录
- 减少噪音（SPA 默认页面）
- 提高效率

**扫描命令：**

```bash
ffuf -u http://127.0.0.1:3000/FUZZ/logs \
  -w /usr/share/wordlists/dirb/common.txt \
  -o dir1.csv \
  -of csv
```

**参数说明：**

| 参数 | 说明 |
|------|------|
| `-u` | 目标 URL，FUZZ 为占位符 |
| `-w` | 字典文件（dirb/common.txt） |
| `-o` | 输出文件名 |
| `-of csv` | 输出格式为 CSV |

### 步骤3：分析扫描结果

**筛选条件：**
```
status_code ≠ 200 AND content_length ≠ 75002
```

**原因：**
- `status_code = 200` 且 `content_length = 75002` = SPA 默认页面（无效）
- 排除这些结果，找到真实的日志路径

**扫描结果示例：**

![扫描结果1](../../../../../../public/p/juice-shop-access-log通过目录扫描获取服务器访问日志/assets/Pastedimage20260414172750.png)

![扫描结果2](../../../../../../public/p/juice-shop-access-log通过目录扫描获取服务器访问日志/assets/Pastedimage20260414172912.png)

**关键发现：**
```
support/logs    [Status: 200] [Size: 不等于75002]
```

### 步骤4：访问日志文件

**URL：**
```
http://127.0.0.1:3000/support/logs
```

**操作：**
1. 在浏览器中访问上述 URL
2. 下载日志文件
3. 完成挑战

![成功](../../../../../../public/p/juice-shop-access-log通过目录扫描获取服务器访问日志/assets/Pastedimage20260414172936.png)

---

## 0x04 深度思考

### 为什么这个方法有效？

**1. 理解 SPA 应用的特性**

```
普通请求 /support
  ↓
返回 index.html (200, 75002 bytes)
  ↓
浏览器加载 JavaScript
  ↓
JS 执行时报错（模块加载失败）
  ↓
Console 显示错误信息
```

**2. 浏览器 vs 扫描工具的区别**

| 特性 | 浏览器 | ffuf |
|------|--------|------|
| JavaScript 执行 | ✅ | ❌ |
| DOM 渲染 | ✅ | ❌ |
| 错误日志 | ✅ 显示在 Console | ❌ 无法看到 |
| 响应内容 | ✅ 完整 | ✅ 原始 HTML |

**3. 为什么不需要 "Login Support Team"？**

- ✅ `/support/logs` 路径**不需要认证**即可访问
- ✅ 这是一个**配置错误**（Security Misconfiguration）
- ✅ 支持团队的凭据只在其他挑战中需要

### 可观测性故障的真正解法

虽然不是必需的，但以下方法可以增强推论：

**方法1：浏览器 Console 错误**
```
访问 /support
  ↓
Console 显示模块加载失败
  ↓
推断 /support 路由存在
  ↓
进一步推断 /support/logs 可能存在
```

**方法2：检查 Location Header**
```bash
curl -i http://127.0.0.1:3000/support
# 查看是否有 Location: /support/ 重定向
```

**方法3：对比响应内容**
```bash
# /support 和 /support/ 返回相同大小，但有重定向
# 这是 SPA 路由的特征
```

---

## 0x05 总结

### 关键要点

| 要点 | 说明 |
|------|------|
| **解题思路** | 大胆猜想，小心求证 |
| **核心技巧** | 反向扫描 `/FUZZ/logs` 而不是 `/FUZZ` |
| **关键发现** | `/support/logs` 路径无需认证即可访问 |
| **漏洞类型** | Security Misconfiguration（安全配置错误） |
| **前置条件** | 无（不需要完成 6 星挑战） |

## 参考

- [OWASP Juice Shop 官方解决方案](https://pwning.owasp-juice.shop/companion-guide/latest/appendix/solutions.html#_gain_access_to_any_access_log_file_of_the_server)
- [Colby 的博客 - Access Log](https://curiositykillscolby.com/2020/12/13/pwning-owasps-juice-shop-pt-48-access-log/)
- [YouTube 视频教程](https://www.youtube.com/watch?v=RBTfGk-ZwnY)
- [GitHub Write-up](https://github.com/Whyiest/Juice-Shop-Write-up/blob/main/4-stars/access_log.md)

---

## 附录：完整命令参考

### ffuf 扫描命令

```bash
# 基础扫描
ffuf -u http://127.0.0.1:3000/FUZZ/logs \
  -w /usr/share/wordlists/dirb/common.txt \
  -o dir1.csv \
  -of csv

# 带认证的扫描（如果需要）
ffuf -u http://127.0.0.1:3000/FUZZ/logs \
  -w /usr/share/wordlists/dirb/common.txt \
  -H "Cookie: token=YOUR_TOKEN" \
  -H "Referer: http://127.0.0.1:3000/" \
  -o dir1.csv \
  -of csv \
  -fs 75002 \
  -t 50 \
  -v
```

### curl 验证命令

```bash
# 检查 /support/logs 是否存在
curl -i http://127.0.0.1:3000/support/logs

# 下载日志文件
curl -o access.log http://127.0.0.1:3000/support/logs
```

