靶场科普 | MongoDB数据库注入

靶场科普 | MongoDB数据库注入
最新回答
黑羊先生

2021-05-11 01:21:31

MongoDB数据库注入是一种针对MongoDB非关系型数据库的攻击方式,攻击者可通过构造特殊输入来篡改查询逻辑,进而实现未授权访问、数据泄露或数据篡改等恶意操作。 以下从MongoDB基础概念、常见注入场景及防御措施三方面展开科普:

一、MongoDB基础概念
  1. 数据库类型MongoDB是非关系型数据库(NoSQL),采用文档型存储结构,数据以键值对(key-value)形式组织,支持嵌套文档和数组类型。其设计目标是提供高扩展性和高性能的数据存储方案,尤其适合Web应用场景。

  2. 核心术语

    文档(Document):MongoDB的基本数据单元,以BSON(二进制JSON)格式存储,例如:

    { "name": "Alice", "age": 25, "hobbies": ["reading", "hiking"] }

    集合(Collection):文档的容器,类似关系型数据库中的“表”,但无需预先定义结构。

    数据库(Database):集合的容器,MongoDB实例可包含多个数据库。

  3. 默认数据库

    admin:权限管理的“根数据库”,用户添加至此将继承所有数据库权限,且仅在此库可执行服务器管理命令(如关闭服务器)。

    local:存储本地单台服务器专用数据,内容不会被复制到其他节点。

    config:分片集群中用于存储分片配置信息的内部数据库。

图:MongoDB核心概念关系图二、MongoDB注入攻击原理与场景
  1. 攻击原理MongoDB查询通常通过驱动程序或直接构造BSON/JSON实现。若应用未对用户输入进行严格过滤或参数化处理,攻击者可插入恶意操作符(如$where、$regex)或修改查询逻辑,导致:

    数据泄露:通过条件构造绕过权限检查,读取敏感数据。

    数据篡改:利用$set等操作符修改文档内容。

    拒绝服务:构造复杂查询消耗服务器资源。

  2. 常见注入场景

    查询操作符注入攻击者通过插入$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" } } }]);
三、防御措施
  1. 输入验证与过滤

    严格限制用户输入类型(如仅允许数字、字母),拒绝包含特殊字符(如$、{、})的输入。

    使用白名单机制,仅允许预期的查询操作符。

  2. 参数化查询

    使用MongoDB官方驱动程序的参数化查询功能,避免直接拼接用户输入。例如:

    // Node.js驱动示例:使用$eq操作符固定比较方式const userInput = "25";db.collection.find({ age: { $eq: parseInt(userInput) } });
  3. 最小权限原则

    为应用账户分配仅必要的数据库权限,避免使用root或admin数据库的高权限账户。

    限制local和config数据库的访问权限。

  4. 网络隔离与加密

    将MongoDB部署在内网环境,通过防火墙限制外部访问。

    启用TLS/SSL加密传输数据,防止中间人攻击。

  5. 日志监控与审计

    记录所有数据库操作日志,定期分析异常查询(如频繁的$where或聚合操作)。

    使用工具(如MongoDB Atlas的审计日志功能)实时监控可疑行为。

四、实验建议(基于靶场场景)
  1. 实验目标

    掌握MongoDB注入的常见手法(如操作符注入、JavaScript注入)。

    学习通过注入获取数据库信息(如列名、文档内容)的方法。

  2. 实验步骤示例

    步骤1:识别注入点(如URL参数、表单输入)。

    步骤2:构造恶意输入(如?username=admin&age[$gt]=0)。

    步骤3:观察响应差异,确认注入可行性。

    步骤4:利用注入点提取数据(如通过$regex枚举用户名)。

  3. 注意事项

    实验环境需与生产环境隔离,避免数据泄露风险。

    实验后及时清理测试数据,恢复数据库原始状态。

通过理解MongoDB的存储机制和查询逻辑,结合严格的输入控制与权限管理,可有效降低注入攻击风险。建议结合靶场实践加深对攻击手法与防御策略的理解。