PHP命令注入恢复
1.PHP可能会导致命令执行的有几个函数需要注意
i.system(string $command[,int return_var])
$command:要执行的命令
return_var参数,则外部命令执行后的返回状态将会被设置到此变量中。
返回状态0代表执行失败,1代表执行成功
exec
out为exec命令的结果,每一个元素被结果的一行填充
passthru可以替代exec()或者system()
shell_exec 返回输出,需要echo出来
``的效果与shell_exec相同
popen,proc_open,pcntl_exec
2.防御措施
i.escapeshellcmd
Escapeshellcmd()函数会转义命令中的所有shell元字符,包括(#,&,|,*,?,~,<>,^,(),[],{},$,\\)
<?php $action=$_GET[\'cmd\']; echo "<pre>"; system($action); echo "</pre>"; ?>
之后将代码修改成为这样
<?php
$action=$_GET[\'cmd\'];
$action=escapeshellcmd($action);
echo "<pre>";
system($action);
echo "</pre>";
?>
这里的转义符号扭曲了>>的意思,所以只能echo出来,却不能写进去了
============================================
ii.escapeshellarg
escapeshellarg会将参数限u制在一对单引号里,然后转义参数中所含有的单引号,这样就无法对当前执行进行截断。
比如有以下代码
<?php
$action=$_GET[\'cmd\'];
echo $action;
?>
当我们增加escapeshellarg之后,单引号会被包裹起来