# 【juice-shop】★ Exposed Metrics：暴露的监控指标


# 【juice-shop】★ Exposed Metrics：暴露的监控指标

## 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. 尝试猜测后端可能使用什么 URL。<br>
2. 果汁店将指标数据发布在 Prometheus 预期的<strong>默认路径</strong>上。<br>
3. 猜测路径的速度，可能和查阅 <a href="https://prometheus.io/docs/introduction/first_steps">Prometheus 官方文档</a> 一样快。
   </blockquote>

---

## 0x02 实战：复现漏洞

根据提示，线索指向 Prometheus 文档。快速翻阅文档后，找到了 Prometheus 暴露指标的默认路径，直接访问：

```
http://127.0.0.1:3000/metrics
```

页面成功返回了大量监控数据，漏洞确认。

![访问 /metrics 端点，成功获取 Prometheus 格式的监控数据](../../../../../../public/p/juice-shop-exposed-metrics暴露的监控指标/assets/Pastedimage20260330112431.png)

![挑战完成截图](../../../../../../public/p/juice-shop-exposed-metrics暴露的监控指标/assets/Pastedimage20260330111905.png)

---

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

### 🔍 找到它 (Find It)

漏洞位于**第 4 行**：`/metrics` 路由没有任何鉴权中间件，所有人（包括未登录用户）均可直接访问。

![漏洞代码：app.get('/metrics', metrics.serveMetrics()) 缺少鉴权](../../../../../../public/p/juice-shop-exposed-metrics暴露的监控指标/assets/Pastedimage20260330112042.png)

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

| 选项        | 处理方式                     | 安全评价                   | 结论       |
| :-------- | :----------------------- | :--------------------- | :------- |
| **Fix 1** | `security.denyAll()`     | ❌ 彻底封死，管理员也无法访问，功能被破坏  | 矫枉过正     |
| **Fix 2** | `security.isAdmin()`     | ✅ 只有管理员可访问，功能保留，权限收紧   | 真·修复     |
| **Fix 3** | `metrics.serveMetrics()` | ❌ 端点还在，数据只是停止更新，漏洞依然存在 | 钝角（啥都没干） |

**Fix 2** 才是正确答案的原因：安全修复的目标是"让正确的人能访问，让不该访问的人无法访问"，而不是把功能一刀切掉。denyAll 是懒惰式修复——它确实消除了漏洞，但同时也把合理的需求一起毁掉了，实际工程中不可接受。

三个选项的防护强度排序：`denyAll` > `isAdmin` > 无防护（原始漏洞）。

---

## 0x04 参考资料

- 📖 [Prometheus 官方文档 - First Steps](https://prometheus.io/docs/introduction/first_steps/#required-for-focus)
