另类漏洞挖掘 cmseasy 权限提升 & getShell 通杀漏洞

Author:Yaseng**www.yaseng.me**〗 Team: HighSkywww.uauc.net

对于cmseasy这样 比较成熟 用户量大的cms 普通的 sql injection xss 已然被人搞烂 ….

发现管理和前台普通用户在一个表 就可以干很多猥琐之事了 额 先看代码吧

注册 用户 此时的代码为
文件: user_act.php

1
2
3
4
5
6
7
8
   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函数

1
2
3
4
5
6
7

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) ( 漏洞函数 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 (共同进步)