代碼審計之論

代碼審計現(xiàn)狀

?? ?隨著開發(fā)人員的安全意識逐步提高,導(dǎo)致漏洞挖掘的難度逐年遞增。而代碼審計,逐漸出現(xiàn)在大家的視野里,方便了安全人員能夠更易挖掘到很多黑盒測試不容易發(fā)現(xiàn)的漏洞威脅。但是由于系列代碼審計從0到1的資料比較稀缺,導(dǎo)致懂代碼審計的人相對屬于少數(shù)人員,而大部分web安全人員還徘徊在已知漏洞利用階段。

代碼審計之問

?? ?有大部分小伙伴沒有真正接觸代碼審計,沒有具體去實(shí)踐代碼審計的肯定會有這樣的疑問。要做代碼審計需要懂哪些知識???給一套程序如何下手?我看得懂別人的代碼審計案例,但是到自己下手時就沒了思路了呢?找到漏洞不會構(gòu)造POC 怎么辦等等。筆者認(rèn)為問這些問題的主要原因是不知道代碼審計的流程。如果你知道代碼審計的流程,你就知道哪個環(huán)節(jié)需要學(xué)習(xí)掌握哪些知識;如何下手審計代碼;選擇什么樣的方式去下手;如何構(gòu)造Payload,編寫POC來驗證漏洞的存在。

筆者認(rèn)為代碼審計的流程是:審計前的準(zhǔn)備->定位漏洞產(chǎn)生點(diǎn)->URL鏈接構(gòu)造訪問漏洞產(chǎn)生點(diǎn)->payload構(gòu)造突破各種防御/編碼轉(zhuǎn)換->證實(shí)漏洞存在。下面我們以php代碼審計為例來進(jìn)行分析。

審計前的準(zhǔn)備

?? ?環(huán)境搭建+調(diào)試工具

? 別人給我們一套php程序讓我們做代碼審計,通過漏洞挖掘驗證漏洞的存在。我們在拿到程序之后,首先要做的是環(huán)境搭建,讓程序運(yùn)行起來方便我們調(diào)試,驗證。這就要求懂得windows版的php環(huán)境搭建或者linux版的php環(huán)境搭建。筆者推薦一款集成開發(fā)環(huán)境phpstudy。這款集成環(huán)境不論是windows還是linux安裝方便,php版本切換一鍵搞定。環(huán)境搭建完畢后,我們要使用編輯器去修改代碼調(diào)試程序,這里推薦使用IDE,phpstrom。該款編輯器美化精致,功能強(qiáng)大,可在phpstrom上配置xdebug 來進(jìn)行調(diào)試方便漏洞挖掘。所以這里我們要學(xué)習(xí)phpstrom的簡單使用及關(guān)鍵詞搜索與xdebug的配置。?? ?

定位漏洞發(fā)生點(diǎn)

?尋找定位漏洞發(fā)生點(diǎn)一般有如下幾種方式。

1全文通讀正向?qū)徲?/p>

2功能點(diǎn)審計

3關(guān)鍵詞定位逆向追蹤

4灰盒+白盒審計

?? ?在進(jìn)行代碼審計的時候,各種方式進(jìn)行組合使用是比較高效的,當(dāng)然這是對有審計經(jīng)驗的人來說的,沒有的還是慢慢針對一種方式練習(xí)一下。

在尋找漏洞定位漏洞發(fā)生點(diǎn)之前,審計者首先要清楚自己的定位,想要挖單種類型的漏洞,常規(guī)類型漏洞,還是業(yè)務(wù)類型邏輯漏洞,是想挖掘哪些比較難發(fā)現(xiàn)的漏洞,還是想挖掘比較容易挖掘的漏洞。挖掘什么樣的漏洞,你就要熟悉什么樣的漏洞類型產(chǎn)生原理,知道哪些函數(shù)利用不當(dāng)或本身的脆弱性或未過濾/有效過濾造成的漏洞威脅。 比如涉及到sql注入時,因為它的產(chǎn)生是可控參數(shù)在與數(shù)據(jù)庫交互的時沒有有效過濾與原有SQL語句拼接在一起造成的注入漏洞,這時你就要專門查找與數(shù)據(jù)庫交互的功能;又比如XSS, 它是在瀏覽器渲染的時候,可控參數(shù)被當(dāng)做js代碼執(zhí)行造成的,這時候你就要查找在輸出端時,可控參數(shù)會不會被導(dǎo)致js執(zhí)行。其他常規(guī)類型漏洞挖掘時,可直接定位關(guān)鍵詞來回溯。 挖掘單種類型漏洞或者常規(guī)類型漏洞,可以使用自動化審計工具如國際流行的rips,國內(nèi)seay大牛的源代碼審計工具,進(jìn)行關(guān)鍵詞定位搜索,然后在去驗證漏洞的存在及可用性。

