代碼審計(jì)之論

代碼審計(jì)現(xiàn)狀

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

代碼審計(jì)之問(wèn)

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

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

審計(jì)前的準(zhǔn)備

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

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

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

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

1全文通讀正向?qū)徲?jì)

2功能點(diǎn)審計(jì)

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

4灰盒+白盒審計(jì)

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

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

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

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

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

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

PAYLOAD構(gòu)造

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

其他

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

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

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

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

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

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