php代码审计的挖掘思路
工具
這里我使用的是seay源代碼審計系統
下載傳送門
路由分析
什么是路由?
一個網站有許多不同的功能點,就像路由器一樣知道這個網絡的走向是在哪里。分析好路由走向有助于更好審計代碼
如何發現路由
部分開發人員的寫法,是將路由配置信息寫入到一個文件中,便于對源碼進行分析,我們也可以利用這點。
1.搜索關鍵字眼
如有關路由的信息
2.查看include文件下的文件
安全過濾文件或者文件配置信息都有可能在這個文件夾下
在這里可以發現在這個文件在這個目錄下使用了自定義函數來保護應用程序的安全。
irequestsplite()是自定義函數,用于處理輸入的數據,防止跨站腳本攻擊(XSS)。
function irequestsplite($var) { // 該函數接受一個變量 $varif (is_array($var)) { // 如果 $var 是一個數組foreach ($var as $key => $value) { //就遍歷它的每個元素 $var[htmlspecialchars($key)] = irequestsplite($value); //然后使用 htmlspecialchars() 函數將特殊字符轉換為 HTML 實體,以防止 HTML 代碼注入和 XSS 攻擊 }} else { $var = str_replace('&', '&', htmlspecialchars($var, ENT_QUOTES));}return $var; //最后將轉換后的值重新賦值給數組的相應鍵名 }3.了解訪問的url與網站目錄的關系
當路由信息相關的文件沒有找到時,也可以嘗試理解開發人員的思路。比如,url中的變量接受指向的是哪個文件,這樣瀏覽頁面的時候就清晰的知道是哪個關鍵文件
這里以baijiacms的登錄頁面為例,可以看見url中的三個接受變量不知道是什么意思
我們可以利用這三個接受變量值的名稱, mobile、public、index 當作關鍵字眼,這時候來到網站目錄的文件中翻一下。可以發現這些接受值都和箭頭指向的框框的文件名一模一樣,果然是存在規律。
登錄后臺頁面,進一步分析 site、manager、store這三個關鍵字
?mod=site&act=manager&do=store&op=display&beid=1
再次翻看網站目錄的文件名發現除了web,剩下兩個都符合
這時候修改url,將site改為web進行訪問,發現沒有任何報錯信息,證明了開發人員就是這樣訪問文件的功能點
?mod=web&act=manager&do=store&op=display&beid=1我們知道了只要是url中的接受值都是在system目錄下中的文件進行主要的作用,這意味著代碼審計這個baijiacms 可以主要把重點放到這個目錄上
框架
上面講述的是無框架的情況,在有框架情況下,它的函數文件集合(各種方法function)會比較規整,通常路由分析的時候總是在某些固定文件夾中。
審計思路
目前比較主流的設計模式是MVC,即多層模型(M)、視圖(V)、控制器(C),在此不多贅述,php的主流框架幾乎都使用了MVC設計模式。
面對有框架的情況下,我們只需要參考對應框架的寫法即可,不過一般使用框架的開發都很安全,除非開發者,一半按著框架固定寫,另一半不按。通常只需要檢測開發者是否規范按官方語言框架的編寫即可
關于框架審計思路可以參考這篇:
https://www.anquanke.com/post/id/265092#h2-3挖掘技巧
從代碼方向進行審計: 尋找自定義函數-> 審計自定義函數的代碼 ->審計使用自定義函數的代碼是否有可控變量 -> poc 尋找敏感函數 -> 審計使用敏感函數的代碼 -> 該代碼的變量是否可控 -> poc 尋找自定義變量 -> 審計變量是否可控 -> 是否能執行特定的函數功能 -> poc從功能點進行審計: 瀏覽頁面 -> 找到相關頁面的源碼進行審計從代碼方向進行審計
定位自定義函數
比如我想搜索有關上傳操作的函數,可以看見開發者自定義的函數
進去之后審計這個自定義函數,可以發現并沒有進行任何過濾
這時候可以尋找使用這個函數的相關代碼,使用這個函數的代碼都可能存在漏洞,右鍵點擊全局搜索進行查找
可以發現剛好就只有個一個文件使用了這個函數功能,點擊進去審計
在這里可以看見url的接受變量,那么我們可以在這里進行構造poc
至于為什么mod還有do的接受變量是這個,就不在贅述了,前面講解過了
poc如下:
上傳惡意的遠程文件
可以看見成功執行
定位敏感函數
搜索相關的惡意函數,然后進行反向溯源審計代碼即可,思路和上面的一樣
一些相關的惡意函數
//命令執行 system passthru exec system shell_exec 或者 `(反引號) eval assert call_user_func call_user_func//文件包含 include require require_once include_once//sql 關鍵字:select,insert,update,mysql_query,mysqli mysql_query odbc_exec mysqli_query mysql_db_query mysql_unbuffered_query mysqli::query 用法 $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); $mysqli->query();//文件讀取&SSRF file_get_contents readfile //同file_get_contents file //把整個文件讀入一個數組中 fopen/fread/fgets/fgetss /fgetc/fgetcsv/fpassthru/fscanf simplexml_load_file //讀取文件作為XML文檔解析 simplexml_load_string //加載解析XML字符串 有可能存在XXE 漏洞 parse_ini_file // 讀取并解析一個ini配置文件 highlight_file/show_source//文件操作 file_put_contents //將一個字符串寫入文件 move_uploaded_file //將上傳的臨時文件移動到新的位置 rmdir //刪除目錄 unlink //刪除文件 copy //復制 mkdir //創建目錄//xxs echo print_r定位可控變量
從代碼的變量檢查是否可控,然后進行反向溯源,審計用戶的輸入是否有害,能執行功能的函數又是什么
一些相關的接受變量
$_GET or $HTTP_GET_VARS $_POST or $HTTP_POST_VARS $_REQUEST $_SERVER // 服務器信息 環境變量 用戶傳入的http頭和uri路徑等信息 $_FILES $HTTP_POST_FILES //包含 用戶上傳文件信息 文件內容 原文件名 臨時文件名 大小 等信息 $_COOKIE $HTTP_COOKIE_VARS // 包含 用戶傳入的HTTP頭中的Cookies kv值 php://input$HTTP_RAW_POST_DATA // 包含 用戶POST請求中BODY 的完整數據 常見用法 file_get_contents('php://input');從功能點進行審計
了解網站的功能的方向
根據程序的源碼的一個應用方向的原理進行判斷,如果網站偏向于社交那么就存在數據交互注入和跨站多一點,如文件操作類的漏洞,就有上傳和下載的功能點,那么可能存在文件上傳,下載,包含,刪除的漏洞。這時候審計功能點對應的代碼,嘗試挖掘是否存在漏洞
完全審計代碼
一般不推薦,時間長,代碼功底好的當我沒說
總結
代碼審計,首先要看懂開發人員的思路,其次要看懂代碼的走向,最后考慮如何繞過或利用可控變量和惡意函數。
總結
以上是生活随笔為你收集整理的php代码审计的挖掘思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppt幻灯片如何直接转换成pdf电子书
- 下一篇: IDEA如何设置快捷键快速缩小和放大代码