应用安全系列之四十七:NoSQL注入
1、NoSQL注入简介
NoSQL 注入是一种针对非关系型数据库(如 MongoDB、Cassandra、Redis)的安全攻击手段,攻击者通过构造恶意输入,绕过应用程序的输入验证,篡改数据库查询逻辑,从而窃取数据、破坏数据或执行未授权操作。与传统 SQL 注入不同,NoSQL 注入利用的是 NoSQL 数据库的查询语法特性(如 JSON/BSON 结构、操作符等)。
NoSQL 注入通常与查询操作相关联,而不是直接与插入操作相关。然而,在特定情况下,如果应用程序在执行插入操作时未正确处理用户输入,并且该输入被用于构造后续的查询或其他动态操作,则可能存在注入风险。 因此,建议在进行插入操作时,也建议对输入进行验证,以防有威胁的字符串被插入到数据库。
2、NoSQL 注入的发生机制
NoSQL 注入通常发生在应用程序将用户输入直接拼接到查询语句中,而没有进行适当的验证或转义。攻击者可以构造特定的输入来修改查询逻辑,如改变查询条件、添加新的查询条件或执行其他数据库操作。主要由以下几种情况:
- 输入拼接漏洞:应用程序直接将用户输入拼接到 NoSQL 查询语句中,未对输入进行过滤或转义。
- 操作符滥用:NoSQL 查询中广泛使用操作符(如
$eq
,$ne
,$gt
,$where
等),攻击者可通过注入操作符改变查询逻辑。 - 类型混淆:NoSQL 数据库(如 MongoDB)的弱类型特性可能导致输入被解析为操作符而非普通字符串。
3、NoSQL注入的危害
3.1、未授权数据访问(数据泄露)
- 攻击方式
通过注入操作符(如 $ne
, $regex
)绕过查询条件,直接访问敏感数据。
// 示例:绕过密码验证,获取管理员账户信息
{"username": "admin","password": { "$exists": true } // 条件变为“密码存在即可”
}
- 危害
- 窃取用户隐私(如密码、手机号)。
-
泄露商业机密(如订单数据、客户信息)。
-
违反 GDPR 等数据保护法规,导致法律风险。
3.2、权限提升
- 攻击方式
篡改查询逻辑,将普通用户权限提升至管理员。
// 示例:通过 $or 注入添加管理员权限条件
{"username": "user123","$or": [{ "role": "admin" }] // 强制查询角色为 admin 的记录
}
- 危害
- 攻击者以管理员身份执行高危操作(如删除数据、修改配置)。
-
横向渗透内网其他系统。
3.3、数据篡改或删除
- 攻击方式
注入更新或删除操作符(如 $set
, $unset
),破坏数据完整性。
// 示例:篡改商品价格为 0
{"product_id": "123","$set": { "price": 0 } // 注入更新操作
}
- 危害
- 业务数据被恶意修改(如订单金额、库存数量)。
-
关键数据丢失导致系统功能异常。
3.4、服务拒绝(DoS)
- 攻击方式
注入复杂查询或递归操作,耗尽数据库资源。
// 示例:通过 $where 注入死循环
{"$where": "function() { while(true) {} }" // 触发无限循环,拖慢数据库
}
- 危害
- 数据库 CPU/内存耗尽,服务响应缓慢或崩溃。
-
业务中断导致直接经济损失。
3.5、服务拒绝(DoS)
- 攻击方式
在支持执行代码的查询(如 MongoDB 的 $where
)中注入恶意逻辑。
// 示例:通过 $where 执行系统命令(需数据库配置不当)
{"$where": "function() { return require('child_process').exec('rm -rf /') }"
}
- 危害
- 服务器被完全控制,攻击者可删除文件、安装后门。
-
内网横向攻击其他服务器。
3.6、逻辑绕过(业务欺诈)
- 攻击方式
篡改业务逻辑判断条件(如优惠券核销、投票系统)。
// 示例:绕过“单用户仅能投票一次”的限制
{"user_id": "attacker","voted": { "$ne": true } // 条件变为“用户未投票过”
}
- 危害
- 刷票、薅羊毛(如无限领取优惠券)。
-
破坏业务公平性,影响品牌声誉。
4、NoSQL注入的预防
-
输入过滤:禁止用户输入包含 $、. 等操作符。
-
转义用户输入:对用户输入进行严格的验证,确保其符合预期的格式和类型。同时,对输入进行适当的转义,以防止恶意代码被执行。
- 参数化查询:使用数据库驱动的安全 API(如 MongoDB 的 findOne({ username: sanitizedInput }))。
- 最小权限:数据库账户仅授予必要权限,禁用高危操作(如 db.eval())。
- 使用静态代码扫描工具,及时发现问题解决问题。
- 安全审计:定期扫描 NoSQL 查询代码,使用工具在实际环境上检测注入漏洞。