漏洞的審計
源頭是在/src/extend/extcore/ImageCrop.php/crop
這個方法裏面發現有個getimagesize
函數,這個函數是能夠觸發phar
反序列化漏洞的,而這個 cms 是基於 thinkphp5.1 框架二次開發的,這個框架有個反序列化漏洞相信大家都很熟悉了,所以我們的目的就是能控制$imgData
這個變量就行了
可以看到$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
這個方法看看哪裏會調用他
我們在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
後綴的文件也是能夠成功反序列的,這裏我爲了方便直接放在根目錄下
到了這一步我們的思路基本就清晰了,我們測試一下$img
是否能夠正確的打印出來,可以手動添加一個echo $img;
我們訪問一下cacheimage
的路由
可以看到我們的$img
變成了1.txt
,getimagesize
函數裏面也成功接收到我們放在1.txt
裏面的內容
我們再cmd
傳參我們的命令即可看到漏洞已經成功利用
本文涉及相關實驗:任意文件上傳漏洞的代碼審計01 (通過本節的學習,瞭解文件上傳漏洞的原理,通過代碼審計掌握文件上傳漏洞產生的原因、上傳繞過的方法以及修復方法。)
總結
漏洞已經上交於cnvd平臺,然後這個漏洞由於十六進制繞過的問題,只能在linux
下才可以成功實現,所以可以把cms
放在docker
裏面進行測試,然後在一些小的cms裏面關於phar
反序列化漏洞還是比較好找的,因爲一般來說後臺都是能夠上傳jpg
格式的文件,能夠觸發phar
的函數也蠻多的