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 (共同进步)
文章来源于lcx.cc:易通企业网站系统(cmseasy) 权限提升 & getShell通杀漏洞
PHP单引号与双引号的区别: 单引号和双引号的唯一的区别就是: 用单引号包起来的PHP解释器不会对其二次解释,而双引号却要二次解释, 看代码: 这样我们知道了单引号与双引号的区别,但是这样会带来一个安全漏洞 确实执行了,那么这就说明.直接赋值的字符串变量尽量用…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论