NoSQL注入攻击原理与防御详解
字数 1009 2025-11-26 00:27:23
NoSQL注入攻击原理与防御详解
1. 题目描述
NoSQL注入是一种针对非关系型数据库(如MongoDB、Redis、Cassandra)的攻击技术,通过操纵应用程序的输入数据,绕过预期查询逻辑,导致未授权数据访问或篡改。与传统SQL注入不同,NoSQL注入利用的是特定查询语法(如JSON/BSON格式)的解析漏洞,常见于现代Web应用和API中。
2. NoSQL数据库与查询特性
- NoSQL类型:文档型(MongoDB)、键值型(Redis)、列存储(Cassandra)等。
- 查询示例:MongoDB使用BSON(类JSON)格式,如
db.users.find({username: "admin", password: "123"})。 - 漏洞根源:应用程序未对用户输入进行严格类型检查或过滤,直接拼接查询语句。
3. 攻击原理与场景分析
场景:登录功能使用MongoDB验证用户,代码直接拼接用户输入:
db.users.find({
username: req.body.username,
password: req.body.password
})
攻击步骤:
- 探测漏洞:提交非常规输入(如数组、运算符),观察响应差异。例如,将密码字段改为
{"$ne": ""}:{"username": "admin", "password": {"$ne": ""}} - 利用运算符:
$ne(不等于):绕过密码验证,匹配所有非空密码。$regex(正则表达式):逐字符提取数据(类似SQL盲注)。$where:注入JavaScript代码执行任意逻辑。
- 结果:攻击者可能以管理员身份登录,或提取整个用户表数据。
4. 进阶攻击技巧
- 联合注入:通过嵌套查询访问其他集合(如
$lookup运算符)。 - 时序盲注:利用
$where中的延时函数(如sleep())判断查询真假。 - ORM/ODM漏洞:若应用使用Mongoose等库,不当配置可能允许运算符注入。
5. 防御措施
- 输入验证与类型强制:确保输入为预期类型(如字符串而非对象)。示例:
const username = String(req.body.username); // 强制转换为字符串 - 参数化查询:使用数据库驱动提供的安全方法(如MongoDB的
$eq运算符):db.users.find({username: {$eq: req.body.username}}); - 最小权限原则:数据库用户仅授予必要权限,避免读写敏感集合。
- 禁用危险功能:在生产环境关闭
$where等动态代码执行功能。 - 日志与监控:记录异常查询模式,实时检测注入行为。
6. 总结
NoSQL注入通过滥用数据库的灵活查询语法实现攻击,防御需结合严格输入验证、参数化查询和权限控制。开发人员应避免直接拼接用户输入到查询中,并定期进行安全审计。