搜尋
首頁後端開發php教程PHP自動化白盒審計技術與實現

0x00前言


國內公開的PHP自動化審計技術資料較少,相比之下,國外已經出現了比較優秀的自動化審計實現,比如RIPS是基於token流為基礎進行一系列的代碼分析。傳統靜態分析技術如資料流分析、污染傳播分析應用於PHP這種動態腳本語言分析相對較少,但卻是實現白盒自動化技術中比較關鍵的技術點。今天筆者主要介紹一下最近的研究與實現成果,在此拋磚引玉,希望國內更多的安全研究人員將精力投入到PHP自動化審計技術這一有意義的領域中。

0x01 基礎知識


自動化審計的實現方式有多種,例如直接使用正規表示式規則庫進行定位匹配,這種方法最簡單,但是準確率是最低的。最可靠的想法是結合靜態分析技術領域中的知識進行設計,一般靜態分析安全工具的流程大多是下圖的形式:

靜態分析工作要做的第一件事情就是將原始碼建模,通俗一點講,就是將字串的原始碼轉為方便於我們後續漏洞分析的中間表示形式,即一組代表此程式碼的資料結構。建模工作中一般會採用編譯技術領域中的方法,如詞法分析生成token,產生抽象語法樹,產生控制流程圖等。建模工作的優劣,直接影響後續污染傳播分析與資料流分析的效果。
執行分析就是結合安全知識,對載入的程式碼進行漏洞分析與處理。最後,靜態分析工具要產生判斷結果,從而結束這階段的工作。

0x02 實現思維


經過一段時間的努力,筆者和小夥伴也大致實現了一款針對自動化的靜態分析工具。具體實現思路正是採用了靜態分析技術,如果想深入了解實現思路,可以閱讀之前發過的文章。
在工具中,自動化審計流程如下:

  • 首先載入用戶輸入的待掃描的工程目錄中所有的PHP文件,並對這些PHP文件做判別,如果掃描的PHP文件是Main file,即真正處理使用者請求的PHP文件,那麼對這種類型的文件進行漏洞分析。如果不是Main file類型,例如PHP工程中的類別定義,工具函數定義文件,則跳過不做分析。
  • 其次進行全域資料的蒐集,重點蒐集的資訊有待掃描的工程中類別資訊的定義,如類別所在的檔案路徑、類別中的屬性、類別中的方法、參數等資訊。同時對每個文件產生文件摘要,文件摘要中重點蒐集各個賦值語句的訊息,以及賦值語句中相關變數的淨化訊息和編碼訊息。
  • 全域初始化之後,進行編譯前端模組的相關工作,使用開源工具PHP-Parser對待分析的PHP程式碼進行抽象語法樹(AST)的建構。在AST的基礎上,使用CFG建立演算法建立控制流程圖,並即時產生基本區塊的摘要資訊。
  • 編譯前端的工作中,如果發現敏感函數的調用,就停下來進行污染傳播分析,進行過程間分析、過程內分析,找到對應的污點數據。再根據資料流程分析過程中蒐集的訊息,進行淨化資訊和編碼資訊的判斷,從而判斷是否為漏洞代碼。
    如果上一步是漏洞程式碼,則轉入漏洞報告模組進行漏洞程式碼段的收集。其實現的基礎是在系統環境中維護一個單例模式的結果集上下文對象,如果產生一條漏洞記錄,則加入至結果集中。當整個掃描工程結果之後,使用Smarty將結果集輸出到前端,前端做掃描結果的視覺化。

0x03 初始化工作


在真實的PHP審計中,遇到敏感函數的調用,例如mysql_query,我們就會不由自主地去手動分析第一個參數,看是否可控。事實上,許多CMS都會將一些資料庫查詢的方法封裝,讓呼叫方便且程式邏輯清晰,例如封裝為一個類別MysqlDB。這時,在審計中我們就不會搜尋mysql_query關鍵字了,而是去找例如db->getOne這種類別的呼叫。
那麼問題來了,在自動化程式進行分析的時候,如何獲知db->getOne函數是個資料庫的存取類別方法呢?
這就需要在自動化分析的初期就要對整個工程的所有類別與定義的方法進行蒐集,以便於程式在分析的時候尋找需要跟進的方法體。
對於類別資訊和方法資訊的蒐集,應該作為框架初始化的一部分完成,儲存在單例上下文中:

同時,需要識別分析的PHP文件是否是真正處理使用者請求的文件,因為有些CMS中,一般會將封裝好的類別寫入單獨的文件中,例如將資料庫操作類別或文件操作類別封裝到文件中。對於這些文件,進行污染傳播分析是沒有意義的,所以在框架初始化的時候需要進行識別,原理很簡單,分析調用類型語句和定義類型語句的比例,根據閾值進行判別,錯誤率很小。
最後,對每個文件進行摘要操作,這一步驟的目的是為了後續分析時碰到require,include等語句時進行文件間分析使用。主要收集變數的賦值、變數的編碼、變數的淨化資訊。

0x04 使用者函數處理


