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教程有興趣的朋友有所幫助。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。
