一、OS命令注入
代码注入与命令注入区别:PHP代码注入是具体的语言的代码(如php、Java),命令注入的是系统命令。
原因:
当应用需要调用一些外部程序(系统命令或者exe等可执行文件)时就会用到一些系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入做为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
1.用户输入作为拼接。
2.没有足够过滤。
危害:
1.继承web服务器程序权限(web用户权限),去执行系统命令。
2.继承web服务器权限,读写文件。
3.反弹shell。服务器主动连接攻击方。
4.控制整个网站。
5.控制整个服务器。
二、相关函数
1.system()
<?php
$str="ipconfig";
system($str);
?>
如果将ipconfig换成变量:
<?php
if($_GET['cmd']){
$str=$_GET['cmd'];
system($str);
}
?>
此时在客户端可以通过传参,执行漏洞。(URL路径后面接)命令执行完才在页面显示出来。
?cmd=whoami
2.exec()
输出执行结果,结果内容有限
3.shell_exec() 应用最广泛
4.passthru() 自带输出
5.popen
不返回结果,而是返回文件指针。我们关心的是命令执行了。在URL中输入:
>>1.txt #将执行结果导入文件中看。
6.反引号(1键左边的键)
三、漏洞利用
1.查看系统文件
提交参数
[?cmd=type c:\windows\system32\drivers\etc\hosts]
查看系统hosts文件。
2.显示当前路径
提交参数:
[?cmd=cd]
3.写文件
[?cmd=echo "<?php phpinfo();?>" > D:\xampp\htdocs\Commandi\shell.php]
> 覆盖并建文件 #路径随机
四、如何避免
1.尽量减少命令执行函数的使用,并在disable_functions 中禁用。
2.在进入命令执行的函数或方法前,对参数过滤。
3.参数的值尽量使用引号包裹,并在拼接前调用addslashes()进行转义。#函数表示返回在预定义的字符之前添加反斜杠的字符串。预定义字符有 (') (") (\) NULL