NoSQL注入攻击原理与防御详解
字数 1099 2025-11-10 22:52:06

NoSQL注入攻击原理与防御详解

1. 知识描述
NoSQL注入是一种针对非关系型数据库(如MongoDB、Redis、Cassandra等)的注入攻击。与传统的SQL注入不同,NoSQL注入利用的是应用程序对用户输入的不安全处理,通过篡改查询语法或操作符(如JSON、BSON格式的查询)来绕过认证、泄露数据或执行未授权操作。常见场景包括登录绕过、数据提取或破坏数据库完整性。


2. 攻击原理
NoSQL数据库的查询通常直接嵌入代码(如JavaScript对象或JSON),且无需严格的语法检查。例如,MongoDB使用find({“user”: “admin”, “pass”: “123”})进行查询。若应用程序直接将用户输入拼接到查询中,攻击者可通过构造特殊输入改变查询逻辑:

  • 示例漏洞代码(Node.js + MongoDB):
    const user = req.body.user; // 用户输入直接传入查询
    const pass = req.body.pass;
    db.users.find({user: user, pass: pass});
    
  • 攻击手法
    若攻击者在user字段输入{"$ne": null},在pass字段输入{"$ne": null},查询变为:
    db.users.find({user: {"$ne": null}, pass: {"$ne": null}});
    
    此查询会匹配所有userpass字段非空的文档,从而绕过登录验证。

3. 常见攻击类型

  • 运算符注入:利用NoSQL的查询运算符(如$ne$gt$regex)篡改条件。
  • JavaScript注入:部分NoSQL数据库(如MongoDB)支持执行JavaScript代码,若用户输入被传入$where条件,可能导致代码执行。
  • 数组注入:通过输入数组(如["admin", "guest"])绕过字段匹配。
  • ORM注入:若ORM框架(如Mongoose)未安全配置,可能将用户输入解析为操作符。

4. 防御措施

  • 输入验证与过滤
    • 使用白名单机制校验输入格式(如仅允许字母数字)。
    • 禁止用户输入包含操作符(如${})。
  • 参数化查询
    • 避免拼接查询,使用数据库驱动提供的安全方法(如MongoDB的$eq运算符或ORM的转义功能)。
    // 安全示例:使用显式条件
    db.users.find({user: {$eq: user}, pass: {$eq: pass}});
    
  • 最小权限原则
    • 数据库用户应仅拥有必要权限(如禁止执行JavaScript)。
  • 启用安全配置
    • 禁用MongoDB的服务器端脚本(如mongod --noscripting)。
  • 日志与监控
    • 记录异常查询模式(如频繁使用$ne),结合WAF检测攻击行为。

5. 总结
NoSQL注入的核心风险在于开发者误以为“NoSQL无需担心注入”。实际上,只要用户输入直接参与查询逻辑,就可能被恶意利用。防御需结合严格输入校验、安全API使用和权限控制,同时定期进行安全测试(如工具NoSQLMap)验证漏洞。

NoSQL注入攻击原理与防御详解 1. 知识描述 NoSQL注入是一种针对非关系型数据库(如MongoDB、Redis、Cassandra等)的注入攻击。与传统的SQL注入不同,NoSQL注入利用的是应用程序对用户输入的不安全处理,通过篡改查询语法或操作符(如JSON、BSON格式的查询)来绕过认证、泄露数据或执行未授权操作。常见场景包括登录绕过、数据提取或破坏数据库完整性。 2. 攻击原理 NoSQL数据库的查询通常直接嵌入代码(如JavaScript对象或JSON),且无需严格的语法检查。例如,MongoDB使用 find({“user”: “admin”, “pass”: “123”}) 进行查询。若应用程序直接将用户输入拼接到查询中,攻击者可通过构造特殊输入改变查询逻辑: 示例漏洞代码 (Node.js + MongoDB): 攻击手法 : 若攻击者在 user 字段输入 {"$ne": null} ,在 pass 字段输入 {"$ne": null} ,查询变为: 此查询会匹配所有 user 和 pass 字段非空的文档,从而绕过登录验证。 3. 常见攻击类型 运算符注入 :利用NoSQL的查询运算符(如 $ne 、 $gt 、 $regex )篡改条件。 JavaScript注入 :部分NoSQL数据库(如MongoDB)支持执行JavaScript代码,若用户输入被传入 $where 条件,可能导致代码执行。 数组注入 :通过输入数组(如 ["admin", "guest"] )绕过字段匹配。 ORM注入 :若ORM框架(如Mongoose)未安全配置,可能将用户输入解析为操作符。 4. 防御措施 输入验证与过滤 : 使用白名单机制校验输入格式(如仅允许字母数字)。 禁止用户输入包含操作符(如 $ 、 { 、 } )。 参数化查询 : 避免拼接查询,使用数据库驱动提供的安全方法(如MongoDB的 $eq 运算符或ORM的转义功能)。 最小权限原则 : 数据库用户应仅拥有必要权限(如禁止执行JavaScript)。 启用安全配置 : 禁用MongoDB的服务器端脚本(如 mongod --noscripting )。 日志与监控 : 记录异常查询模式(如频繁使用 $ne ),结合WAF检测攻击行为。 5. 总结 NoSQL注入的核心风险在于开发者误以为“NoSQL无需担心注入”。实际上,只要用户输入直接参与查询逻辑,就可能被恶意利用。防御需结合严格输入校验、安全API使用和权限控制,同时定期进行安全测试(如工具NoSQLMap)验证漏洞。