對某cms的一次審計思路

漏洞的審計

源頭是在/src/extend/extcore/ImageCrop.php/crop這個方法裏面發現有個getimagesize函數,這個函數是能夠觸發phar反序列化漏洞的,而這個 cms 是基於 thinkphp5.1 框架二次開發的,這個框架有個反序列化漏洞相信大家都很熟悉了,所以我們的目的就是能控制$imgData這個變量就行了

image-20210310113922878.png

可以看到$imgData是由$this->getImgData($img);控制的,我們跟蹤進去

private function getImgData($img){
        if(strripos($img, 'http://')!==FALSE OR strripos($img,'https://') !==FALSE) {	//站外圖片
            $data=file_get_contents($img);
        }else{	//站內圖片
            $file=DOC_ROOT.'/'.$img;
            if(is_file($file)) {
                $data = file_get_contents($file);
            }else{
                return false;
            }
        }
        return $data;
    }

可以看到這裏會限制只能由http://或者https://開頭的參數才能獲取站外的圖片信息

再看看全局搜索crop這個方法看看哪裏會調用他

image-20210310114857549.png

我們在src/application/task/controller/UtilController.php/cropimage發現有個crop_image函數,我們跟蹤進去

function crop_image($file, $options){
    // echo $file;
    $imageCrop=new \extcore\ImageCrop($file, $options);
    return $imageCrop->crop();
}

發現這裏會調用到我們上面的crop函數

這裏的$file參數也就是我們傳給getImgData函數的$img變量,所以這裏我們看看如何去控制他,可以看到crop_image方法裏面有一個$paths=explode('.',$img);,就是會根據點去分隔我們的$img參數,然後又要count($paths)==3,我們可以回想到getImgData限制了http的開頭,我們想要phar反序列化的話,必須是phar://的開頭,那麼我們直接在vps上放置我們的phar文件的路徑不就可以了

但是這裏有一個問題,我們正常輸入一個IP地址的話肯定是不行的,因爲他的count($paths)==3,所以我們可以使用十六進制繞過的方法,所以也就限制了這種方法只能在linux下面使用,這裏順便貼一下之前寫的一個轉進制的腳本

<?php
$ip = '127.0.0.1';
$ip = explode('.',$ip);
$r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ;
if($r < 0) {
    $r += 4294967296;
}
echo "十進制:";
echo $r;
echo "八進制:";
echo decoct($r);
echo "十六進制:";
echo dechex($r);
?>

我們在$ip處貼上自己的vps的地址,這裏要注意生成的十六進制前面要加上0x

然後cacheimage函數的

$response = crop_image($paths[0].'.'.$paths[2], $args);

$paths[0].'.'.$paths[2]就是我們想要控制的參數,因爲前面explode把我們的url地址分成了3份,這裏把第一份和第三份拼接了起來,於是我們可以構造類似於http://vps-ip/1.1.txt的形式,這裏樣我們的$paths[0].'.'.$paths[2]也就成爲了1.txt也就是我們可控的東西了,同時這裏也明白了爲什麼要將vps-ip轉成16進制的原因了

我們同時在vps上放置test.phar的路徑,這個cms後臺是可以上傳jpg文件的,當然phar反序列化的話即使是jpg後綴的文件也是能夠成功反序列的,這裏我爲了方便直接放在根目錄下

image-20210310121018615.png

到了這一步我們的思路基本就清晰了,我們測試一下$img是否能夠正確的打印出來,可以手動添加一個echo $img;

image-20210310121752201.png

我們訪問一下cacheimage的路由

image-20210310122044053.png

可以看到我們的$img變成了1.txtgetimagesize函數裏面也成功接收到我們放在1.txt裏面的內容

image-20210310141711478.png

我們再cmd傳參我們的命令即可看到漏洞已經成功利用

本文涉及相關實驗:任意文件上傳漏洞的代碼審計01 (通過本節的學習,瞭解文件上傳漏洞的原理,通過代碼審計掌握文件上傳漏洞產生的原因、上傳繞過的方法以及修復方法。)

總結

漏洞已經上交於cnvd平臺,然後這個漏洞由於十六進制繞過的問題,只能在linux下才可以成功實現,所以可以把cms放在docker裏面進行測試,然後在一些小的cms裏面關於phar反序列化漏洞還是比較好找的,因爲一般來說後臺都是能夠上傳jpg格式的文件,能夠觸發phar的函數也蠻多的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章