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
})

攻击步骤

  1. 探测漏洞:提交非常规输入(如数组、运算符),观察响应差异。例如,将密码字段改为 {"$ne": ""}
    {"username": "admin", "password": {"$ne": ""}}
    
  2. 利用运算符
    • $ne(不等于):绕过密码验证,匹配所有非空密码。
    • $regex(正则表达式):逐字符提取数据(类似SQL盲注)。
    • $where:注入JavaScript代码执行任意逻辑。
  3. 结果:攻击者可能以管理员身份登录,或提取整个用户表数据。

4. 进阶攻击技巧

  • 联合注入:通过嵌套查询访问其他集合(如 $lookup 运算符)。
  • 时序盲注:利用 $where 中的延时函数(如 sleep())判断查询真假。
  • ORM/ODM漏洞:若应用使用Mongoose等库,不当配置可能允许运算符注入。

5. 防御措施

  1. 输入验证与类型强制:确保输入为预期类型(如字符串而非对象)。示例:
    const username = String(req.body.username); // 强制转换为字符串
    
  2. 参数化查询:使用数据库驱动提供的安全方法(如MongoDB的 $eq 运算符):
    db.users.find({username: {$eq: req.body.username}});
    
  3. 最小权限原则:数据库用户仅授予必要权限,避免读写敏感集合。
  4. 禁用危险功能:在生产环境关闭 $where 等动态代码执行功能。
  5. 日志与监控:记录异常查询模式,实时检测注入行为。

6. 总结
NoSQL注入通过滥用数据库的灵活查询语法实现攻击,防御需结合严格输入验证、参数化查询和权限控制。开发人员应避免直接拼接用户输入到查询中,并定期进行安全审计。

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验证用户,代码直接拼接用户输入: 攻击步骤 : 探测漏洞 :提交非常规输入(如数组、运算符),观察响应差异。例如,将密码字段改为 {"$ne": ""} : 利用运算符 : $ne (不等于):绕过密码验证,匹配所有非空密码。 $regex (正则表达式):逐字符提取数据(类似SQL盲注)。 $where :注入JavaScript代码执行任意逻辑。 结果 :攻击者可能以管理员身份登录,或提取整个用户表数据。 4. 进阶攻击技巧 联合注入 :通过嵌套查询访问其他集合(如 $lookup 运算符)。 时序盲注 :利用 $where 中的延时函数(如 sleep() )判断查询真假。 ORM/ODM漏洞 :若应用使用Mongoose等库,不当配置可能允许运算符注入。 5. 防御措施 输入验证与类型强制 :确保输入为预期类型(如字符串而非对象)。示例: 参数化查询 :使用数据库驱动提供的安全方法(如MongoDB的 $eq 运算符): 最小权限原则 :数据库用户仅授予必要权限,避免读写敏感集合。 禁用危险功能 :在生产环境关闭 $where 等动态代码执行功能。 日志与监控 :记录异常查询模式,实时检测注入行为。 6. 总结 NoSQL注入通过滥用数据库的灵活查询语法实现攻击,防御需结合严格输入验证、参数化查询和权限控制。开发人员应避免直接拼接用户输入到查询中,并定期进行安全审计。