PHP自動(dòng)化白盒審計(jì)技術(shù)的介紹與實(shí)現(xiàn)方式

本篇內(nèi)容主要講解“PHP自動(dòng)化白盒審計(jì)技術(shù)的介紹與實(shí)現(xiàn)方式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PHP自動(dòng)化白盒審計(jì)技術(shù)的介紹與實(shí)現(xiàn)方式”吧!

本篇內(nèi)容主要講解“PHP自動(dòng)化白盒審計(jì)技術(shù)的介紹與實(shí)現(xiàn)方式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PHP自動(dòng)化白盒審計(jì)技術(shù)的介紹與實(shí)現(xiàn)方式”吧!

成都創(chuàng)新互聯(lián)專注于孝昌企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站開發(fā)。孝昌網(wǎng)站建設(shè)公司,為孝昌等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

0x00 前言

國(guó)內(nèi)公開的PHP自動(dòng)化審計(jì)技術(shù)資料較少,相比之下,國(guó)外已經(jīng)出現(xiàn)了比較優(yōu)秀的自動(dòng)化審計(jì)實(shí)現(xiàn),比如RIPS是基于token流為基礎(chǔ)進(jìn)行一系列的代碼分析。傳統(tǒng)靜態(tài)分析技術(shù)如數(shù)據(jù)流分析、污染傳播分析應(yīng)用于PHP這種動(dòng)態(tài)腳本語言分析相對(duì)較少,但是卻是實(shí)現(xiàn)白盒自動(dòng)化技術(shù)中比較關(guān)鍵的技術(shù)點(diǎn)。今天筆者主要介紹一下最近的研究與實(shí)現(xiàn)成果,在此拋磚引玉,希望國(guó)內(nèi)更多的安全研究人員將精力投入至PHP自動(dòng)化審計(jì)技術(shù)這一有意義的領(lǐng)域中。

0x01 基礎(chǔ)知識(shí)

自動(dòng)化審計(jì)的實(shí)現(xiàn)方式有多種,比如直接使用正則表達(dá)式規(guī)則庫(kù)進(jìn)行定位匹配,這種方法最簡(jiǎn)單,但是準(zhǔn)確率是***的。最可靠的思路是結(jié)合靜態(tài)分析技術(shù)領(lǐng)域中的知識(shí)進(jìn)行設(shè)計(jì),一般靜態(tài)分析安全工具的流程大多是下圖的形式:

靜態(tài)分析工作所要做的***件事情就是將源碼進(jìn)行建模,通俗一點(diǎn)講,就是將字符串的源碼轉(zhuǎn)為方便于我們后續(xù)漏洞分析的中間表示形式,即一組代表此代碼的數(shù)據(jù)結(jié)構(gòu)。建模工作中一般會(huì)采用編譯技術(shù)領(lǐng)域中的方法,如詞法分析生成token,生成抽象語法樹,生成控制流程圖等。建模工作的優(yōu)劣,直接影響到后續(xù)污染傳播分析和數(shù)據(jù)流分析的效果。

執(zhí)行分析就是結(jié)合安全知識(shí),對(duì)載入的代碼進(jìn)行漏洞分析和處理。***,靜態(tài)分析工具要生成判斷結(jié)果,從而結(jié)束這一階段的工作。

0x02 實(shí)現(xiàn)思路

經(jīng)過一段時(shí)間的努力,筆者和小伙伴也大致實(shí)現(xiàn)了一款針對(duì)自動(dòng)化的靜態(tài)分析工具。具體實(shí)現(xiàn)思路正是采用了靜態(tài)分析技術(shù),如果想深入了解實(shí)現(xiàn)思路,可以閱讀之前發(fā)過的文章。 在工具中,自動(dòng)化審計(jì)流程如下:

首先載入用戶輸入的待掃描的工程目錄中所有的PHP文件,并對(duì)這些PHP文件做判別,如果掃描的PHP文件是Main file,即真正處理用戶請(qǐng)求的PHP文件,那么對(duì)這種類型的文件進(jìn)行漏洞分析。如果不是Main file類型,比如PHP工程中的類定義,工具函數(shù)定義文件,則跳過不做分析。

