- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- PHP自動(dòng)化白盒審計技術(shù)的介紹與實(shí)現方式
本篇內容主要講解“PHP自動(dòng)化白盒審計技術(shù)的介紹與實(shí)現方式”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“PHP自動(dòng)化白盒審計技術(shù)的介紹與實(shí)現方式”吧!
0x00 前言
國內公開(kāi)的PHP自動(dòng)化審計技術(shù)資料較少,相比之下,國外已經(jīng)出現了比較優(yōu)秀的自動(dòng)化審計實(shí)現,比如RIPS是基于token流為基礎進(jìn)行一系列的代碼分析。傳統靜態(tài)分析技術(shù)如數據流分析、污染傳播分析應用于PHP這種動(dòng)態(tài)腳本語(yǔ)言分析相對較少,但是卻是實(shí)現白盒自動(dòng)化技術(shù)中比較關(guān)鍵的技術(shù)點(diǎn)。今天筆者主要介紹一下最近的研究與實(shí)現成果,在此拋磚引玉,希望國內更多的安全研究人員將精力投入至PHP自動(dòng)化審計技術(shù)這一有意義的領(lǐng)域中。
0x01 基礎知識
自動(dòng)化審計的實(shí)現方式有多種,比如直接使用正則表達式規則庫進(jìn)行定位匹配,這種方法最簡(jiǎn)單,但是準確率是***的。最可靠的思路是結合靜態(tài)分析技術(shù)領(lǐng)域中的知識進(jìn)行設計,一般靜態(tài)分析安全工具的流程大多是下圖的形式:
靜態(tài)分析工作所要做的***件事情就是將源碼進(jìn)行建模,通俗一點(diǎn)講,就是將字符串的源碼轉為方便于我們后續漏洞分析的中間表示形式,即一組代表此代碼的數據結構。建模工作中一般會(huì )采用編譯技術(shù)領(lǐng)域中的方法,如詞法分析生成token,生成抽象語(yǔ)法樹(shù),生成控制流程圖等。建模工作的優(yōu)劣,直接影響到后續污染傳播分析和數據流分析的效果。
執行分析就是結合安全知識,對載入的代碼進(jìn)行漏洞分析和處理。***,靜態(tài)分析工具要生成判斷結果,從而結束這一階段的工作。
0x02 實(shí)現思路
經(jīng)過(guò)一段時(shí)間的努力,筆者和小伙伴也大致實(shí)現了一款針對自動(dòng)化的靜態(tài)分析工具。具體實(shí)現思路正是采用了靜態(tài)分析技術(shù),如果想深入了解實(shí)現思路,可以閱讀之前發(fā)過(guò)的文章。 在工具中,自動(dòng)化審計流程如下:
首先載入用戶(hù)輸入的待掃描的工程目錄中所有的PHP文件,并對這些PHP文件做判別,如果掃描的PHP文件是Main file,即真正處理用戶(hù)請求的PHP文件,那么對這種類(lèi)型的文件進(jìn)行漏洞分析。如果不是Main file類(lèi)型,比如PHP工程中的類(lèi)定義,工具函數定義文件,則跳過(guò)不做分析。
其次進(jìn)行全局數據的搜集,重點(diǎn)搜集的信息有待掃描的工程中類(lèi)信息的定義,如類(lèi)所在的文件路徑、類(lèi)中的屬性、類(lèi)中的方法以及參數等信息。同時(shí)對每個(gè)文件生成文件摘要,文件摘要中重點(diǎn)搜集各個(gè)賦值語(yǔ)句的信息,以及賦值語(yǔ)句中相關(guān)變量的凈化信息和編碼信息。
全局初始化之后,進(jìn)行編譯前端模塊的相關(guān)工作,使用開(kāi)源工具PHP-Parser對待分析的PHP代碼進(jìn)行抽象語(yǔ)法樹(shù)(AST)的構建。在A(yíng)ST的基礎上,使用CFG構建算法構建控制流圖,并實(shí)時(shí)地生成基本塊的摘要信息。
編譯前端的工作中,如果發(fā)現敏感函數的調用,就停下來(lái)進(jìn)行污染傳播分析,進(jìn)行過(guò)程間分析、過(guò)程內分析,找到對應的污點(diǎn)數據。然后基于數據流分析過(guò)程中搜集的信息,進(jìn)行凈化信息和編碼信息的判斷,從而判斷是否為漏洞代碼。
如果上一步是漏洞代碼,則轉入漏洞報告模塊進(jìn)行漏洞代碼段的收集。其實(shí)現的基礎是在系統環(huán)境中維護一個(gè)單例模式的結果集上下文對象,如果生成一條漏洞記錄,則加入至結果集中。當整個(gè)掃描工程結果之后,使用Smarty將結果集輸出到前端,前端做掃描結果的可視化。
0x03 初始化工作
在真實(shí)的PHP審計中,遇到敏感函數的調用,比如_query,我們就會(huì )不由自主地去手動(dòng)分析***個(gè)參數,看是否可控。事實(shí)上,很多CMS都會(huì )將一些數據庫查詢(xún)的方法進(jìn)行封裝,使得調用方便且程序邏輯清晰,比如封裝為一個(gè)類(lèi)MysqlDB。這時(shí),在審計中我們就不會(huì )搜索mysql_query關(guān)鍵字了,而是去找比如db->getOne這種類(lèi)的調用。
那么問(wèn)題來(lái)了,在自動(dòng)化程序進(jìn)行分析的時(shí)候,如何獲知db->getOne函數是個(gè)數據庫的訪(fǎng)問(wèn)類(lèi)方法呢?
這就需要在自動(dòng)化分析的初期就要對整個(gè)工程的所有類(lèi)與定義的方法進(jìn)行搜集,以便于程序在分析的時(shí)候尋找需要跟進(jìn)的方法體。
對于類(lèi)信息和方法信息的搜集,應該作為框架初始化的一部分完成,存儲在單例上下文中:
同時(shí),需要識別分析的PHP文件是否是真正處理用戶(hù)請求的文件,因為有些CMS中,一般會(huì )將封裝好的類(lèi)寫(xiě)入單獨的文件中,比如將數據庫操作類(lèi)或者文件操作類(lèi)封裝到文件中。對于這些文件,進(jìn)行污染傳播分析是沒(méi)有意義的,所以在框架初始化的時(shí)候需要進(jìn)行識別,原理很簡(jiǎn)單,分析調用類(lèi)型語(yǔ)句和定義類(lèi)型語(yǔ)句的比例,根據閾值進(jìn)行判別,錯誤率很小。
***,對每個(gè)文件進(jìn)行摘要操作,這一步的目的是為了后續分析時(shí)碰到require,include等語(yǔ)句時(shí)進(jìn)行文件間分析使用。主要收集變量的賦值、變量的編碼、變量的凈化信息。
0x04 用戶(hù)函數處理
常見(jiàn)的web漏洞,一般都是由于危險參數用戶(hù)可控導致的,這種漏洞稱(chēng)之為污點(diǎn)類(lèi)型漏洞,比如常見(jiàn)的SQLI,XSS等。 PHP內置的一些函數本身是危險的,比如echo可能會(huì )造成反射型XSS。然而真實(shí)代碼中,沒(méi)人會(huì )直接調用一些內置的功能函數,而是進(jìn)行再次封裝,作為自定義的函數,比如:
1234function myexec($cmd)
{
exec($cmd) ;
}
在實(shí)現中,我們的處理流程是:
利用初始化中獲取的上下文信息,定位到相應的方法代碼段
分析這個(gè)代碼片段,查找到危險函數(這里是exec)
定位危險函數中的危險參數(這里是cmd)
如果在分析期間沒(méi)有遇到凈化信息,說(shuō)明該參數可以進(jìn)行傳染,則映射到用戶(hù)函數myexec的***個(gè)參數cmd,并將這個(gè)用戶(hù)自定義函數當做危險函數存放至上下文結構中
遞歸返回,啟動(dòng)污點(diǎn)分析過(guò)程
總結為一句話(huà),我們就是跟入到相應的類(lèi)方法、靜態(tài)方法、函數中,從這些代碼段中查詢(xún)是否有危險函數和危險參數的調用,這些PHP內置的危險函數和參數位置都是放在配置文件中的進(jìn)行配置完成的,如果這些函數和參數一旦被發(fā)現,且判斷危險參數并沒(méi)有被過(guò)濾,則將該用戶(hù)自定義函數作為用戶(hù)自定義危險函數。一旦后續的分析中發(fā)現調用這些函數,則立即啟動(dòng)污點(diǎn)分析。
0x05 處理變量的凈化和編碼
在真實(shí)的審計過(guò)程中,一旦發(fā)現危險參數是可控的,我們就會(huì )迫不及待地去尋找看程序員有沒(méi)有對該變量進(jìn)行有效的過(guò)濾或者編碼,由此判斷是否存在漏洞。 自動(dòng)化審計中,也是遵循這個(gè)思路。在實(shí)現中,首先要對每一個(gè)PHP中的安全函數進(jìn)行統計和配置,在程序分析時(shí),對每一條數據流信息,都應該進(jìn)行回溯收集必要的凈化和編碼信息,比如:
12345$a = $_GET['a'] ;
$a = intval($a) ;
echo $a ;
$a = htmlspecialchars($a) ;
mysql_query($a) ;
上面的代碼片段看起來(lái)有些怪異,但只是作為演示使用。從代碼片段可以看出,變量a經(jīng)過(guò)了intval和htmlspecialchars兩個(gè)凈化處理,根據配置文件,我們順利的收集到了這些信息。這時(shí),要進(jìn)行一次回溯,目的是將當前代碼行向上的凈化和編碼信息進(jìn)行歸并。 比如在第三行時(shí),變量a的凈化信息只有一條intval,但是第五行時(shí),要求將變量a的凈化信息歸并,收集為一個(gè)list集合intval和htmlspecialchars,方法就是收集到前驅代碼中的所有數據流的信息,并進(jìn)行回溯。
細節部分是,當用戶(hù)同時(shí)對同一個(gè)變量調用了如base64_encode和base64_decode兩個(gè)函數,那么這個(gè)變量的base64編碼會(huì )被消除。同樣,如果同時(shí)進(jìn)行轉義和反轉義也要進(jìn)行消除。但是如果調用順序不對或者只進(jìn)行了decode,那么你懂的,相當危險。
0x06 變量回溯和污點(diǎn)分析
1、變量回溯
為了尋找出所有的危險sink點(diǎn)的參數(traceSymbol),將向前回溯與當前Block相連的所有的基本塊,具體過(guò)程如下:
循環(huán)當前基本塊的所有入口邊,查找沒(méi)有經(jīng)過(guò)凈化的traceSymbol并且查找基本塊DataFlow屬性中,traceSymbol的名字。
如果一旦找到,那么就替換成映射的symbol,并且將該符號的所有凈化信息和編碼信息都復制過(guò)來(lái)。然后,追蹤會(huì )在所有的入口邊上進(jìn)行。
***,CFG上不同路徑上的結果會(huì )返回。
當traceSymbol映射到了一個(gè)靜態(tài)字符串、數字等類(lèi)型的靜態(tài)對象或者當前的基本塊沒(méi)有入口邊時(shí),算法就停止。如果traceSymbol是變量或者數組,就要檢查是否在超全局數組中。
2、污點(diǎn)分析
污點(diǎn)分析在過(guò)程間分析處理內置和用戶(hù)定義函數過(guò)程中開(kāi)始,如果程序分析時(shí)遇到了敏感的函數調用,則使用回溯或者從上下文中獲取到危險參數節點(diǎn),并開(kāi)始進(jìn)行污點(diǎn)分析。通俗講,就是進(jìn)行危險參數是否可能導致漏洞的判別。污點(diǎn)分析工作在代碼TaintAnalyser中進(jìn)行實(shí)現,獲取到危險參數后,具體步驟如下:
首先,在當前基本塊中尋找危險參數的賦值情況,尋找DataFlow的右邊節點(diǎn)中是否存在用戶(hù)輸入source,比如$_GET $_POST等超全局數組。并使用不同類(lèi)型漏洞判別的插件類(lèi)判斷這些節點(diǎn)是否是安全的。
如果當前基本塊中沒(méi)有尋找到source,則進(jìn)入本文件多基本塊間分析過(guò)程。首先獲取當前基本塊的所有前驅基本塊,其中前驅基本塊中包含平行結構(if-else if-else),或者非平行結構(普通語(yǔ)句)。并進(jìn)行危險變量分析,如果當前循環(huán)的基本塊中沒(méi)有前驅節點(diǎn),則分析算法結束。
如果基本塊間分析沒(méi)有找到漏洞,則進(jìn)行***的文件間分析。載入當前基本塊之前的包含文件摘要,遍歷這些文件摘要做出判斷。
如果上述步驟中,出現漏洞,則進(jìn)入漏洞報告模塊。否則,系統繼續往下進(jìn)行代碼分析。
0x07 目前的效果
我們對simple-log_v1.3.12進(jìn)行了測試性?huà)呙?,結果是:
Total : 76 XSS : 3 SQLI : 62 INCLUDE : 5 FILE : 3 FILEAFFECT : 1
測試代碼都是一些比較明顯的漏洞,且沒(méi)有使用MVC框架,什么字符截斷吃掉轉義符這種,目前的技術(shù)還真的支持不了,不過(guò)也是可以?huà)叱鲆恍┝?。從測試過(guò)程來(lái)看,bug層出不窮,主要是前期實(shí)現時(shí),很多語(yǔ)法結構與測試用例沒(méi)有考慮進(jìn)去,加上算法幾乎都是遞歸的,所以很容易就造成***遞歸導致Apache跪掉。
所以目前的代碼真的只能算是試驗品,代碼的健壯性需要無(wú)數次重構和大量的測試來(lái)實(shí)現,筆者已經(jīng)沒(méi)有太多時(shí)間維護。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站