?? ?全文通讀正向?qū)徲嫴⒎谴a全讀,且屬于正向追蹤。審計框架級的程序,先找出開發(fā)手冊來熟悉一下,然后在根據(jù)手冊挑出有可控點(diǎn)的方法往下追代碼,如帶入了哪個方法,調(diào)用了哪個函數(shù),一直追到不能追了或者追到有漏洞點(diǎn)位置為止,這樣的好處是漏洞發(fā)現(xiàn)的覆蓋率高,追蹤好追蹤,url鏈接好構(gòu)造;審計沒有手冊的程序,就專門找URL鏈接可直接請求到的方法,且該方法中代碼有帶可控點(diǎn)方法調(diào)用,然后如上追代碼。例如請求的url鏈接是localhost/user/updatePassword,這個鏈接映射的代碼位置是user模塊的updatePassword方法,該方法中有代碼$User->where('id='.$_GET['id'])->save(); 我們看到where()方法中有帶入可控參數(shù)id,那我們就繼續(xù)往下追蹤where方法去尋找漏洞發(fā)生點(diǎn)。

? 功能點(diǎn)審計適用于常規(guī)類型漏洞,也適用于邏輯類型漏洞。為什么這么說呢?比如一個忘記密碼找回的功能點(diǎn),我們猜測該功能點(diǎn)可能會有SQL注入,驗證碼繞過,爆破重置密碼,越權(quán)等漏洞,所以我們在審計功能點(diǎn)的時候,就會著重進(jìn)行預(yù)測漏洞類型的審計。一般有了一定代碼審計經(jīng)驗的人在做SDL的威脅建模時,效率就會高很多。

URL鏈接構(gòu)造訪問漏洞產(chǎn)生點(diǎn)

? 到了這個環(huán)節(jié),必不可少的要熟悉程序的目錄文件結(jié)構(gòu),URL路由。一般訪問漏洞產(chǎn)生點(diǎn)會有兩種方式,一種是通過URL連接構(gòu)造直接訪問和間接訪問。直接訪問是漏洞產(chǎn)生點(diǎn)在可通過URL直接映射到的方法中,間接方法是漏洞點(diǎn)在直接映射的方法內(nèi)所調(diào)用的其他方法(可多級遞歸)中。想要學(xué)會URL構(gòu)造,一般有三種方式,①網(wǎng)站鏈接點(diǎn)擊+目錄結(jié)構(gòu)尋找控制器方法。隨便點(diǎn)擊搭建起來的目標(biāo)網(wǎng)站鏈接,通過對比鏈接,和目錄文件結(jié)構(gòu)來模仿構(gòu)造URL鏈接②看手冊找到URL路由結(jié)構(gòu)的映射方式③是看代碼+經(jīng)驗。

PAYLOAD構(gòu)造

一般可控參數(shù)在到漏洞發(fā)生點(diǎn)時,可能會遇到代碼防御過濾,類型轉(zhuǎn)換,編碼轉(zhuǎn)換等。所以在可控參數(shù)到漏洞發(fā)生點(diǎn)期間,進(jìn)行了哪些,防御,轉(zhuǎn)換,編碼等做一個流程圖,在最后漏洞發(fā)生點(diǎn)想要執(zhí)行什么樣的結(jié)果,寫出來,然后拿著最后執(zhí)行的效果往上推,一直推到可控參數(shù)傳參的位置。在這個環(huán)節(jié),必不可少的要掌握一些滲透技巧,跟payload編寫技巧,方便在用到的時候能真正做到靈活運(yùn)用。

其他

在代碼審計時,我們不光要注意到代碼的問題,還要注意到php.ini配置問題,中間件結(jié)合的問題等各種影響因素,而且在審計一套你未曾審計的源碼時,可查閱一下前輩們審計的該套目標(biāo)程序的漏洞產(chǎn)生情況,熟悉開發(fā)人員的開發(fā)安全意識及漏洞忽略點(diǎn)來進(jìn)行漏洞預(yù)測挖掘。

總結(jié)一下,通過上面簡單的論述,對代碼審計已經(jīng)有了一個初步的了解,掌握了代碼審計,你不光熟悉了編程語言,滲透測試技巧,更學(xué)會了漏洞挖掘,也就是說你同時掌握了三種技術(shù)。

喜歡就點(diǎn)個關(guān)注唄~謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容