Author:Yaseng
Team:CodePlay
对于cmseasy这样 比较成熟 用户量大的cms 普通的 sql injection xss 已然被人搞烂
发现管理和前台普通用户在一个表 就可以干很多猥琐之事了 额 先看代码吧
注册 用户 此时的代码为
文件: user_act.php
function edit_action() { if(front::post('submit')) { $this->_user->rec_update(front::$post,'userid='.$this->view->user['userid']); front::flash(lang('修改资料成功!')); front::redirect(url::create('user/index')); } $this->view->data=$this->view->user; }
继续跟踪rec_update函数
function rec_update($row,$where) { $tbname=$this->name; $sql=$this->sql_update($tbname,$row,$where); return $this->query_unbuffered($sql); }
向下sql_update($tbname,$row,$where) ( 漏洞函数 )
function sql_update($tbname,$row,$where) { $sqlud=''; if (is_string($row)) $sqlud=$row.' '; else foreach ($row as $key=>$value) { if (in_array($key,explode(',',$this->getcolslist()))) { $value=addslashes($value); if (preg_match('/^\[(.*)\]$/',$value,$match)) $sqlud .= "`$key`"."= ".$match[1].","; elseif ($value === "") $sqlud .= "`$key`= NULL, "; else $sqlud .= "`$key`"."= '".$value."',"; } } $sqlud=rtrim($sqlud); $sqlud=rtrim($sqlud,','); $this->condition($where); $sql="UPDATE `".$tbname."` SET ".$sqlud." WHERE ".$where; return $sql; }
循环遍历 POST 值 对用户提交的表单直接更新 没有任何判断
导致权限提升 可以直接进后台 getShell
具体利用
测试站点 http://demo.cmseasy.cn/99/ (官方演示站)
注册用户
修改资料
使用firefox 的 tamper 添加字段 groupid
更新之后 权限提升为管理员 网站后面加admin
修改配置 getShell
附 官方补丁分析
5 -16 看了一下官方补丁
官方只是吧,用户编辑资料时传入的 groupid 给删了,而没去修复,真正的罪恶之源 table.php 普通用户和 管理员还在一个表 很明显是治标不治本的 各位同仁有性趣去突破下吧
CodePlay 代码审计 交流群 209547366 (共同进步)