其次進(jìn)行全局?jǐn)?shù)據(jù)的搜集,重點(diǎn)搜集的信息有待掃描的工程中類信息的定義,如類所在的文件路徑、類中的屬性、類中的方法以及參數(shù)等信息。同時(shí)對(duì)每個(gè)文件生成文件摘要,文件摘要中重點(diǎn)搜集各個(gè)賦值語句的信息,以及賦值語句中相關(guān)變量的凈化信息和編碼信息。

全局初始化之后,進(jìn)行編譯前端模塊的相關(guān)工作,使用開源工具PHP-Parser對(duì)待分析的PHP代碼進(jìn)行抽象語法樹(AST)的構(gòu)建。在AST的基礎(chǔ)上,使用CFG構(gòu)建算法構(gòu)建控制流圖,并實(shí)時(shí)地生成基本塊的摘要信息。

編譯前端的工作中,如果發(fā)現(xiàn)敏感函數(shù)的調(diào)用,就停下來進(jìn)行污染傳播分析,進(jìn)行過程間分析、過程內(nèi)分析,找到對(duì)應(yīng)的污點(diǎn)數(shù)據(jù)。然后基于數(shù)據(jù)流分析過程中搜集的信息,進(jìn)行凈化信息和編碼信息的判斷,從而判斷是否為漏洞代碼。

如果上一步是漏洞代碼,則轉(zhuǎn)入漏洞報(bào)告模塊進(jìn)行漏洞代碼段的收集。其實(shí)現(xiàn)的基礎(chǔ)是在系統(tǒng)環(huán)境中維護(hù)一個(gè)單例模式的結(jié)果集上下文對(duì)象,如果生成一條漏洞記錄,則加入至結(jié)果集中。當(dāng)整個(gè)掃描工程結(jié)果之后,使用Smarty將結(jié)果集輸出到前端,前端做掃描結(jié)果的可視化。

0x03 初始化工作

在真實(shí)的PHP審計(jì)中,遇到敏感函數(shù)的調(diào)用,比如_query,我們就會(huì)不由自主地去手動(dòng)分析***個(gè)參數(shù),看是否可控。事實(shí)上,很多CMS都會(huì)將一些數(shù)據(jù)庫(kù)查詢的方法進(jìn)行封裝,使得調(diào)用方便且程序邏輯清晰,比如封裝為一個(gè)類MysqlDB。這時(shí),在審計(jì)中我們就不會(huì)搜索mysql_query關(guān)鍵字了,而是去找比如db->getOne這種類的調(diào)用。

那么問題來了,在自動(dòng)化程序進(jìn)行分析的時(shí)候,如何獲知db->getOne函數(shù)是個(gè)數(shù)據(jù)庫(kù)的訪問類方法呢?

這就需要在自動(dòng)化分析的初期就要對(duì)整個(gè)工程的所有類與定義的方法進(jìn)行搜集,以便于程序在分析的時(shí)候?qū)ふ倚枰M(jìn)的方法體。

對(duì)于類信息和方法信息的搜集,應(yīng)該作為框架初始化的一部分完成,存儲(chǔ)在單例上下文中:

同時(shí),需要識(shí)別分析的PHP文件是否是真正處理用戶請(qǐng)求的文件,因?yàn)橛行〤MS中,一般會(huì)將封裝好的類寫入單獨(dú)的文件中,比如將數(shù)據(jù)庫(kù)操作類或者文件操作類封裝到文件中。對(duì)于這些文件,進(jìn)行污染傳播分析是沒有意義的,所以在框架初始化的時(shí)候需要進(jìn)行識(shí)別,原理很簡(jiǎn)單,分析調(diào)用類型語句和定義類型語句的比例,根據(jù)閾值進(jìn)行判別,錯(cuò)誤率很小。

***,對(duì)每個(gè)文件進(jìn)行摘要操作,這一步的目的是為了后續(xù)分析時(shí)碰到require,include等語句時(shí)進(jìn)行文件間分析使用。主要收集變量的賦值、變量的編碼、變量的凈化信息。

0x04 用戶函數(shù)處理

