os命令注入
在开发过程中,一些应用需要去调用一些外部程序(系统命令或exe等可执行文件)。当应用需要调用一些外部程序时,就会用到一些系统命令的函数.
而应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤输出的情况下,就会造成命令执行漏洞。
命令执行漏洞发生的两个主要原因
1.用户输入可以进行拼接
2.没有足够的过滤
危害:
可继承web服务器权限(web用户权限),去执行系统命令,读写文件,也可进一步控制整个网络,整个服务器。
相关函数:
system();
passthru():
能够将字符串作为os命令执行,自带输出功能。
exec():
也能够将字符串作为os命令执行,需要输出执行结果。
shell_exec():
也exec()函数类似
popen()也能执行os命令,但不返回命令结果,而是返回一个文件指针
<?php
if(isset($_GET['cmd']))
{
$cmd=$_GET['cmd'].">>1.txt"
popen($cmd,'r');
}
此函数需要两个参数,并且只返回一个文件指针,从而可以将其导入一个文件中查看。
反引号
反引号["]内的字符串,也会被解析成os命令,需要输出执行结果。
漏洞利用方式
查看系统文件
如?cmd=type c:\windows\system32
在windows中查看文件为type linux为cat
显示当前路劲
如?cmd=cd -->绝对路径
写入一个文件,可为一句话木马等
如?cmd=echo "<?php phpinfo(); ?>" >D:\shell.php-->其中>为覆盖写
防御方法:
1.减少命令执行函数的使用
2.在进行命令执行的函数之前,对参数进行过滤
3.参数值尽可能使用引号包裹,调用addslashes函数进行转义