通用的命令执行漏洞防御方法通常是使用两个函数:EscapeShellCmd和EscapeShellArg,下面分别来分析这两个函数。

EscapeShellCmd()函数可以把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义,比如管道符(|)、分号(;)、重定向(>)、从文件读入(<)等。

下面我们来测试一下这个函数是否管用,以low级别的命令执行漏洞为例,对应的网页文件为D:\AppServ\www\dvwa\vulnerabilities\exec\source\low.php,对文件进行如下图所示的修改,在ping命令之前加上EscapeShellCmd函数进行过滤。

p_w_picpath

将修改保存之后,转换到low级别测试,发现我们之前的那些命令都不管用了。

接下来再分析一下EscapeShellArg()函数,这个函数是专门用来处理命令的参数的,它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。

我们同样对网页进行修改,注意,EscapeShellArg()函数是专门对命令参数进行处理的。

p_w_picpath

保存修改之后,返回去进行测试,发现之前的命令同样也不管用了。

事实证明,这两个函数还是很管用的。综合比较一下,EscapeShellCmd函数是基于黑名单的,而黑名单都不是完全可靠的,***总有方法绕过,所以从这个意义上来说EscapeShellArg相对要更安全一些。

下面再分析一下如何挖掘命令执行漏洞,方法其实很简单,就是从代码中查找那些可以执行系统命令的函数。如果这些函数中所执行的命令参数是由用户输入的,而且没有经过任何的过滤,那么便有可能存在漏洞。

PHP中可以调用系统命令的函数主要包括:

exec system popen passthru proc_open shell_exec

在进行代码搜索时,仍然可以借助于之前介绍过的闪电文件搜索软件。