文件上传

文件上传

概述

Web站点一般会有用户注册的功能,当用户注册之后,大多数情况下都会存在类似头像上传等个性化的设置,这些功能点往往存在上传验证方式不严格的安全缺陷,这些安全缺陷在Web渗透中是非常关键的突破口,只要经过仔细测试分析上传验证机制,往往就能找到绕过验证的方法,进而上传恶意代码获取整个Web业务控制权,复杂一点的情况是配合 Web Server的解析漏洞来获取控制权。

DVWA文件上传

LOW

先看一下源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if (isset($_POST['Upload'])) {

$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
$target_path = $target_path . basename( $_FILES['uploaded']['name']);

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>';

}

}
?>

DVWA_WEB_PAGE_TO_ROOT为网页的根目录,target_path变量为上传文件的绝对路径,basename( $_FILES[‘uploaded’][‘name’])将文件中已经“uploaded”的文件的名字取出并加入到target_path变量中。if语句判断文件是否上传到指定的路径中,若没有则显示没有上传。总的可见,此级别没有对上传文件的类型进行任何的过滤,也就是可以随意上传php文件。

所以直接上传一个一句话木马<?php echo shell_exec($_GET['cmd']);?>他这里可以直接看到路径加上cmd参数可以直接使用命令。

Medium

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 <?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_type = $_FILES['uploaded']['type'];
$uploaded_size = $_FILES['uploaded']['size'];

if (($uploaded_type == "image/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>Your image was not uploaded.</pre>';
}
}
?>

这里较low增加了

1
2
3
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_type = $_FILES['uploaded']['type'];
$uploaded_size = $_FILES['uploaded']['size'];

文件名,文件类型,文件大小这里直接上传就传不上去了

因为在if语句中判断上传文件的类型是否为“image/jpeg”和大小是否小于100kb。这里也只是简单地设置检测文件的类型,因此可以通过burpsuite来修改文件的类型进行过滤即可。

将content-type:改为image/jpeg可和上面一样得到路径。

High

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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>';

}
}

?>

通过这句

1
$uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000

可知high级别限制了文件后缀名可以继续用burp改包。或者直接把1.php的文件名改为1.php.jpg也可以传上去

利用

1、结合解析漏洞:

1、直接解析(几乎没有防御):

比如直接上传一个扩展名是.php 的文件,只需要简单地绕过客户端javascript 检测或者服务端MIME 类型检测就行了。

2、配合解析(有一定程度的防御):

可以理解为先将代码注入到服务器上,上传一个带有一句话木马的图片或文件,等待一个解析的配合来实现攻击。

(1)、本地文件包含解析:主要是PHP本地文件包含

(2)、.htaccess文件解析

(3)、Web应用程序解析漏洞以及其原理:
1.Apache 解析漏洞:
解析: test.php.abc(其中abc为任意不属于黑名单且也不属于Apache解析白名单的名称)
描述:一个文件名为x1.x2.x3的文件,Apache 会从x3的位置往x1的位置开始尝试解析,如果x3不属于Apache能解析的扩展名,那么Apache会尝试去解析x2的位置,这样一直往前尝试,直到遇到一个能解析的扩展名为止。2.Nginx 解析漏洞:
解析:abc/def.php 或 abc%00.php (其中abc、def都为任意文件名)
描述:目前Nginx 主要有这两种漏洞,一个是对任意文件名,在后面添加/abc.php 的解析漏洞,如原本文件名是test.jpg则可以添加为test.jpg/x.php进行解析攻击。还有一种是对低版本的Nginx 可以在任意文件名后面添加%00.php 进行解析攻击。

2、结合文件包含漏洞:


首先上传一个1.txt的文件<?php phpinfo();?>在文件包含漏洞中会将该文件以PHP来运行。

检测方法

直接上传各种类型的文件,再通过Burpsuite修改各个可以绕过的检测内容来检测

防御方法

搬运

1、客户端JavaScript检测:通常为检测文件扩展名)
2、服务端MIME 类型检测:检测Content-Type内容)
3、服务端目录路径检测:检测跟path参数相关的内容
4、服务端文件扩展名检测:检测跟文件extension 相关的内容

目前防御方法学习还没有进行完还需要继续学习。

Donate comment here