原标题:PHP安全:系统命令注入
系统命令注入攻击(OS Command Injection)是指恶意攻击者通过非正常手段提交shell命令,通过PHP函数进行系统调用执行,以达到恶意攻击系统的目的。
1、易发生命令注入的函数
为了方便处理相关应用场景的功能,PHP系统中提供命令执行类函数,如exec、system等。当研发人员不合理地使用这类函数,同时调用的变量未考虑安全因素时,容易被攻击者利用执行不安全的命令调用。
(1)exec函数
exec函数可执行系统命令,并返回输出结果到$output中,然后使用foreach循环返回数组元素,得到命令结果。
如下代码中,用户在浏览器中访问http://localhost/exec.php?cmd=ls–al,cmd中的脚本命令将被执行,执行结果输出到页面上。
echo exec($_GET["cmd"], $output);
foreach($output as $value) {
echo $value;
}
(2)system函数
system函数的作用是执行系统命令,并返回所有结果到标准输出设备上。
如下代码中,用户在浏览器中访问http://localhost/system.php?cmd=ls–al,cmd中的脚本命令将被执行,执行结果输出到页面上。
system($_GET["cmd"]);
(3)passthru函数
passthru函数调用系统命令,把运行结果二进制数据原样地直接输出到标准输出设备上。
如下代码中,用户在浏览器中访问http://localhost/passthru.php?cmd=ls–al,cmd中的脚本命令将被执行,执行结果输出到页面上。
passthru($_GET["cmd"]);
(4)popen函数
popen函数可以执行系统命令,允许与程序进行交互,与pclose函数一起使用。
如下代码中,用户在浏览器中访问http://localhost/popen.php?cmd=ls–al,cmd中的脚本命令将被执行,执行结果输出到页面上。
$handle=popen($_GET["cmd",'r']);
echo "'$handle';". gettype($handle) . "n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>
(5)执行运算符(backtick operator)
PHP支持执行反引号运算符(`)。注意,这不是单引号!PHP将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回(例如,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与shell_exec函数相同。反引号运算符在键盘上的位置如图1所示。
图1 “`”运算符在键盘上的位置
如下面代码中,当用户在URL地址栏中输入http://localhost/backtick_operator.php?cmd=ls–al时,cmd中的命令将被执行,执行结果直接反馈在页面上。
$res2=$_GET["cmd"];
echo `$res2 `;
?>
(6)shell_exec函数
shell_exec函数通过shell执行命令并返回完整的输出字符串,等同于执行运算符。
如下代码中,用户在浏览器中访问http://localhost/shell_exec.php?cmd=ls–al,cmd中的脚本命令将被执行,执行结果输出到页面上。
$output = shell_exec($_GET["cmd"]);
echo “$output”;
?>
(7)pcntl_exec函数
pcntl是Linux系统下的一个扩展,可以支持PHP的多线程操作,pcntl_exec函数的作用是在当前进程空间执行指定程序。
如下代码中,用户在浏览器中访问http://localhost/pcntl_exec.php?cmd=ls&args[]=-la,cmd中的脚本命令将被执行。
pcntl_exec($_GET["cmd"], $_GET["args"]);
2、防御命令注入
在PHP中为了防止命令注入的产生,应该注意以下几点。
1)尽量避免使用此类函数,避免从用户端接收执行命令。
2)如果必须使用此类函数,由于它的危险性,执行命令的参数应禁止外部获取,防止用户构造。
3)设置php.ini配置文件中safe_mode=On选项,默认为Off,使用disable_functions将这些函数禁用。
disable_functions= exec,system,passthru,popen,shell_exec,pcntl_exec
4)使用自定义函数或函数库来替代外部命令的功能。
5)结合使用escapeshellarg、escapeshellcmd函数来处理命令参数。
escapeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“'”替换成“'”,双引号“"”替换成“"”,分号“;”替换成“;”。
6)使用safe_mode_exec_dir指定可执行文件的路径。
用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内。
safe_mode = on
safe_mode_exec_dir = /usr/local/php/bin
参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。返回搜狐,查看更多
责任编辑: