qibocms /hr/listperson.php File Arbitrarily Include Vul Via Variable Uninitialization && Front Page Upload WEBSHELL

Andrew.Hann發表於2015-08-05

catalog

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

 

1. 漏洞描述

Relevant Link:
2. 漏洞觸發條件

1. 找到前臺檔案上傳點
http://localhost/qibo/hy/choose_pic.php

2. 上傳後直接包含檔案
http://localhost/qibo/hr/listperson.php?FidTpl[list]=../upload_files/homepage/pic/0/xxxx/xxx.jpg

3. Getshell


3. 漏洞影響範圍
4. 漏洞程式碼分析

/hr/listperson.php

//獲取標籤內容
//注意這裡的$FidTpl 這裡並沒有初始化 導致黑客可以通過qibo的"模擬GPC序號產生器制"覆蓋這個變數的值
$template_file=getTpl("list_$fidDB[mid]",$FidTpl['list']);
fetch_label_value(array('pagetype'=>'4','file'=>$template_file,'module'=>$webdb['module_id']));
..
//包含檔案
require($template_file);

繼續跟進$template_file=getTpl("list_$fidDB[mid]",$FidTpl['list']);

function getTpl($html, $tplpath = '')
{ 
    global $STYLE;

    //$tplpath是我們外部傳入的,黑客可以通過變數覆蓋控制
    if($tplpath && file_exists($tplpath))
    { 
        //如果檔案存在,那麼就直接return 
        return $tplpath;
    }
    elseif($tplpath && file_exists(Mpath.$tplpath))
    { 
        return Mpath.$tplpath; 
    }
    elseif(file_exists(Mpath . "template/$STYLE/$html.htm"))
    { 
        return Mpath."template/$STYLE/$html.htm"; 
    }
    else
    { 
        return Mpath."template/default/$html.htm"; 
    } 
}

回到/hr/listperson.php的require($template_file),return後就直接包含了該檔案,程式沒有對帶包含的檔案路徑進行任何驗證、限制,導致了可以直接包含任意格式、任意內容的檔案
Relevant Link:

http://www.wooyun.org/bugs/wooyun-2014-081470


5. 防禦方法

0x1: 任意檔案包含注入點防禦

/hr/listperson.php

/* */
if (!empty($FidTpl['list'])) 
{
    unset($FidTpl['list']);
} 
/**/
$template_file=getTpl("list_$fidDB[mid]",$FidTpl['list']);
fetch_label_value(array('pagetype'=>'4','file'=>$template_file,'module'=>$webdb['module_id']));

0x2: 前臺任意檔案上傳點防禦

/hy/choose_pic.php

if($action=='upload')
{ 
    if(is_uploaded_file($_FILES[postfile][tmp_name]))
    { 
        $array[name]=is_array($postfile)?$_FILES[postfile][name]:$postfile_name;
        $title=$title?$title:$array[name];
        $myname_str=explode(".",strtolower($array[name]));
        $myname=$myname_str[(count($myname_str)-1)];
        if(!in_array($myname,array('gif','jpg'))) $msg="{$array[name]}圖片只能是gif或者jpg的格式";  
    ..

這個檔案是前臺提供使用者上傳圖片之用,程式本身對副檔名做了限制(gif、jpg),作為防禦方來說,對檔案內容進行PHP程式碼檢測意義不大,因為本身gif、jpg格式圖片是不能被WEB Server執行的,只有存在其他檔案inlcude包含漏洞的時候,圖片檔案中的PHP程式碼才能被引入執行,因此,我們只要堵住檔案include包含漏洞就可以了


6. 攻防思考

Copyright (c) 2015 LittleHann All rights reserved

 

相關文章