通用的命令執(zhí)行漏洞防御方法通常是使用兩個函數(shù):EscapeShellCmd和EscapeShellArg,下面分別來分析這兩個函數(shù)。
在惠東等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站設計、成都網(wǎng)站建設 網(wǎng)站設計制作按需定制制作,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站建設,惠東網(wǎng)站建設費用合理。
EscapeShellCmd()函數(shù)可以把一個字符串中所有可能瞞過Shell而去執(zhí)行另外一個命令的字符轉(zhuǎn)義,比如管道符(|)、分號(;)、重定向(>)、從文件讀入(<)等。
下面我們來測試一下這個函數(shù)是否管用,以low級別的命令執(zhí)行漏洞為例,對應的網(wǎng)頁文件為D:\AppServ\www\dvwa\vulnerabilities\exec\source\low.php,對文件進行如下圖所示的修改,在ping命令之前加上EscapeShellCmd函數(shù)進行過濾。
將修改保存之后,轉(zhuǎn)換到low級別測試,發(fā)現(xiàn)我們之前的那些命令都不管用了。
接下來再分析一下EscapeShellArg()函數(shù),這個函數(shù)是專門用來處理命令的參數(shù)的,它在給定的字符串兩邊加上單引號,并把字符串中的單引號轉(zhuǎn)義,這樣這個字符串就可以安全地作為命令的參數(shù)。
我們同樣對網(wǎng)頁進行修改,注意,EscapeShellArg()函數(shù)是專門對命令參數(shù)進行處理的。
保存修改之后,返回去進行測試,發(fā)現(xiàn)之前的命令同樣也不管用了。
事實證明,這兩個函數(shù)還是很管用的。綜合比較一下,EscapeShellCmd函數(shù)是基于黑名單的,而黑名單都不是完全可靠的,***總有方法繞過,所以從這個意義上來說EscapeShellArg相對要更安全一些。
下面再分析一下如何挖掘命令執(zhí)行漏洞,方法其實很簡單,就是從代碼中查找那些可以執(zhí)行系統(tǒng)命令的函數(shù)。如果這些函數(shù)中所執(zhí)行的命令參數(shù)是由用戶輸入的,而且沒有經(jīng)過任何的過濾,那么便有可能存在漏洞。
PHP中可以調(diào)用系統(tǒng)命令的函數(shù)主要包括:
exec system popen passthru proc_open shell_exec |
在進行代碼搜索時,仍然可以借助于之前介紹過的閃電文件搜索軟件。