代碼審計難?掌握這個學習思路,穩贏!

2022-01-16 i春秋

代碼審計指的是對原始碼進行檢查,尋找代碼中的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春秋官方公眾號為大家提供

前沿的網絡安全技術

簡單易懂的實用工具

緊張刺激的安全競賽

還有網絡安全大講堂

更多技能等你來解鎖

相關焦點

  • 搜索 PHP代碼審計之旅
    但如果這些代碼是分布在一套源碼中(如CMS),需要我們去發現,去找到並會利用,就需要有一定的查找以及利用思路,這次測試的是BlueCMS1.6,重要不在於去復現這個CMS的漏洞,而在先了解一下整個審計思路還有過程是怎麼樣的,去鍛鍊自己的審計能力。由於我比較菜,所以有錯誤的地方也請師傅們指正。何為白盒、黑盒、灰盒測試審計代碼會經常遇到這三個名詞,這又代表是什麼意思那?
  • 代碼審計入門實戰
    大家可以通過學習這個實驗,掌握PhpStorm環境搭建和Xdebug工具的安裝和配置:留言或私信獲取實驗地址哦~網傳這麼一個段子:如何讓一個論壇的人吵起來?答:PHP是世界上最好的語言。下面進入文章的重點部分——PHP函數的代碼審計,通過具體實例分析PHP部分函數,包括in_array函數、filter_var函數、escapeshellarg與escapeshellcmd函數、parse_str函數及addslashes函數,學習上述函數缺陷引發的漏洞及利用方式,結合CTF練習掌握PHP函數漏洞審計流程。
  • PHP代碼審計要點
    本文旨在總結一些在PHP代碼中經常造成問題的點,也是我們在審計的時候的關注重點。(PS:本文也只是簡單的列出問題,至於造成問題的底層原因未做詳細解釋,有興趣的看官可以自行GOOGLE或者看看底層C代碼。
  • XDCMS V1 代碼審計之旅
    前奏俗話說的好:「工欲善其事,必先利其器」,下面我理了一下這次審計的思路3:訪問特定功能點,進行特定代碼審計,也就是說一個功能點看一段代碼(這裡如果出現了過濾函數,基本上可以在2中找到)審計之旅先打開首頁看看,看到有登陸框和註冊框,那就先從註冊框開始審計
  • 2021年註冊會計師考試審計學習思路
    第—階段:按照審計流程的基本順序開展初步學習  第一編,審計基本原理,屬於基礎理論章節,有助於大家初步理解審計,是作為後續章節的學習基礎,包括審計基本概念、利定審計計劃、獲取的審計證據等內容。
  • 2020年註冊會計師審計科目難考嗎?怎麼學?
    近期,很多同學都在問:「2020年註冊會計師審計科目會不會很難考?」審計教材的專業性確實很強,究竟該怎麼學好呢?接下來快隨著會計網小編一起來看看吧!2020年註冊會計師審計科目難考嗎?1、註冊會計師涉及四類題型,分別是單選題、多選題、簡答題及綜合題。
  • 【一起玩蛇】Python代碼審計中的那些器I
    曾今向前輩請教過,如何學習代碼審計;曾今向大牛問起過,如何學好代碼審計……得到的答案總是出乎的一致:多讀,多審,多寫
  • 審計案例學習不是發現問題的捷徑
    然而,不少審計人員還抱著走捷徑的心理,覺得說不定哪個審計案例能和現實情況對應起來,或者能提供直接的審計思路,從而能有重要性水平高的審計發現。學習審計案例是好事,但是否有成果更關鍵的在於自己的學習能力和實踐能力。一個丙級足球隊無論看甲級足球隊比賽的錄像再多,恐怕一時半會也不會升級到乙級或甲級球隊了。如何進行審計案例的學習呢?1.學習審計案例要了解相關背景。
  • PHP代碼審計之漫畫CMS
    最近一直在學習代碼審計的相關課程,也在找一些通用的CMS在練習,剛好在安全群裡認識了一位志同道合的道友,於是就一起研究學習,前期還是不怎麼太會,所以也一直兩個人相互傳授經驗和交流,不過還好經過不斷的奮戰和努力終於出來了第一個洞,以下是相關步驟詳情,請各位大佬批評指正:這個CMS是PHP採用路由方式開發,前期總是找不到類和函數的調用地方,找了兩天才有所發掘,找到sys/apps
  • PHP代碼審計
    代碼審計顧名思義就是檢查原始碼中的缺點和錯誤信息,分析並找到這些問題引發的安全漏洞,並提供代碼修訂措施和建議
  • 三款商業化原始碼審計工具對比
    近年來,大部分安全問題來自於應用層安全,應用層的安全問題主要由軟體原始碼中的安全缺陷所導致。有關原始碼安全的研究越來越多,原始碼安全成為了解決信息安全問題的一個重要方向,也是信息安全中的一個新興領域。  在開發階段引入代碼檢測解決安全問題的思路開始被很多企業所認可。
  • 代碼審計 | 表達式注入
    收錄於話題 #代碼審計DOCTYPE html><html><head> <title>EL 表達式實例頁面</title></head><body><h3>輸入的 name 值為:${param.name}</h3></body></html>這樣當我們訪問
  • Python代碼審計實戰案例總結之CRLF和任意文件讀取
    介紹Python代碼審計方法多種多樣,但是總而言之是根據前人思路的遷移融合擴展而形成。
  • 滲透文章分享(3)——代碼審計/漏洞分析
    這部分將極大增強你學代碼的能力,單純的去啃代碼很多人啃不下去,結合具體的漏洞可以增加趣味性和目的性。畢竟挖0day是每個學安全的夢想。
  • 代碼審計中滲透測試的智能化分析
    在其中智能化代碼審計便是安全防護智能化繞不過去的坎。這次我們就一塊聊聊智能化代碼審計的發展歷程,也順帶講一講怎樣開展1個智能化靜態數據代碼審計的核心。智能化代碼審計在聊智能化代碼審計軟體以前,最先我們必需要明白2個定義,少報率和漏報率。
  • 從小眾blueCMS入坑代碼審計
    blueCMS介紹終於決定要入坑「代碼審計」,之前也陸陸續續試著做一些,但總是淺嘗而止,並沒有堅持下來。
  • 記一次.Net代碼審計-通過machineKey偽造任意用戶身份
    ,文中所涉及的技術、思路和工具僅供以安全為目的的學習交流使用,任何人不得將其用於非法用途以及盈利等目的,否則後果自行承擔!0x01 起因某次機緣巧合,領導給了一套國內某主流.net BPM系統源碼,要求審計,於是便開始了這次審計之旅。。。
  • 也許審計模型比審計案例能夠發揮更大的作用
    審計模型是數位化審計的「發動機」,是審計分析算法的載體。審計模型可以通過通過計算機語言或代碼進行構建,並在計算機中進行運行,獲得結果輸出。數據就相當於「汽油」,通過審計模型產生能量,為審計業務提供動力。審計模型的開發與應用從表面上看是技術性和操作性的,但也需要審計人員從基本的思維和思想上入手。
  • PHP代碼審計中常用代碼調試函數與注釋
    出品|安全幫(www.secbang.com)概述:安全幫專注安全教育【本章目的】掌握代碼審計中常用的代碼調試函數
  • 二.PHP代碼審計涉及到的超全局變量
    · 出品|安全幫(www.secbang.com)概述:安全幫專注安全教育大牛繞過 針對零基礎小白【本章目的】掌握代碼審計中常用的代碼調試函數修改tets.php代碼,定義了一個名為test()的函數,賦值局部變量$xipu的值為simple,「echo $GLOBALS[『secbang』]」語句由於使用了$GLOBALS($GLOBALS['var']是外部的全局變量本身),故輸出的是test()函數之外定義的全局變量,即$secbang = "secbanger";,所以輸出secbanger。