### 简要描述: KingCms最新版越权大礼包 ### 详细说明: 朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9,官网下下来学习一下。 在wooyun看到了几个漏洞,如:http://wooyun.org/bugs/wooyun-2010-043520 这里的越权大礼包包括删除网站所有会员、重置所有会员密码、修改所有会员用户名。 0x00:先来看看获得相关权限的绕过方法吧 Kingcms使用 $u=new user; $u->auth_role('XXX'); 来验证用户是否具有XXX的权限,关键是user类。 /user/user.class.php,user的构造方法如下 ``` public function __construct(){ $cookie=kc_cookie('userauth'); $cookiePass=substr($cookie,0,32); $ischeck=true; $GLOBALS['db']=new db; $GLOBALS['str']=new str; $GLOBALS['cache']=new cache; global $db,$str; if(empty($cookie) && !empty($_GET['jsoncallback']) && !empty($_GET['USERID']) && !empty($_GET['SIGN'])){//第1处注释:这里很容易使条件成立,执行下面的if语句 $get_userid=$_GET['USERID']; $get_sign=$_GET['SIGN']; $sign=md5($get_userid.SITEURL.kc_config('system.salt')); $userid = $sign==$get_sign ? $get_userid : 0;//第2处注释:这里是唯一的一次简单验证 $ischeck=false; //第3处注释:在下面第4处注释处会用到 }else{ $userid=substr($cookie,32); } if(!kc_validate($userid,2)) $userid=0; if(empty($userid)){...
### 简要描述: KingCms最新版越权大礼包 ### 详细说明: 朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9,官网下下来学习一下。 在wooyun看到了几个漏洞,如:http://wooyun.org/bugs/wooyun-2010-043520 这里的越权大礼包包括删除网站所有会员、重置所有会员密码、修改所有会员用户名。 0x00:先来看看获得相关权限的绕过方法吧 Kingcms使用 $u=new user; $u->auth_role('XXX'); 来验证用户是否具有XXX的权限,关键是user类。 /user/user.class.php,user的构造方法如下 ``` public function __construct(){ $cookie=kc_cookie('userauth'); $cookiePass=substr($cookie,0,32); $ischeck=true; $GLOBALS['db']=new db; $GLOBALS['str']=new str; $GLOBALS['cache']=new cache; global $db,$str; if(empty($cookie) && !empty($_GET['jsoncallback']) && !empty($_GET['USERID']) && !empty($_GET['SIGN'])){//第1处注释:这里很容易使条件成立,执行下面的if语句 $get_userid=$_GET['USERID']; $get_sign=$_GET['SIGN']; $sign=md5($get_userid.SITEURL.kc_config('system.salt')); $userid = $sign==$get_sign ? $get_userid : 0;//第2处注释:这里是唯一的一次简单验证 $ischeck=false; //第3处注释:在下面第4处注释处会用到 }else{ $userid=substr($cookie,32); } if(!kc_validate($userid,2)) $userid=0; if(empty($userid)){ $user=array('userpass'=>'x'); }else{ $user=$db->getRows_one('%s_user','*','userid='.$userid); if(empty($user)) $user=array('userpass'=>'x'); } //用户已登录 if (md5($user['userpass'])==$cookiePass || $ischeck==false) {//第4处注释 无关代码 ``` 上面代码的第二处注释的地方,要获得需要操作的userid,要计量$sign=md5($get_userid.SITEURL.kc_config('system.salt'));其中的参数$get_userid是用户输入,SITEURL是当前域名,不包含www等二级域名,[小写],kc_config('system.salt')是系统默认的,定值。这样,这里就可以绕过了。使得$ischeck=false。 在第4处注释处,因为$ischeck=false,所以,用户已登陆,USERID输入10000(kingcms系统的超级管理员id),就获得了管理员的所有权限了。 0x01:下面看看如何删除所有会员 /user/manage.php ``` /** * 删除会员 */ function _delete(){ $u=new user;$u->auth_role('admin'); $userid=kc_post('userid',2,1); if($u->info['userid']==$userid) kc_tip('不能删除自己!'); $db=new db; $db->delete('%s_user','userid='.$userid); kc_log(array('userid'=>$u->info['userid'],'app'=>'user','action'=>'USER_DELETE','cid'=>$userid)); kc_tip('删除成功!','ok','refresh'); } ``` 控制userid,从10001开始,步进为1,遍历就可以把所有会员全部删除了。 过程见下图 [<img src="https://images.seebug.org/upload/201503/090048418551f12de53b5f4eaf0289e4306b6b29.jpg" alt="删除会员副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/090048418551f12de53b5f4eaf0289e4306b6b29.jpg) 0x02:下面看看如何重置所有会员密码 /user/manage.php ``` function _resetpass(){ $u=new user;$u->auth_role('admin'); $userid=kc_post('userid',2,1); if($userid==$u->info['userid']) kc_tip('要修改自己的密码,请点击“修改密码”!'); $str=new str; $pwd=$str->random(10); $db=new db; $db->update('%s_user',array('userpass'=>md5($pwd)),'userid='.$userid); kc_log(array('userid'=>$u->info['userid'],'app'=>'user','action'=>'USER_RESETPASS','cid'=>$userid)); kc_tip('成功设置用户密码为:'.$pwd,'ok'); } ``` 控制userid,从10001开始,步进为1,遍历就可以把重置所有会员的密码了。 过程见下图 [<img src="https://images.seebug.org/upload/201503/0900491010e4e2c2cbf02b943bcb182c6ba92c18.jpg" alt="重置会员密码副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/0900491010e4e2c2cbf02b943bcb182c6ba92c18.jpg) 0x03:下面看看如何修改所有会员用户名 /user/manage.php ``` function _rename(){ $u=new user;$u->auth_role('admin'); $userid=kc_post('userid',2,1); $db=new db; $rs=$db->getRows_one('%s_user','username','userid='.$userid); if(empty($rs)) kc_tip('用户名记录已丢失!'); $str=new str; if(empty($_POST['username'])) kc_tip('请填写用户名!','form'); if($_POST['username']==$rs['username']) kc_tip('新的用户名不能和旧用户名一致!','form'); if ($str->len($_POST['username'])>12) kc_tip('用户名太长,不能超过12字','form'); if(preg_match('/[<>\s\!\@\/\\\|\]\[\}\{\#\$\%\^\&\*\(\)\_\+\=\-]/',$_POST['username'])) kc_tip('用户名不能含有非法字符!','form'); $uname=$db->encode($_POST['username']); if($db->getRows_one('%s_user','userid',"username='$uname' and userid<>$userid")) kc_tip('当前用户名已经存在!','form'); $array=array('username'=>$_POST['username']); $db->update('%s_user',$array,'userid='.$userid); $js="\$.kc_close();alert('成功修改用户名[{$rs['username']}]为[{$_POST['username']}]!');$('#form_publish [name=username]').val('{$_POST['username']}');"; kc_log(array('userid'=>$u->info['userid'],'app'=>'user','action'=>'USER_RENAME','cid'=>$userid)); kc_ajax(array('JS'=>$js)); } ``` 控制userid和POST[‘username’],从10001开始,步进为1,遍历就可以修改所有会员的用户名了。 过程见下图 [<img src="https://images.seebug.org/upload/201503/090049418f4b7338cea5ae5ea9684238a26b522b.jpg" alt="重命名会员副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/090049418f4b7338cea5ae5ea9684238a26b522b.jpg) ### 漏洞证明: 见 详细过程