使用注入shell命令的方法对PHP的解释
使用系统命令是一种危险的操作,特别是当您试图使用远程数据来构建要执行的命令时。如果使用受污染的数据,就会生成命令注入漏洞。用于执行shell命令的函数。它返回到执行的最后一行并返回命令输出,但是您可以指定数组作为第二个参数,因此每一行输出都将作为数组中的一个元素存储:
复制代码代码如下所示:
< PHP
$last = exec ('ls', $output, $return);
print_r($输出);
返回;
>
假设ls命令在shell中手动运行,将生成以下输出:
复制代码代码如下所示:
$ ls
总0
- rw-rw-r -- 1 Chris Chris 0 5月21日12:34 PHP安全
- rw-rw-r -- 1 Chris Chris 0 chris shiflett 5月21日12:34
当在操作中执行以上方法时,输出结果如下:
复制代码代码如下所示:
阵列
(
{ 0 } >总计0
{ 1 } = > - rw-rw-r -- 1 Chris Chris 0 5月21日12:34 PHP安全
{ 2 } = > - rw-rw-r -- 1 Chris Chris 0 chris shiflett 5月21日12:34
)
返回{ 0 }
这种运行shell命令的方法非常方便和有用,但是这种便利给您带来了很大的风险。如果命令字符串使用受污染的数据构建,攻击者可以执行任意命令。
如果可能的话,我建议您避免使用shell命令。如果您真的需要使用它,您必须确保所构造的命令字符串的数据被过滤,同时,必须将输出传输到输出。
复制代码代码如下所示:
< PHP
$ =数组();
元=数组();
过滤器输入($命令,$参数)。
{ } =美元'command壳的escapeshellcmd($清洁{ 'command});
{ } =美元'argument壳的escapeshellarg($清洁{ 'argument});
最后= exec(美元{} } { $壳'command { { } } $壳'argument
>
虽然有许多方法来执行shell命令,你必须坚持下去,只允许过滤了数据可构建一个运行时字符串。其他需要注意到类似的功能层(),Popen(),(),和系统shell_exec()。我重申,如果可能的话,建议避免所有shell命令的使用。