QIBO CMS SQL Injection Via Variable Uninitialization In \member\special.php

Andrew.Hann發表於2015-04-10

Catalog

1. 漏洞描述
2. 漏洞觸發條件
3. 漏洞影響範圍
4. 漏洞程式碼分析
5. 防禦方法
6. 攻防思考

 

1. 漏洞描述

該漏洞存在於/member/special.php檔案下,由於未對變數進行正確初始化,並在SQL查詢中帶入這個變數,導致黑客可以通過POST請求注入特殊構造的HTTP請求,通過為初始化變數進行SQL隱碼攻擊

Relevant Link:

http://www.wooyun.org/bugs/wooyun-2015-0104959


2. 漏洞觸發條件

1. 登入
2. 進入show_BBSiframe
3. 釋出一個專題
4. 進入show_BBSiframe


3. 漏洞影響範圍

測試版本:V7.0


4. 漏洞程式碼分析

\member\special.php

...
if($type=='myatc'||$type=='all')
{
    $detail=explode(",",$rsdb[tids]);
    $show='';
    if($page<1){
        $page=1;
    }
    $rows=15;
    $min=($page-1)*$rows;
    if($keywords){//搜尋時
        $SQL=" BINARY subject LIKE '%$keywords%' ";
    }elseif($ismy){
        $SQL=" authorid='$lfjuid' ";
    }else{
        $SQL=' 1 ';
    }
    
    if($fid>0){
        $SQL.=" AND fid='$fid' ";
    }
    //$TB_pre未在全域性變數中初始化帶入查詢導致注入
    $showpage=getpage("{$TB_pre}threads","WHERE $SQL","",$rows);
    //$TB_pre未在全域性變數中初始化帶入查詢導致注入
    $query = $db->query("SELECT * FROM {$TB_pre}threads WHERE $SQL ORDER BY tid DESC LIMIT $min,$rows");
    if(ereg("^pwbbs",$webdb[passport_type])){            
        while($rs = $db->fetch_array($query)){
            $add="&nbsp;";
            if(!in_array($rs[tid],$detail)){
                $add="<A HREF='special.php?job=show_BBSiframe&id=$id&type=list_atc&act=add&aid={$rs[tid]}' target='spiframe' onclick=closedo(this)>新增</A>";
            }
            $show.="<tr align='center' class='trA' onmouseover=\"this.className='trB'\" onmouseout=\"this.className='trA'\"> 
                <td width='5%'>{$rs[tid]}</td>
                <td width='84%' align='left'><a href='$webdb[passport_url]/read.php?tid=$rs[tid]' target=_blank>$rs[subject]</a></td>
                <td width='11%'>&nbsp;$add</td>
              </tr>";
        }
    }
...


5. 防禦方法

\member\special.php

...
//論壇貼子
elseif($job=="show_BBSiframe")
{
    //判斷系統是否存在dzbbs或pwbbs系統變數,防禦未初始化變數注入
    if(!ereg("^dzbbs",$webdb[passport_type])&&!ereg("^pwbbs",$webdb[passport_type])){
        showerr('你沒有整合對應版本的論壇!');
    }
    $rsdb=$db->get_one("SELECT * FROM {$pre}special WHERE uid='$lfjuid' AND id='$id'");
    if(!$rsdb){
        showerr("資料不存在",1);
    }
    ...
    if($type=='myatc'||$type=='all')
    {
        ...
        $showpage=getpage("{$TB_pre}threads","WHERE $SQL","",$rows);
        $query = $db->query("SELECT * FROM {$TB_pre}threads WHERE $SQL ORDER BY tid DESC LIMIT $min,$rows");
...


6. 攻防思考

Copyright (c) 2014 LittleHann All rights reserved

 

相關文章