常見的web漏洞,一般都是由于危險(xiǎn)參數(shù)用戶可控導(dǎo)致的,這種漏洞稱之為污點(diǎn)類型漏洞,比如常見的SQLI,XSS等。 PHP內(nèi)置的一些函數(shù)本身是危險(xiǎn)的,比如echo可能會(huì)造成反射型XSS。然而真實(shí)代碼中,沒人會(huì)直接調(diào)用一些內(nèi)置的功能函數(shù),而是進(jìn)行再次封裝,作為自定義的函數(shù),比如:

1234function myexec($cmd)

{

exec($cmd) ;

}

在實(shí)現(xiàn)中,我們的處理流程是:

利用初始化中獲取的上下文信息,定位到相應(yīng)的方法代碼段

分析這個(gè)代碼片段,查找到危險(xiǎn)函數(shù)(這里是exec)

定位危險(xiǎn)函數(shù)中的危險(xiǎn)參數(shù)(這里是cmd)

如果在分析期間沒有遇到凈化信息,說明該參數(shù)可以進(jìn)行傳染,則映射到用戶函數(shù)myexec的***個(gè)參數(shù)cmd,并將這個(gè)用戶自定義函數(shù)當(dāng)做危險(xiǎn)函數(shù)存放至上下文結(jié)構(gòu)中

遞歸返回,啟動(dòng)污點(diǎn)分析過程

總結(jié)為一句話,我們就是跟入到相應(yīng)的類方法、靜態(tài)方法、函數(shù)中,從這些代碼段中查詢是否有危險(xiǎn)函數(shù)和危險(xiǎn)參數(shù)的調(diào)用,這些PHP內(nèi)置的危險(xiǎn)函數(shù)和參數(shù)位置都是放在配置文件中的進(jìn)行配置完成的,如果這些函數(shù)和參數(shù)一旦被發(fā)現(xiàn),且判斷危險(xiǎn)參數(shù)并沒有被過濾,則將該用戶自定義函數(shù)作為用戶自定義危險(xiǎn)函數(shù)。一旦后續(xù)的分析中發(fā)現(xiàn)調(diào)用這些函數(shù),則立即啟動(dòng)污點(diǎn)分析。

0x05 處理變量的凈化和編碼

在真實(shí)的審計(jì)過程中,一旦發(fā)現(xiàn)危險(xiǎn)參數(shù)是可控的,我們就會(huì)迫不及待地去尋找看程序員有沒有對(duì)該變量進(jìn)行有效的過濾或者編碼,由此判斷是否存在漏洞。 自動(dòng)化審計(jì)中,也是遵循這個(gè)思路。在實(shí)現(xiàn)中,首先要對(duì)每一個(gè)PHP中的安全函數(shù)進(jìn)行統(tǒng)計(jì)和配置,在程序分析時(shí),對(duì)每一條數(shù)據(jù)流信息,都應(yīng)該進(jìn)行回溯收集必要的凈化和編碼信息,比如:

12345$a = $_GET['a'] ;

$a = intval($a) ;

echo $a ;

$a = htmlspecialchars($a) ;

mysql_query($a) ;

上面的代碼片段看起來有些怪異,但只是作為演示使用。從代碼片段可以看出,變量a經(jīng)過了intval和htmlspecialchars兩個(gè)凈化處理,根據(jù)配置文件,我們順利的收集到了這些信息。這時(shí),要進(jìn)行一次回溯,目的是將當(dāng)前代碼行向上的凈化和編碼信息進(jìn)行歸并。 比如在第三行時(shí),變量a的凈化信息只有一條intval,但是第五行時(shí),要求將變量a的凈化信息歸并,收集為一個(gè)list集合intval和htmlspecialchars,方法就是收集到前驅(qū)代碼中的所有數(shù)據(jù)流的信息,并進(jìn)行回溯。

細(xì)節(jié)部分是,當(dāng)用戶同時(shí)對(duì)同一個(gè)變量調(diào)用了如base64_encode和base64_decode兩個(gè)函數(shù),那么這個(gè)變量的base64編碼會(huì)被消除。同樣,如果同時(shí)進(jìn)行轉(zhuǎn)義和反轉(zhuǎn)義也要進(jìn)行消除。但是如果調(diào)用順序不對(duì)或者只進(jìn)行了decode,那么你懂的,相當(dāng)危險(xiǎn)。

0x06 變量回溯和污點(diǎn)分析

1、變量回溯

