1. NoSQL注入攻击的本质与特殊性
当MongoDB这类文档型数据库开始流行时,许多开发者误以为NoSQL就意味着天然免疫注入攻击。直到2013年BlackHat大会上首次公开演示针对MongoDB的JSON注入技术,这个认知才被彻底打破。与传统SQL注入不同,NoSQL注入利用的是查询解析器的逻辑缺陷而非语句拼接漏洞。
以最常见的MongoDB查询为例:
javascript复制db.users.find({
username: req.body.username,
password: req.body.password
})
当攻击者提交{"$ne": null}作为密码值时,查询条件会变成password: {$ne: null},这意味着只要密码字段非空就能通过验证。这种攻击之所以有效,是因为服务器直接将用户输入反序列化为查询对象。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. NoSQL注入的五大攻击向量
2.1 操作符注入
攻击者通过注入$where、$ne等操作符改变查询逻辑。例如登录场景中注入:
json复制{
"username": "admin",
"password": {"$gt": ""}
}
这相当于SQL中的password != '',完全绕过密码验证。
2.2 正则表达式注入
利用$regex操作符进行模糊匹配攻击:
json复制{
"username": {"$regex": ".*"},
"password": {"$regex": ".*"}
}
这种注入会匹配数据库中的所有用户记录。
2.3 类型混淆攻击
JavaScript的弱类型特性可能引发意外行为。例如:
json复制{
"age": {"$gt": "10"} // 字符串比较而非数值比较
}
当开发者预期age是数字类型时,实际进行的却是字典序比较。
2.4 布尔盲注
通过响应差异判断查询结果:
json复制{
"username": "admin",
"password": {"$regex": "^a"}
}
逐个字符爆破密码,类似SQL盲注技术。
2.5 服务器端JS注入
当使用$where或mapReduce时可能执行恶意JS代码:
javascript复制db.collection.find({
$where: "function(){ return this.username == 'admin' && sleep(1000); }"
})
通过时间延迟实现带外通信。
3. 防御体系的四层纵深防护
3.1 输入验证层
- 使用JSON Schema严格校验输入数据结构
- 对关键字段实施白名单验证:
javascript复制const usernameSchema = {
type: 'string',
pattern: '^[a-zA-Z0-9_]{3,20}$'
};
3.2 查询构造层
- 优先使用ORM/ODM的safe方法:
typescript复制// 正确做法
UserModel.find({ username: sanitizedInput });
// 危险做法
const query = JSON.parse(userInput);
UserModel.find(query);
3.3 权限控制层
- 数据库用户遵循最小权限原则
- 禁用危险操作:
javascript复制// mongod.conf
security:
javascriptEnabled: false
3.4 运行时防护层
- 使用mongo-sanitize等库过滤输入:
javascript复制const sanitize = require('mongo-sanitize');
db.users.find({ name: sanitize(userInput) });
- 启用查询日志审计可疑模式
4. 实战检测方案
4.1 手工测试技巧
- 尝试提交数组破坏查询结构:
http复制POST /login
Content-Type: application/json
{
"username": ["admin", "test"],
"password": "123456"
}
观察是否返回多个用户记录
4.2 自动化工具链
- NoSQLi检测工具组合:
- 使用Burp Suite的NoSQLi插件进行模糊测试
- 配合OWASP ZAP的主动扫描规则
- 自定义Python检测脚本:
python复制payloads = [
{'$ne': 'x'},
{'$gt': ''},
{'$where': '1==1'}
]
4.3 监控指标
- 异常查询特征监测:
- 单个请求包含超过3个操作符
- 查询条件嵌套深度超过3层
$where或$function关键字出现
5. 企业级防护架构
5.1 流量清洗方案
mermaid复制graph TD
A[入口流量] --> B[API Gateway]
B --> C[参数过滤器]
C --> D[请求转换器]
D --> E[业务服务]
注意:实际部署时应使用硬件WAF与软件过滤的组合方案
5.2 安全编码规范
- 强制使用参数化查询:
javascript复制// MongoDB官方推荐方式
const query = {
status: 'A',
$or: [
{ qty: { $lt: 30 } },
{ item: new RegExp('^pattern') }
]
}
5.3 红蓝对抗演练
设计专门的NoSQL注入靶场场景:
- 用户信息泄露
- 权限提升
- 数据篡改
- DOS攻击
6. 新兴威胁与演进趋势
随着GraphQL、NewSQL等技术的普及,注入攻击呈现新特点:
- 混合注入攻击:同时利用SQL与NoSQL特性
graphql复制query {
users(filter: "{\"status\":{\"$ne\":\"disabled\"}}") {
id
name
}
}
- 云原生环境下的攻击:
- 针对Cosmos DB、DynamoDB的特有攻击方式
- 通过注入获取IAM凭证
- 硬件加速绕过:
- 利用MongoDB的查询引擎优化特性构造畸形查询
- 针对索引机制的侧信道攻击
防御策略需要持续演进,建议每季度更新一次防护规则库,重点关注数据库驱动程序的CVE公告。对于关键业务系统,应当部署行为分析引擎来检测异常查询模式。
