php敏感字符串过滤_PHP代码审计入门:常见的危险函数和审计点
01什么是危險函數
函數設計出來就是讓人使用的,之所以危險,是因為其功能過于強大.開發人員特別是剛從業的人員很少會完整閱讀完整個文檔,再或者是沒有意識到當給這些函數傳遞一些非常規的,外部可控的參數會帶來什么影響,所以踩坑的幾率非常大.
所以在進行代碼審計的時候,比較多的部分都是在審計調用這些危險函數的時候,參數是不是外部可控的.有沒有進行正確的過濾.
02 PHP危險函數5大特征
2.1 能夠執行任意代碼的函數有三種:
- 第1種是最常見的,會把傳入的字符串當作php代碼直接執行
- 第2種是通過引入文件執行php代碼,php里引入文件執行代碼的只有4個函數
- 第3種是一些數據處理函數,它們存在支持回調函數類型的參數,這個參數可以傳入函數的字符串名稱,一旦這個參數可控,那么可能造成漏洞,這些函數的特征非常明顯,參數類型是callback形式,審計的基本上就是看他們的回調函數是不是用字符串的形式傳遞,是否可控,在PHP里存在大量的這種函數,這里只舉5個比較常見的
2.2 常見能夠讀取網絡資源的函數
常見能夠讀取網絡資源的函數,審計點一般是發起網絡請求時有無白名單,否則存在SSRF漏洞
2.3 能夠執行系統命令或者調用外部程序的函數
能夠執行系統命令或者調用外部程序的函數,這些函數使用不當容易引起命令注入,一般需要通常需要結合escapeshellcmd或escapeshellarg函數過濾傳入的變量
2.4 能夠操作文件(讀寫,移動,刪除)的函數
能夠操作文件(讀寫,移動,刪除)的函數,在審計的時候也要注意傳入的變量是否可控,是否存在穿越目錄,導致任意文件讀寫的情況
2.5 能夠修改運行時候的上下文環境(覆蓋變量/函數)
03 編程語言自身的特性
腳本語言的特點就是靈活,所以語言本身的設計上有很多動態的設計,比如:動態類型,可變變量,可變函數。
3.1 動態類型
動態類型可能導致一些比較條件的時候繞過,比如true == 'a'這個條件在PHP里為真,動態類型帶來的條件判斷問題,很多開發者都會在上面踩坑,詳細的規則可以看php的官方文檔
http://php.net/manual/zh/types.comparisons.php
3.2 可變變量
可變變量就是有2個$符號的變量,比如這2行代碼,其實聲明了3個變量,1個是$a,1個變量是$b,還有一個是$hello,之所以有$hello這個變量,是因為第3行的$$a,是把$a的值當成一個變量名使用.當$a的值可控的時候,就可以覆蓋其它已經定義的變量,比如當$a的值是b的時候,第三行的$$a就會把$b的test覆蓋成world.
<?php $a = 'hello'; $b = 'test'; $$a = 'world'; ?>3.3可變函數
可變函數就是一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數,并且嘗試執行它,比如這段代碼會輸出function hello
$a = 'hello'; function hello(){ echo 'function hello'; } $a();所以審計的時候也需要關注可變函數的變量是否可控。
04 小結
對于敏感函數的審計點,無非就是參數是否可控,是否有嚴格的過濾,過濾方案是不是業界最優解,然后去回溯這些參數的調用過程,看看在哪一步沒有過濾或者是過濾不嚴的地方.整個審計的過程是比較枯燥的,而且可能要審計很久能發現一個漏洞甚至是沒有任何發現。
既然審計套路這么固定,肯定有一些現成的工具,下面就給大家介紹2款。
- 第一款是rips,這款工具是用php寫的,開源版本雖然停更已久,現在主推商業版本,不過近幾年來php所添加的函數,并沒有增加多少危險函數,所以這款工具還是可以使用的.而且它使用了php自帶語法分析函數token_get_all來分析上下文,相比一些依賴正則表達式的審計工具準確度有不少的提升。
- 第二款工具是Seay,這款工具是法師的代碼審計系統,同樣有自動審計的功能,還能列出單個php文件里的所有變量和函數,以及這些變量的生命周期。掃描結果里面同樣也是一些漏洞點的信息,驗證的話可以雙擊某一條漏洞轉到到源碼的地方審計。
漲姿勢的點贊集合喲~
總結
以上是生活随笔為你收集整理的php敏感字符串过滤_PHP代码审计入门:常见的危险函数和审计点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重物码垛搬运机器人_搬运码垛机器人的特点
- 下一篇: 动态规划算法php,php算法学习之动态