思路一
簡單正則匹配危險函數,跟入函數看輸入變量是否可控。
優點
簡單,可用程序完成不少工作。
缺點
- 誤報多,需要一個個確認輸入變量。
- 不容易發現二次注入之類二次漏洞。
參考
- seay代碼審計工具
思路二
解析程序語法樹,分析危險函數調用關系
優點
- 純靜態分析,可全由程序處理
- 可發現漏洞類型全,誤報少
缺點
- 實現難
- 無法直接處理面向對象類型的代碼
參考
RIPS
這個rips已經做的很好了,所以還沒有自己去實現
思路三
將程序當作黑盒,外部通過工具查找輸入,做出各種fuzz。觀察並記錄黑盒所有操作,如web請求,sql執行記錄/錯誤記錄,文件系統變更情況,php代碼執行記錄。而后和fuzz變量做比對,找出對應結果(或者可以通過時間來找出對應),記下fuzz請求即為漏洞點。
優點
- 誤報較少
- 無人工
缺點
- 需要匹配fuzz請求和結果正則(可能需要正則)
- 需要實現各種記錄工具,較難
- 如何記錄fuzz請求和相應結果對應關系??目前可以想到時間或正則,但各有缺點
- 效率極低
參考
http://cnki.scstl.org/KCMS/detail/detail.aspx?filename=1015528099.nh&dbcode=CMFD&dbname=CMFD2015
這個思路是之前忽然想到的,但是還沒有實現,因為覺得效率會極低,沒想到知網搜到一個文章……
思路四
通過Hook PHP底層函數,獲得PHP執行時的如下信息:
- 當前函數名稱
- 當前文件名稱
- 當前參數
當執行到危險函數時,跟蹤執行流,找到危險函數的參數來源,如果來源可控,且沒有過濾函數,那么認為是有漏洞
優點
- 可以直接分析任何架構的PHP代碼
- 誤報低
缺點
- 需要人工執行程序的各個功能
- 開發難度高,需開發PHP擴展,目前的幾個有關擴展幾乎都存在問題
參考
最近寫了這個的Demo,不過還沒有完全完成,有興趣的可以跟我一起看看。
目前完成了函數棧追述,函數參數可控定位,但是還有一些小問題沒有解決。