代碼審計(jì)現(xiàn)狀
?? ?隨著開發(fā)人員的安全意識(shí)逐步提高错敢,導(dǎo)致漏洞挖掘的難度逐年遞增比驻。而代碼審計(jì)檀咙,逐漸出現(xiàn)在大家的視野里棋蚌,方便了安全人員能夠更易挖掘到很多黑盒測(cè)試不容易發(fā)現(xiàn)的漏洞威脅嫁佳。但是由于系列代碼審計(jì)從0到1的資料比較稀缺,導(dǎo)致懂代碼審計(jì)的人相對(duì)屬于少數(shù)人員谷暮,而大部分web安全人員還徘徊在已知漏洞利用階段蒿往。
代碼審計(jì)之問
?? ?有大部分小伙伴沒有真正接觸代碼審計(jì),沒有具體去實(shí)踐代碼審計(jì)的肯定會(huì)有這樣的疑問湿弦。要做代碼審計(jì)需要懂哪些知識(shí)叭柯?給一套程序如何下手颊埃?我看得懂別人的代碼審計(jì)案例蔬充,但是到自己下手時(shí)就沒了思路了呢?找到漏洞不會(huì)構(gòu)造POC 怎么辦等等班利。筆者認(rèn)為問這些問題的主要原因是不知道代碼審計(jì)的流程饥漫。如果你知道代碼審計(jì)的流程,你就知道哪個(gè)環(huán)節(jié)需要學(xué)習(xí)掌握哪些知識(shí)罗标;如何下手審計(jì)代碼庸队;選擇什么樣的方式去下手积蜻;如何構(gòu)造Payload,編寫POC來驗(yàn)證漏洞的存在彻消。
筆者認(rèn)為代碼審計(jì)的流程是:審計(jì)前的準(zhǔn)備->定位漏洞產(chǎn)生點(diǎn)->URL鏈接構(gòu)造訪問漏洞產(chǎn)生點(diǎn)->payload構(gòu)造突破各種防御/編碼轉(zhuǎn)換->證實(shí)漏洞存在竿拆。下面我們以php代碼審計(jì)為例來進(jìn)行分析。
審計(jì)前的準(zhǔn)備
?? ?環(huán)境搭建+調(diào)試工具
? 別人給我們一套php程序讓我們做代碼審計(jì)证膨,通過漏洞挖掘驗(yàn)證漏洞的存在如输。我們?cè)谀玫匠绦蛑螅紫纫龅氖黔h(huán)境搭建央勒,讓程序運(yùn)行起來方便我們調(diào)試不见,驗(yàn)證。這就要求懂得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ū)徲?jì)
2功能點(diǎn)審計(jì)
3關(guān)鍵詞定位逆向追蹤
4灰盒+白盒審計(jì)
?? ?在進(jìn)行代碼審計(jì)的時(shí)候鲫懒,各種方式進(jìn)行組合使用是比較高效的,當(dāng)然這是對(duì)有審計(jì)經(jīng)驗(yàn)的人來說的刽辙,沒有的還是慢慢針對(duì)一種方式練習(xí)一下窥岩。
在尋找漏洞定位漏洞發(fā)生點(diǎn)之前,審計(jì)者首先要清楚自己的定位宰缤,想要挖單種類型的漏洞颂翼,常規(guī)類型漏洞,還是業(yè)務(wù)類型邏輯漏洞撵溃,是想挖掘哪些比較難發(fā)現(xiàn)的漏洞疚鲤,還是想挖掘比較容易挖掘的漏洞。挖掘什么樣的漏洞缘挑,你就要熟悉什么樣的漏洞類型產(chǎn)生原理集歇,知道哪些函數(shù)利用不當(dāng)或本身的脆弱性或未過濾/有效過濾造成的漏洞威脅。 比如涉及到sql注入時(shí)语淘,因?yàn)樗漠a(chǎn)生是可控參數(shù)在與數(shù)據(jù)庫交互的時(shí)沒有有效過濾與原有SQL語句拼接在一起造成的注入漏洞诲宇,這時(shí)你就要專門查找與數(shù)據(jù)庫交互的功能际歼;又比如XSS, 它是在瀏覽器渲染的時(shí)候姑蓝,可控參數(shù)被當(dāng)做js代碼執(zhí)行造成的鹅心,這時(shí)候你就要查找在輸出端時(shí),可控參數(shù)會(huì)不會(huì)被導(dǎo)致js執(zhí)行纺荧。其他常規(guī)類型漏洞挖掘時(shí)旭愧,可直接定位關(guān)鍵詞來回溯。 挖掘單種類型漏洞或者常規(guī)類型漏洞宙暇,可以使用自動(dòng)化審計(jì)工具如國際流行的rips输枯,國內(nèi)seay大牛的源代碼審計(jì)工具,進(jìn)行關(guān)鍵詞定位搜索占贫,然后在去驗(yàn)證漏洞的存在及可用性桃熄。
?? ?全文通讀正向?qū)徲?jì)并非代碼全讀,且屬于正向追蹤型奥。審計(jì)框架級(jí)的程序瞳收,先找出開發(fā)手冊(cè)來熟悉一下,然后在根據(jù)手冊(cè)挑出有可控點(diǎn)的方法往下追代碼厢汹,如帶入了哪個(gè)方法螟深,調(diào)用了哪個(gè)函數(shù),一直追到不能追了或者追到有漏洞點(diǎn)位置為止烫葬,這樣的好處是漏洞發(fā)現(xiàn)的覆蓋率高血崭,追蹤好追蹤,url鏈接好構(gòu)造厘灼;審計(jì)沒有手冊(cè)的程序,就專門找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ī)類型漏洞钻洒,也適用于邏輯類型漏洞奋姿。為什么這么說呢?比如一個(gè)忘記密碼找回的功能點(diǎn)素标,我們猜測(cè)該功能點(diǎn)可能會(huì)有SQL注入称诗,驗(yàn)證碼繞過,爆破重置密碼头遭,越權(quán)等漏洞寓免,所以我們?cè)趯徲?jì)功能點(diǎn)的時(shí)候癣诱,就會(huì)著重進(jìn)行預(yù)測(cè)漏洞類型的審計(jì)。一般有了一定代碼審計(jì)經(jīng)驗(yàn)的人在做SDL的威脅建模時(shí)袜香,效率就會(huì)高很多撕予。
URL鏈接構(gòu)造訪問漏洞產(chǎn)生點(diǎn)
? 到了這個(gè)環(huán)節(jié),必不可少的要熟悉程序的目錄文件結(jié)構(gòu)蜈首,URL路由实抡。一般訪問漏洞產(chǎn)生點(diǎn)會(huì)有兩種方式,一種是通過URL連接構(gòu)造直接訪問和間接訪問欢策。直接訪問是漏洞產(chǎn)生點(diǎn)在可通過URL直接映射到的方法中吆寨,間接方法是漏洞點(diǎn)在直接映射的方法內(nèi)所調(diào)用的其他方法(可多級(jí)遞歸)中。想要學(xué)會(huì)URL構(gòu)造猬腰,一般有三種方式鸟废,①網(wǎng)站鏈接點(diǎn)擊+目錄結(jié)構(gòu)尋找控制器方法。隨便點(diǎn)擊搭建起來的目標(biāo)網(wǎng)站鏈接姑荷,通過對(duì)比鏈接盒延,和目錄文件結(jié)構(gòu)來模仿構(gòu)造URL鏈接②看手冊(cè)找到URL路由結(jié)構(gòu)的映射方式③是看代碼+經(jīng)驗(yàn)。
PAYLOAD構(gòu)造
一般可控參數(shù)在到漏洞發(fā)生點(diǎn)時(shí)鼠冕,可能會(huì)遇到代碼防御過濾添寺,類型轉(zhuǎn)換,編碼轉(zhuǎn)換等懈费。所以在可控參數(shù)到漏洞發(fā)生點(diǎn)期間计露,進(jìn)行了哪些,防御憎乙,轉(zhuǎn)換票罐,編碼等做一個(gè)流程圖,在最后漏洞發(fā)生點(diǎn)想要執(zhí)行什么樣的結(jié)果泞边,寫出來该押,然后拿著最后執(zhí)行的效果往上推,一直推到可控參數(shù)傳參的位置阵谚。在這個(gè)環(huán)節(jié)蚕礼,必不可少的要掌握一些滲透技巧,跟payload編寫技巧梢什,方便在用到的時(shí)候能真正做到靈活運(yùn)用奠蹬。
其他
在代碼審計(jì)時(shí),我們不光要注意到代碼的問題嗡午,還要注意到php.ini配置問題囤躁,中間件結(jié)合的問題等各種影響因素,而且在審計(jì)一套你未曾審計(jì)的源碼時(shí),可查閱一下前輩們審計(jì)的該套目標(biāo)程序的漏洞產(chǎn)生情況割以,熟悉開發(fā)人員的開發(fā)安全意識(shí)及漏洞忽略點(diǎn)來進(jìn)行漏洞預(yù)測(cè)挖掘金度。
總結(jié)一下,通過上面簡單的論述严沥,對(duì)代碼審計(jì)已經(jīng)有了一個(gè)初步的了解猜极,掌握了代碼審計(jì),你不光熟悉了編程語言消玄,滲透測(cè)試技巧跟伏,更學(xué)會(huì)了漏洞挖掘,也就是說你同時(shí)掌握了三種技術(shù)翩瓜。
喜歡就點(diǎn)個(gè)關(guān)注唄~謝謝