php 命令注入,PHP安全:系统命令注入

原标题: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所示。

b50f6324f2ce0ec030e71beba4be6347.png

图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进行转义。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值