2021-05-11 01:21:31
MongoDB数据库注入是一种针对MongoDB非关系型数据库的攻击方式,攻击者可通过构造特殊输入来篡改查询逻辑,进而实现未授权访问、数据泄露或数据篡改等恶意操作。 以下从MongoDB基础概念、常见注入场景及防御措施三方面展开科普:
一、MongoDB基础概念数据库类型MongoDB是非关系型数据库(NoSQL),采用文档型存储结构,数据以键值对(key-value)形式组织,支持嵌套文档和数组类型。其设计目标是提供高扩展性和高性能的数据存储方案,尤其适合Web应用场景。
核心术语
文档(Document):MongoDB的基本数据单元,以BSON(二进制JSON)格式存储,例如:
{ "name": "Alice", "age": 25, "hobbies": ["reading", "hiking"] }集合(Collection):文档的容器,类似关系型数据库中的“表”,但无需预先定义结构。
数据库(Database):集合的容器,MongoDB实例可包含多个数据库。
默认数据库
admin:权限管理的“根数据库”,用户添加至此将继承所有数据库权限,且仅在此库可执行服务器管理命令(如关闭服务器)。
local:存储本地单台服务器专用数据,内容不会被复制到其他节点。
config:分片集群中用于存储分片配置信息的内部数据库。

攻击原理MongoDB查询通常通过驱动程序或直接构造BSON/JSON实现。若应用未对用户输入进行严格过滤或参数化处理,攻击者可插入恶意操作符(如$where、$regex)或修改查询逻辑,导致:
数据泄露:通过条件构造绕过权限检查,读取敏感数据。
数据篡改:利用$set等操作符修改文档内容。
拒绝服务:构造复杂查询消耗服务器资源。
常见注入场景
查询操作符注入攻击者通过插入$gt(大于)、$lt(小于)等操作符改变查询条件。例如:
// 正常查询:查找age=25的用户db.users.find({ age: 25 });// 注入后:查找age>20的所有用户db.users.find({ age: { "$gt": 20 } });JavaScript表达式注入使用$where执行任意JavaScript代码,例如:
// 注入后:通过JavaScript条件绕过限制db.users.find({ "$where": "this.password == '' || 1==1" });正则表达式注入通过$regex进行模糊匹配,可能导致信息泄露或遍历数据库:
// 注入后:匹配所有用户名以"admin"开头的文档db.users.find({ username: { "$regex": "^admin" } });聚合框架注入在聚合管道(Aggregation Pipeline)中插入恶意阶段(Stage),例如:
// 注入后:通过$group统计所有用户信息db.users.aggregate([ { "$group": { "_id": null, "allData": { "$push": "$$ROOT" } } }]);输入验证与过滤
严格限制用户输入类型(如仅允许数字、字母),拒绝包含特殊字符(如$、{、})的输入。
使用白名单机制,仅允许预期的查询操作符。
参数化查询
使用MongoDB官方驱动程序的参数化查询功能,避免直接拼接用户输入。例如:
// Node.js驱动示例:使用$eq操作符固定比较方式const userInput = "25";db.collection.find({ age: { $eq: parseInt(userInput) } });最小权限原则
为应用账户分配仅必要的数据库权限,避免使用root或admin数据库的高权限账户。
限制local和config数据库的访问权限。
网络隔离与加密
将MongoDB部署在内网环境,通过防火墙限制外部访问。
启用TLS/SSL加密传输数据,防止中间人攻击。
日志监控与审计
记录所有数据库操作日志,定期分析异常查询(如频繁的$where或聚合操作)。
使用工具(如MongoDB Atlas的审计日志功能)实时监控可疑行为。
实验目标
掌握MongoDB注入的常见手法(如操作符注入、JavaScript注入)。
学习通过注入获取数据库信息(如列名、文档内容)的方法。
实验步骤示例
步骤1:识别注入点(如URL参数、表单输入)。
步骤2:构造恶意输入(如?username=admin&age[$gt]=0)。
步骤3:观察响应差异,确认注入可行性。
步骤4:利用注入点提取数据(如通过$regex枚举用户名)。
注意事项
实验环境需与生产环境隔离,避免数据泄露风险。
实验后及时清理测试数据,恢复数据库原始状态。
通过理解MongoDB的存储机制和查询逻辑,结合严格的输入控制与权限管理,可有效降低注入攻击风险。建议结合靶场实践加深对攻击手法与防御策略的理解。