常見的web漏洞,一般都是由於危險參數使用者可控導致的,這種漏洞稱之為污點類型漏洞,例如常見的SQLI,XSS等。
PHP內建的一些函數本身是危險的,例如echo可能會造成反射型XSS。然而在真實程式碼中,沒人會直接呼叫一些內建的功能函數,而是進行再次封裝,作為自訂的函數,例如:

<code><span><span>function</span><span>myexec</span><span>(<span>$cmd</span>)</span>
{</span>
    exec(<span>$cmd</span>) ;
}</code>

在實作中,我們的處理流程是:

  • 利用初始化中獲取的上下文信息,定位到相應的方法代碼段
  • 分析這個代碼片段,查找到危險函數(這裡是exec)
  • 定位危險函數中的危險參數(這裡是cmd)
  • 如果在分析期間沒有遇到淨化訊息,說明該參數可以進行傳染,則映射到用戶函數myexec的第一個參數cmd,並將這個用戶自定義函數當做危險函數存放至上下文結構中
  • 遞歸返回,啟動污點分析過程

總結為一句話,我們就是跟入到相應的類別方法、靜態方法、函數中,從這些代碼段中查詢是否有危險函數和危險參數的調用,這些PHP內建的危險函數和參數位置都是放在設定檔中的進行設定完成的,如果這些函數和參數一旦被發現,且判斷危險參數並沒有被過濾,則將該使用者自訂函數作為使用者自訂危險函數。一旦後續的分析中發現呼叫這些函數,則立即啟動污點分析。

0x05 處理變數的淨化和編碼


在真實的審計過程中,一旦發現危險參數是可控制的,我們就會迫不及待地去尋找看程式設計師有沒有對該變數進行有效的過濾或編碼,由此判斷是否存在漏洞。
自動化審計中,也是遵循這個想法。在實現中,首先要對每一個PHP中的安全函數進行統計和配置,在程序分析時,對每一條數據流信息,都應該進行回溯收集必要的淨化和編碼信息,比如:

<code><span>$a</span> = <span>$_GET</span>[<span>'a'</span>] ;
<span>$a</span> = intval(<span>$a</span>) ;
<span>echo</span><span>$a</span> ;
<span>$a</span> = htmlspecialchars(<span>$a</span>) ;
mysql_query(<span>$a</span>) ;</code>

上面的程式碼片段看起來有些怪異,但只是作為演示。從程式碼片段可以看出,變數a經過了intval和htmlspecialchars兩個淨化處理,根據設定文件,我們順利的收集到了這些資訊。這時,要進行一次回溯,目的是將目前程式碼行向上的淨化和編碼訊息進行歸併。
例如在第三行時,變數a的淨化資訊只有一條intval,但是第五行時,要求將變數a的淨化資訊歸併,收集為一個list集合intval和htmlspecialchars,方法就是收集到前驅程式碼中的所有資料流的訊息,並進行回溯。

細節部分是,當使用者同時對同一個變數呼叫瞭如base64_encode和base64_decode兩個函數,那麼這個變數的base64編碼就會被消除。同樣,如果同時進行轉義和反轉義也要進行消除。但是如果呼叫順序不對或只進行了decode,那麼你懂的,相當危險。

0x06 變數回溯與污點分析


1、變數回溯

為了尋找所有的危險sink點的參數(traceSymbol),將向前回溯與當前Block相連的所有的基本塊,具體過程如下:

  • 循環當前基本塊的所有入口邊,查找沒有經過淨化的traceSymbol並且尋找基本區塊DataFlow屬性中,traceSymbol的名字。
  • 如果一旦找到,那麼就替換成映射的symbol,並且將該符號的所有淨化信息和編碼信息都複製過來。然後,追蹤會在所有的入口邊上進行。
  • 最後,CFG上不同路徑上的結果會回傳。

當traceSymbol映射到了一個靜態字串、數字等類型的靜態物件或當前的基本區塊沒有入口邊時,演算法就停止。如果traceSymbol是變數或數組,就要檢查是否在超全域數組中。

2、污點分析

污點分析在過程間分析處理內置和用戶定義函數過程中開始,如果程序分析時遇到了敏感的函數調用,則使用回溯或者從上下文中獲取到危險參數節點,並開始進行污點分析。通俗講,就是進行危險參數是否可能導致漏洞的判別。污點分析工作在程式碼TaintAnalyser中進行實現,取得到危險參數後,具體步驟如下:

  • 首先,在當前基本區塊中尋找危險參數的賦值情況,尋找DataFlow的右邊節點中是否存在使用者輸入節點source,例如 以上就介紹了PHP自動化白盒審計技術與實現,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP和Python:解釋了不同的範例PHP和Python:解釋了不同的範例Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python:深入了解他們的歷史PHP和Python:深入了解他們的歷史Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

在PHP和Python之間進行選擇:指南在PHP和Python之間進行選擇:指南Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和框架:現代化語言PHP和框架:現代化語言Apr 18, 2025 am 12:14 AM

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHP的影響:網絡開發及以後PHP的影響:網絡開發及以後Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP如何處理對象克隆(克隆關鍵字)和__clone魔法方法?PHP如何處理對象克隆(克隆關鍵字)和__clone魔法方法?Apr 17, 2025 am 12:24 AM

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP與Python:用例和應用程序PHP與Python:用例和應用程序Apr 17, 2025 am 12:23 AM

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境