代碼審計指的是對原始碼進行檢查,尋找代碼中的Bug和安全缺陷,分析並找到這些問題引發的安全漏洞,提供代碼修訂措施和建議。這項技術需要多方面的技能支持,比如說要掌握基礎編程、漏洞原理、了解系統服務和中間件等。
但是對於小白來說,可能就是一個「代碼審計之從入門到放棄」的悲慘故事,所以學習路線很重要,今天i春秋通過一期公開課《代碼審計進階之路》教大家掌握漏洞審計的學習思路。
暱稱:depy
The Loner安全團隊成員;
擅長代碼審計;
審計過國內眾多開源Web程序。
代碼審計是指原始碼中存在安全隱患,技術人員發現編碼存在不規範的地方,並發現其中的安全漏洞,通過自動化工具或者人工審查的方式,對代碼逐條進行檢查和分析,並及時修補安全漏洞的過程。
本節公開課是基於MVC框架,對常規CMS進行代碼審計,通過挖掘PHP反序列化的Gadget,教會大家掌握漏洞審計的學習思路。
感興趣的小夥伴,識別二維碼立即看課
PS:Web端看課體驗更佳,看課地址:
https://www.ichunqiu.com/open/68671
案例分析:某CMS代碼審計一次瘋狂的Bypass
在看這個Thinkphp5.1寫cms時候發現在
application/task/controller/UtilController.php
處存在一個file_put_contents。
可以很明顯地看到這個方法是在public在控制器裡面直接通過路由來訪問到,同時$img是可控的。
從正常的思路來看一下$img能不能完全可控或者能不能部分可控,如控制文件後綴。
回到代碼第32行,可以看到該方法對傳入的$img變量進行分割,也就是通過.來分割為數組並賦值給$path,若$path的元素數量正好為三的時候就進入第一個分支,否則將會重定向到一張系統默認的圖片。
也就是說傳入的$img必須且有三個點(.)組成,否則將會被重定向,這個正則可以暫時不看對後續有影響在看。
跳到代碼第42行,調用了crop_image個函數,並且將path[0]拼接path[2]和$args。
找到這個函數原型,可以看到實例化了ImageCrop類並調用了crop方法。
直接跳到ImageCrop來看,可以看到傳入的參數被賦值給屬性file,並在crop中賦值給$img變量同時,將$img作為getImgData參數傳入,咱們繼續跟進。
可以看到getImgData會對傳入的參數進行匹配,看是否存在http://若存在則調用file_get_contents來讀取遠程文件。
那麼問題來了,這個$img能不能直接控制為伺服器地址呢?
但是前面又限制死了,只能有三個(.)點,這該怎麼辦呢?
其實這裡是可以Bypass的。
在linux情況下,file_get_content是可以識別十六進位或者八進位的IP位址的。
使用16進位不就沒有點了嗎,那麼$img就可以完全可控。
那麼在伺服器下存放一個shell.php,將伺服器IP轉換為16進位注意要加上0x。IP轉換腳本如下:
<?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);
?>
可以看到存放在遠程伺服器的內容<?php phpinfo();?>被讀取出來,並且當做參數傳入給getimagesize。
getimagesize要怎麼才能bypass呢?
可以使用圖片馬,進行繞過。
在遠程shell.php寫一個遠程的圖片馬地址,但是傳入file_put_contnets時候出問題了。
file_put_contents在遇到//指都會將其當做wrapper處理,在windows下可以使用NTFS Stream技巧
file_put_contents('php://filter/write=convert.base64-decode/resource=C:/path/to/testphp::$INDEX_ALLOCATION', '');
創建文件夾C:/path/to/testphp但是這裡偽協議。
已經寫死了無法使用.難道這條路已經封死了嗎?
回過頭來看前面getimagesize的參數是完全可控的。
在回想一下這個CMS是Thinkphp5.1開發的,而getimagesize是可以觸發Phar反序列化的。
那麼現在思路再次轉變,能否遠程控制一個文件寫phar文件的地址,在file_get_contents讀取遠程文件,將這個文件的內容傳給getimagesize,而這個文件內容再後臺上傳的phar文件的地址,進而觸發thinkphp的反序列化。
那麼傳入phar偽協議進行反序列化,可以看到在最後成功觸發反序列化。
最後,結合多年的代碼審計經驗,給大家做一下總結概括,除了要做到認真細緻外,也要儘量做到如下幾條:
1、多開發、多寫代碼、多理解開發的想法和思維;
2、遇到困難要想辦法bypass,而不是放棄目標;
3、對目標系統需要有一定的了解和前期準備;
4、不要懼怕代碼多;
5、多找大佬帶你學習,比如我之前就向W&M戰隊的p3rh4ps表哥學習了很多經驗技巧。
i春秋官方公眾號為大家提供
前沿的網絡安全技術
簡單易懂的實用工具
緊張刺激的安全競賽
還有網絡安全大講堂
更多技能等你來解鎖