在php中使用没有shell的参数执行命令

时间:2016-08-25 09:54:59

标签: php shell

在php中是否有办法使用参数执行命令但没有“shell”。

问题是exec()shell_exec()都在shell中运行提供的字符串,因此必须转义任何用户输入的数据。

有没有办法像:

some_exec(["command","argument","argument])

正如人们所做的那样,例如Python或Java。

我非常能够使用参数执行命令而不必转义某些参数。

我正在为路由器设置UI,并通过命令设置Wifi密钥 现在我必须转义字符串,这限制了键可以包含的字符数。如果我不想逃避钥匙,可以毫无问题地进行注射。

澄清 在这种情况下,这实际上是一个烦人的问题的原因是我需要执行以下命令:

wireless.@wifi-iface[0].key='<the password>'

问题是,由于密码是在字符串中设置的,因此$il|\|t将成为\$ile\|\\\|t,现在问题是密码错误是有效密码。因此,存储的密码与用户输入的密码不同。

即使我们在字符串中输入密码,我们仍然可以像' ; reboot ; '那样进行注入

1 个答案:

答案 0 :(得分:0)

我很难理解你不必逃避争论的必要性。我尝试使用转义字符串调用echo,并且echo显示原始字符串:

$cmd = 'echo';
$passwd = escapeshellarg('&#;`|*?~<>^()[]{}$');
echo 'ARG : ' . $passwd . PHP_EOL;

exec($cmd . ' ' . $passwd, $output);
echo 'exec : ' . $output[0] . PHP_EOL;

echo 'passthru : ';
passthru($cmd . ' ' . $passwd);

echo 'shell_exec : ' . shell_exec($cmd . ' ' . $passwd);

echo 'system : ';
system($cmd . ' ' . $passwd);

这是输出:

ARG : '&#;`|*?~<>^()[]{}$'
exec : &#;`|*?~<>^()[]{}$
passthru : &#;`|*?~<>^()[]{}$
shell_exec : &#;`|*?~<>^()[]{}$
system : &#;`|*?~<>^()[]{}$

您能举例说明要执行的命令吗?