另类漏洞挖掘 cmseasy 权限提升 & getShell 通杀漏洞
Author:Yaseng**〖www.yaseng.me**〗 Team: HighSky〖www.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 (共同进步)