0.前言
上文讲到了如何对OWASPBWA靶机的低、中安全级别下的文件上传漏洞的利用。本文讲讲述如何绕过高安全级别下的文件上传限制,以及如何利用命令执行漏洞。
1. 命令执行漏洞
部分web应用程序会调用底层的操作系统命令,例如,一些网站网站会提供一些ping命令的接口,用来测试网站在各地的ping的响应速度:
在我们搭建的靶机中,也存在类似的功能:
点击查看源码可以得知,当用户在命令框中输入了某个地址的IP的时候,会调用系统的ping命令来测试相应速度:
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>
当输入baidu.com的时候,那么baidu.com的参数会传给$target, 此时,判断操作系统,执行“ping -c 3 baidu.com”。这里就非常像SQL注入了,在SQL注入中,虽然我们不能修改已经写死的SELECT XXX FROM XXX, 但是可以通过修改后面的参数,实现一些其他目的。
在命令执行漏洞中,也是同样的。操作系统的指令,往往可以用&& 连结两条指令。若我们在命令框里输入,baidu.com && ls:
那么操作系统中执行的就为:
ping -c 3 baidu.com && ls
这样的漏洞是十分危险的,比如我们还可以查看/etc/passwd下的文件:
当然,除了&&可以连接两条命令之外,&, |, || 符号都是可以连接两条命令的,不同的是,符号不同,被连接的命令执行过程不同:
command A && command B #先执行A命令再执行B命令
command A & command B #先执行B命令再执行A命令
command A || command B #若A命令执行失败,执行B命令
command A | command B #只执行B命令
2.图片木马
在靶机高安全级别下,查看文件上传页面的源代码:
File Upload Source
<?php
if (isset($_POST['Upload'])) {
$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
$target_path = $target_path . basename($_FILES['uploaded']['name']);
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
$uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
} else {
echo '<pre>';
echo $target_path . ' succesfully uploaded!';
echo '</pre>';
}
}
else{
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
}
}
?>
可以发现,在高安全级别下,代码不仅仅对文件名做了限制(最后一个.的后面应该为jpg或jpeg), 并且用函数move_uploaded_file()对上传文件的合法性做了判断。
因此,为了绕过这一设定,我们可以构建一个图片木马。
首先,讲文件的命名改为shell.jpg,再使用二进制编辑文件进行编辑,插入jpg文件头特征码:ff d8 ff
此时上传文件,发现文件上传成功。
虽然成功将恶意代码上传,但是是否可以达到目的,还需要从以下的角度考虑:
3.web容器解析漏洞
3.1 IIS解析漏洞
在IIS 6.0版本中,存在两种解析漏洞
1.当建立*.asa或 .asp 文件夹下,目录下的任意文件文件都会被当作asp文件进行解析。也就是说,如果我们可以讲shell.jpg上传到asp文件夹下,就可以被解析执行,那么我们也就可以通过蚁剑进行连接了。
2.当文件名为*.asp;xxx.jpg时,IIS6.0 同样会以asp脚本来执行,也就是说,如果我们发现服务器的web容器为IIS6.0时,重命名脚本为xxx.asp;xxx.jpg时,上传成功后,恶意脚本就会被解析,拿到控制权了。
3.2 Apache解析漏洞
在Apache 1.X 何 Apache 2.x 中同样存在解析漏洞。但是与IIS 6.0的解析漏洞不同,Apache在解析文件时,会按照从后往前进行识别。比如我们在windows环境下,看到一个文件的后缀为xxx.txt,那么就认为他是一个文本文件,但是在Apache中,Apache如果发现最后的后缀不认识,那么就会从后往前解析。例如文件shell.php.xxx Apache不认识后缀xxx,那么就会当作php文件进行解析。具体的Apache认识哪些后缀,linux环境下可以在/etc/mime.types查看
4.文件上传漏洞的其他思路
我们前面提到,部分服务器存在命令执行漏洞。如果我们可以通过文件上传漏洞,对文件进行上传,又存在命令执行漏洞,那么只要我们知道了文件上传的路径,就可以先绕过判断进行上传,并且利用命令执行漏洞,修改文件后缀为.php,那么就可以解析并且连接了。