** 命令执行 **
在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。
以DVWA为例,在DVWA中用户可以输入一个IP来ping。
当用户输入114.114.114.114&&ls
时,就会执行ls命令。
如图:
查看源码:
{$cmd}
";
}
?>
可以看到程序使用shell_exec函数执行输入的数据,但是当我们输入114.114.114.114&&ls
时,执行的是ping -c 4 114.114.114.114&&ls
,这里就是命令执行漏洞。
在PHP中提供了执行外部应用程序的函数,如system()、exec()、shell_exec()、passthru()和反引号等。
在命令执行处,如果输入的直接被执行,则可以执行任意命令。
如
$target = $_REQUEST[ '$arg' ];
$cmd = shell_exec( $target);
当输入的是参数时,如
$target = $_REQUEST[ '$arg' ];
$cmd = shell_exec( 'ping -c 4 ' . $target);
可以用`&&’,’||’,’|’,’&’等来执行其它命令
当输入的参数有双引号时,如果引号没有被转义,我们可以先闭合引号。如果引号被转义(addslashes),linux shell环境下双引号中间的变量也是可以被解析的。我们可以在双引号内利用反引号执行任意命令“ id ”
当是单引号时,需要先闭合单引号才能执行。
1、对输入内容进行过滤,过滤敏感字符,或者使用过滤函数,如escapeshellcmd()和escapeshellarg()函数。
2、使用参数白名单,会输入的内容进行限制
** 代码执行 **
代码执行与命令执行类似,不同的是执行的是脚本语言。
代码执行时指在应用程序中,有时会用到执行代码的函数,如eval,当用户输入可控的代码并执行时,就会造成漏洞。
php一句话木马就是用到这个函数。
PHP中eval(),preg_replace(),assert(),call_user_func(),call_user_func_array(),array_map()
等函数都可以执行代码。
eval()和assert()可以动态执行代码。
preg_replace()函数说明如下:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
当 p a t t e r n 处 存 在 e 修 饰 符 时 , pattern处存在e修饰符时, pattern处存在e修饰符时,replacement的值会被当成php代码执行。
不过在php5.5.0中/e 修饰符已经被弃用了。
call_user_func(),array_map()等函数有调用其它函数的功能。
call_user_func()说明如下
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
该函数第一个参数为回调函数,后面的参数为回调函数的参数。如果传入的函数名可控,就可以调用意外的函数来执行。
1、采用白名单方式,或者使用正则表达式进行过滤。
2、尽量不要让eval()等函数的参数可以由用户直接控制。