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