OS命令注入

发布时间 2023-10-23 23:14:22作者: ashashash

原理以及成因

  程序员使用脚本语言开发的过程中需要去调用一些外部应用。当应用调用外部应用时就会用到一些系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户输入的情况下,就会造成命令执行漏洞。

 

漏洞危害

  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进行转义(默认情况下会对单引号,双引号,空字符,反斜杠转义)