【juice-shop】★★★★ NoSQL DoS:通过 NoSQL 注入让服务器休眠
0x01 任务简报
🎯 挑战目标让服务器休眠一段时间。(它为您做了足够多的艰苦工作)
💡 官方提示 (Hints)1. 这个挑战本质上是一种简化的拒绝服务(DoS)攻击。
2. 如架构概述所述,OWASP Juice Shop 使用 MongoDB 的衍生版本作为其 NoSQL 数据库。
3. 将此挑战归类为 NoSQL 注入类别,完全暴露了预期的攻击途径。尝试其他方法都无法解决该挑战,即使可能产生相同结果。
4. 尤其需要注意的是,向应用程序发送海量请求并不能解决这个问题。这很可能只会导致服务器实例崩溃。
0x02 前置知识
NoSQL 注入 vs SQL 注入
| 特性 | SQL 注入 | NoSQL 注入 |
|---|---|---|
| 目标数据库 | MySQL、SQLite 等 | MongoDB、CouchDB 等 |
| 注入语法 | SQL 语句 | JavaScript 表达式 |
| 常见函数 | SLEEP()、BENCHMARK() |
sleep()、Date.now() |
| 注释符 | --、# |
//、/* */ |
MongoDB 的 sleep() 函数
MongoDB 支持在查询中执行 JavaScript 代码,其中 sleep() 函数可以让数据库暂停执行:
|
|
危险性:
- 攻击者可以通过注入
sleep()让服务器无响应 - 大量并发的 sleep 请求会导致服务器资源耗尽
- 这是一种简化版的拒绝服务(DoS)攻击
0x03 实战:复现漏洞
步骤1:发现注入点
使用 Burp Suite 抓包,打开应用首页并访问任意商品详情页面,在 HTTP 历史记录中找到商品评论接口:
|
|
关键发现: URL 中的数字 1 是商品 ID,这是一个潜在的注入点。
将该请求发送到 Burp Suite Repeater。

步骤2:测试注入点
测试1:输入极高数值
|
|
结果: 返回空数组,状态码 200 ✅
测试2:输入单引号
|
|
结果: 返回错误,状态码 500 ❌
测试3:输入双引号
|
|
结果: 返回错误,状态码 500 ❌

结论: 该接口存在 NoSQL 注入漏洞,用户输入被直接拼接到数据库查询中。
步骤3:构造 sleep() Payload
根据题目要求,将商品 ID 替换为 sleep(2000) 函数:
|
|
发送请求:

结果:
- 服务器延迟 2000 毫秒(2 秒)后才返回响应
- 挑战完成!🎉