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}});user和pass字段非空的文档,从而绕过登录验证。
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}}); - 避免拼接查询,使用数据库驱动提供的安全方法(如MongoDB的
- 最小权限原则:
- 数据库用户应仅拥有必要权限(如禁止执行JavaScript)。
- 启用安全配置:
- 禁用MongoDB的服务器端脚本(如
mongod --noscripting)。
- 禁用MongoDB的服务器端脚本(如
- 日志与监控:
- 记录异常查询模式(如频繁使用
$ne),结合WAF检测攻击行为。
- 记录异常查询模式(如频繁使用
5. 总结
NoSQL注入的核心风险在于开发者误以为“NoSQL无需担心注入”。实际上,只要用户输入直接参与查询逻辑,就可能被恶意利用。防御需结合严格输入校验、安全API使用和权限控制,同时定期进行安全测试(如工具NoSQLMap)验证漏洞。