### 简要描述: cmseasy 管理端越权(删除 修改 添加 产品 和 订单) 不花钱你懂的 ### 详细说明: 看代码: manage_act.php: ``` function init() { $user=''; $guest = front::get('guest'); if($guest=='1'&&config::get('opguestadd')) { $user = 'Guest'; }else { if(cookie::get('login_username') &&cookie::get('login_password')) { $user=new user(); $user=$user->getrow(array('username'=>cookie::get('login_username'))); } } if(cookie::get('login_username') &&cookie::get('login_password')) { $guestuser=new user(); $guestuser=$guestuser->getrow(array('username'=>cookie::get('login_username'))); } $this->view->guestuser = $guestuser; if(!$user &&front::$act != 'login'&&front::$act != 'register') front::redirect(url::create('user/login')); $this->view->user=$user; $this->_user=new user; $this->table=front::get('manage'); if($this->table <>'archive'&&$this->table <>'orders') exit('PAGE NOT FOUND!'); $this->_table=new $this->table; $this->_table->getFields(); ``` 第一步 如果我们不是匿名用户的话 ``` if(cookie::get('login_username')...
### 简要描述: cmseasy 管理端越权(删除 修改 添加 产品 和 订单) 不花钱你懂的 ### 详细说明: 看代码: manage_act.php: ``` function init() { $user=''; $guest = front::get('guest'); if($guest=='1'&&config::get('opguestadd')) { $user = 'Guest'; }else { if(cookie::get('login_username') &&cookie::get('login_password')) { $user=new user(); $user=$user->getrow(array('username'=>cookie::get('login_username'))); } } if(cookie::get('login_username') &&cookie::get('login_password')) { $guestuser=new user(); $guestuser=$guestuser->getrow(array('username'=>cookie::get('login_username'))); } $this->view->guestuser = $guestuser; if(!$user &&front::$act != 'login'&&front::$act != 'register') front::redirect(url::create('user/login')); $this->view->user=$user; $this->_user=new user; $this->table=front::get('manage'); if($this->table <>'archive'&&$this->table <>'orders') exit('PAGE NOT FOUND!'); $this->_table=new $this->table; $this->_table->getFields(); ``` 第一步 如果我们不是匿名用户的话 ``` if(cookie::get('login_username') &&cookie::get('login_password')) { $user=new user(); $user=$user->getrow(array('username'=>cookie::get('login_username'))); } ``` 就会走到这里 看到问题了吧 cookie::get('login_password') 没有做任何参与运算的东西 直接拿到user 第二步: 我们修改cookie:login_username=admin; 我们打印一下 当前用户是什么: [<img src="https://images.seebug.org/upload/201501/28135002c0d2f787fda6ccb39c588b548af0e753.png" alt="64.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201501/28135002c0d2f787fda6ccb39c588b548af0e753.png) 看到没有超级管理员用户 下来我们看看能干什么: case=manage&act=add&manage=archive 如果是这样的 那么archive的东西都能操作 比如list_action,add_action,edit_action,delete_action 都可以操作 case=manage&act=add&manage=orders 如果是这样的 那么也可以执行 list_action,add_action,edit_action,delete_action 当然是订单表的东西了 我们看看; ``` function edit_action() { $from=session::get('from'); front::check_type(front::get('id')); if(front::post('submit') &&$this->manage->vaild()) { $this->manage->filter(); $info=$this->_table->getrow(front::get('id')); if($info['userid'] != $this->view->user['userid'] ) { front::flash('记录修改失败!(原因:未经授权!)'); header("Location: ".$from,TRUE,302); exit; } if($info['checked']) { front::flash('记录修改失败!(原因:已通过审核!)'); header("Location: ".$from,TRUE,302); exit; } $this->manage->save_before(); $data=array(); $fieldlimit=$this->_table->getcols(front::$act=='list'?'user_manage':'user_modify'); $fieldlimits=explode(',',$fieldlimit); foreach(front::$post as $key=>$value) { if(preg_match('/(select|union|and|\'|"|\))/i',$value)){ exit('非法参数'); } if(in_array($key,$fieldlimits)) $data[$key]=$value; } $update=$this->_table->rec_update($data,front::get('id')); ``` 这里来自post的所有东西并且key 没有做unset操作 且现在具有权限了,那么我就可以任意修改订单的状态 证明,略去,只要证明目前的所有操作是在超级管理员底下即可 ### 漏洞证明: