某cms 用户中心存在时间盲注

isnull   ·   发表于 2019-05-21 11:12:40   ·   漏洞文章

无意间发现的注入,结果已经有师傅提交了有关的XSS的CVE,虽然利用的地方是一样的。
源码下载处:
http://www.zzcms.net/download/zzcms2019.zip

漏洞分析

漏洞位于/inc/function.php的markit函数中

function markit(){
          $userip=$_SERVER["REMOTE_ADDR"];
          //$userip=getip();
          $url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
          echo $url;
          query("insert into zzcms_bad (username,ip,dose,sendtime)values('".$_COOKIE["UserName"]."','$userip','$url','".date('Y-m-d H:i:s')."')") ;     
}

从上面的代码能看出$url的值由$_SERVER['REQUEST_URI']拼接而成,也就是我们的访问的url。接着直接就在sql中进行了拼接,并没有进行相应的过滤。
而在/inc/stopsqlin.php中的2-5行,也能发现存在相应过滤

//主要针对在任何文件后加?%3Cscript%3E,即使文件中没有参数
if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){
die ("无效参数");//注意这里不能用js提示
}

但是这是针对于XSS的过滤,对我们并没有什么影响。
我们能在好几处地方找到对markit函数的调用


比如以/user/del.php为例

<?php
$pagename=isset($_POST["pagename"])?$_POST["pagename"]:'';
$tablename=isset($_POST["tablename"])?$_POST["tablename"]:'';
$id='';
if(!empty($_POST['id'])){
    for($i=0; $i<count($_POST['id']);$i++){
    checkid($_POST['id'][$i]);
    $id=$id.($_POST['id'][$i].',');
    }
    $id=substr($id,0,strlen($id)-1);//去除最后面的","
}

if (!isset($id) || $id==''){
showmsg('操作失败!至少要选中一条信息。');
}

$tablenames='';
$rs = query("SHOW TABLES");
while($row = fetch_array($rs)) {
$tablenames=$tablenames.$row[0]."#";
}
$tablenames=substr($tablenames,0,strlen($tablenames)-1);

if (str_is_inarr($tablenames,$tablename)=='no'){
echo "tablename 参数有误";
exit();
}

if ($tablename=="zzcms_main"){
    if (strpos($id,",")>0){
        $sql="select id,img,flv,editor from zzcms_main where id in (".$id.")";
    }else{
        $sql="select id,img,flv,editor from zzcms_main where id ='$id'";
    }
$rs=query($sql);
$row=num_rows($rs);
if ($row){
while ($row=fetch_array($rs)){
    if ($row["editor"]<>$username){
    markit();showmsg('非法操作!警告:你的操作已被记录!小心封你的用户及IP!');
    }


能发现,只需更改$username,其对应的值是Cookie中的UserName的值,使得查询出来的$row["editor"]值与之不同即可触发markit()函数。
需要注意的是,因为注入点位于URL中,直接路径加sql语句肯定是不行的,这里可以使用?进行连接。

漏洞复现




修复建议

$_SERVER['REQUEST_URI']进行过滤


打赏我,让我更有动力~

0 条回复   |  直到 2019-5-21 | 1064 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.