為了尋找出所有的危險(xiǎn)sink點(diǎn)的參數(shù)(traceSymbol),將向前回溯與當(dāng)前Block相連的所有的基本塊,具體過程如下:

循環(huán)當(dāng)前基本塊的所有入口邊,查找沒有經(jīng)過凈化的traceSymbol并且查找基本塊DataFlow屬性中,traceSymbol的名字。

如果一旦找到,那么就替換成映射的symbol,并且將該符號(hào)的所有凈化信息和編碼信息都復(fù)制過來。然后,追蹤會(huì)在所有的入口邊上進(jìn)行。

***,CFG上不同路徑上的結(jié)果會(huì)返回。

當(dāng)traceSymbol映射到了一個(gè)靜態(tài)字符串、數(shù)字等類型的靜態(tài)對(duì)象或者當(dāng)前的基本塊沒有入口邊時(shí),算法就停止。如果traceSymbol是變量或者數(shù)組,就要檢查是否在超全局?jǐn)?shù)組中。

2、污點(diǎn)分析

污點(diǎn)分析在過程間分析處理內(nèi)置和用戶定義函數(shù)過程中開始,如果程序分析時(shí)遇到了敏感的函數(shù)調(diào)用,則使用回溯或者從上下文中獲取到危險(xiǎn)參數(shù)節(jié)點(diǎn),并開始進(jìn)行污點(diǎn)分析。通俗講,就是進(jìn)行危險(xiǎn)參數(shù)是否可能導(dǎo)致漏洞的判別。污點(diǎn)分析工作在代碼TaintAnalyser中進(jìn)行實(shí)現(xiàn),獲取到危險(xiǎn)參數(shù)后,具體步驟如下:

首先,在當(dāng)前基本塊中尋找危險(xiǎn)參數(shù)的賦值情況,尋找DataFlow的右邊節(jié)點(diǎn)中是否存在用戶輸入source,比如$_GET $_POST等超全局?jǐn)?shù)組。并使用不同類型漏洞判別的插件類判斷這些節(jié)點(diǎn)是否是安全的。

如果當(dāng)前基本塊中沒有尋找到source,則進(jìn)入本文件多基本塊間分析過程。首先獲取當(dāng)前基本塊的所有前驅(qū)基本塊,其中前驅(qū)基本塊中包含平行結(jié)構(gòu)(if-else if-else),或者非平行結(jié)構(gòu)(普通語句)。并進(jìn)行危險(xiǎn)變量分析,如果當(dāng)前循環(huán)的基本塊中沒有前驅(qū)節(jié)點(diǎn),則分析算法結(jié)束。

如果基本塊間分析沒有找到漏洞,則進(jìn)行***的文件間分析。載入當(dāng)前基本塊之前的包含文件摘要,遍歷這些文件摘要做出判斷。

如果上述步驟中,出現(xiàn)漏洞,則進(jìn)入漏洞報(bào)告模塊。否則,系統(tǒng)繼續(xù)往下進(jìn)行代碼分析。

0x07 目前的效果

 

我們對(duì)simple-log_v1.3.12進(jìn)行了測(cè)試性掃描,結(jié)果是:

Total : 76 XSS : 3 SQLI : 62 INCLUDE : 5 FILE : 3 FILEAFFECT : 1

測(cè)試代碼都是一些比較明顯的漏洞,且沒有使用MVC框架,什么字符截?cái)喑缘艮D(zhuǎn)義符這種,目前的技術(shù)還真的支持不了,不過也是可以掃出一些了。從測(cè)試過程來看,bug層出不窮,主要是前期實(shí)現(xiàn)時(shí),很多語法結(jié)構(gòu)與測(cè)試用例沒有考慮進(jìn)去,加上算法幾乎都是遞歸的,所以很容易就造成***遞歸導(dǎo)致Apache跪掉。

所以目前的代碼真的只能算是試驗(yàn)品,代碼的健壯性需要無數(shù)次重構(gòu)和大量的測(cè)試來實(shí)現(xiàn),筆者已經(jīng)沒有太多時(shí)間維護(hù)。

當(dāng)前標(biāo)題:PHP自動(dòng)化白盒審計(jì)技術(shù)的介紹與實(shí)現(xiàn)方式
本文來源:http://muchs.cn/article32/gspc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、商城網(wǎng)站虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名