原理以及成因
程序员使用脚本语言开发的过程中需要去调用一些外部应用。当应用调用外部应用时就会用到一些系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户输入的情况下,就会造成命令执行漏洞。
漏洞危害
1.继承web服务器程序权限,去执行系统命令
2.继承web服务器权限,读写文件
3.反弹shell
4.控制整个网站
5.控制整个服务器
相关函数
system()
调用终端,执行命令并输出
测试代码如下:
<?php
if($_GET['cmd']){
$str=$_GET['cmd'];
system($str);
}
else{
echo '请通过get传参';
}
?>
exec()
类似system,也是调用终端执行命令,但需要print来输出结果,并且有长度限制
测试代码
<?php
if($_GET['cmd']){
$str=$_GET['cmd'];
print exec($str);
}
else{
echo '请通过get传参';
}
?>
shell_exec()同exec()
passthru()自带输出结果
popen()没有回显,但会执行指令
反引号
反引号[ `` ]里面的字符串也会被解析为OS命令
测试代码如下
<?php
if(isset($_GET['cmd'])){
$str=$_GET['cmd'];
print `$str`;
}
else{
echo 'please input ';
}
?>
漏洞利用
OS命令注入漏洞,攻击者直接继承web用户权限,在服务器上执行任意命令
1.查看系统文件
提交参数[ ?cmd=type c:\windows\system32\drivers\etc\hosts ],查看系统host文件
2.显示当前路径
[ ?cmd=chdir ]
3.写文件
echo "<?php phpinfo(); ?>" >> shell.php
防御方法
1.尽量减少命令执行函数的使用,并在php.ini中禁用
2.对用户输入的参数进行过滤
3.参数的值尽量用引号包裹,拼接前调用addslashes进行转义(默认情况下会对单引号,双引号,空字符,反斜杠转义)
标签:web,调用,系统命令,命令,测试代码,OS,注入 From: https://www.cnblogs.com/dg05/p/17776826.html