在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 ; '
那样进行注入
答案 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 : &#;`|*?~<>^()[]{}$
您能举例说明要执行的命令吗?