1 php代碼審計的意義
1.1 什么是代碼審計
就是獲取目標的代碼,這個目標可以是一個網站,也可以是一個手機app
1.2 黑盒測試與白盒測試的區別
在代碼審計中黑盒和白盒的主要區別就在于是否可以拿到源代碼,黑盒是拿不到源代碼的,白盒是可以拿到的
1.3 是否應該學習代碼審計
測試流程必不可少的一部分 突破滲透測試的瓶頸 參與眾測,贏取高額獎金
1.4 代碼審計,需要學到什么程度
不需要像安全研究人員一樣,挖掘到一些0day,才說明大家學會代碼審計
2 PHP代碼審計入門必備知識
2.1 代碼審計需要使用那些軟件
Seay源代碼審計系統 快速函數定位 自定義多窗口搜索 MySQL執行監控 一鍵調試選中代碼 文檔自動查詢 自動審計
2.2 PHP代碼審計流程
2.2.1 通讀全文法
通讀全文法作為最麻煩的方法也是最全面的審計方法,特別是大型的項目,通讀全文也是了解整個項目,了解業務邏輯最好方法,了解整個項目,這樣也可以挖掘到更多的中高危漏洞
2.2.2 敏感函數參數回溯法
這個方法是最有效的,最常用的方法,大多數漏洞的產生是因為函數的使用不當導致的,我們可以全局搜索一些敏感函數,看看是否有未經過濾的參數傳進來,就可以挖掘漏洞,這里我們也可以使用Seay源代碼審計系統
2.2.3 定向功能分析法
這個方法主要是根據程序的業務邏輯來進行代碼審計的 查看網站的功能,大概推測可能存在那些漏洞
常見的功能漏洞 程序初始安裝 文件上傳 數據庫備份 找回密碼 驗證碼
2.3 PHP服務架構
CLI(在命令行中運行) PHP Built-in Webserver Apache php_mod Swoole
2.4 PHP安全配置
magic_quotes_gpc:5.3后廢棄,5.4后移除 register_global:4.2后默認為false allow_url_include:默認false allow_url_fopen:默認false request_order:5.3后從GPC改為GP short_open_tag:5.4以后,無論是否開啟,<?=..?>總是可以被執行 open_basedir:限制PHP可以訪問到那些目錄,哪些目錄不能訪問 disable_functions/disable_classes:限制PHP不能執行那些函數或者類 enable_dll:是否允許加載PHP擴展
3 PHP危險函數歸納
3.1 函數歸納
include/require/include_once/require_once eval/assert/preg_replace/create_function system/passthru/exec/shell_exec file_get_contents/fread/readfile/file/show_source file_put_contents/fwrite/mkdir unlink/rmdir move_uploaded_file/copy/rename extract/parse_str simplexml_load_files/simplexal_load_string unserialize urldecode/base64_decode
3.2 代碼執行函數
eval 把字符串作為PHP代碼執行,很多常見的webshell都是用eval來執行具體操作的 assert 也是把字符串作為PHP代碼執行 preg_replace 是正則表達式函數
3.3 包含函數
文件包含函數主要作用為包含并運行指定文件 include $file,如果$file可控的情況下,我們就可以包含任意文件了,從而達到getshell的目的 包含函數也能夠讀取任意文件內容,這就需要用到支持的協議和封裝協議和過濾器
3.4命令執行函數
exec() 執行一個外部程序 system() 執行外部程序,并且顯示輸出 只要命令就能執行的參數可控系統命令
3.5 文件操作函數
copy:拷貝文件 file_get_contents:將整個文件讀入一個字符串 file_put_contents:將一個字符串寫入文件 unlink:刪除文件 rmdir:刪除目錄
3.6 一些有漏洞的應用練習
XZ.Aliyun.com Github.com Wooyun鏡像站點漏洞