文件上传漏洞原理

实验环境

1
2
3
4
5
目标靶机:OWASP_Broken_Web_Apps_VM_1.2
IP:192.168.0.109

测试渗透机:kali-linux-2018-4-vm-amd64
IP:192.168.0.103

文件上传原理


1
2
3
4
5
1、文件上传(File Upload)是大部分web应用都具备的功能,如:用户上传的附件、修改头像、分享图片/视频等
2、正常的文件一般是文档、图片、视频等,web应用收集之后放入后台存储,需要的时候调用出来返回
3、如果恶意的文件如PHP、ASP等执行文件绕过web应用,并顺利执行,则相当于黑客直接拿到webshell
4、一旦黑客拿到webshell,则可以拿到web应用的数据,删除web文件,本地提权,进一步拿下整个服务器甚至内网
5、SQL注入攻击的对象是数据库服务,文件上传漏洞主要攻击web服务,实际渗透两种相结合,达到对目标的深度控制

实验

实验一(low)

进入靶机环境

这里提示选择你要上传的图像,我们上传一张jpg图片文件

提示上传成功,我们查看一下

再次尝试上传一个11.txt的文本文件,看是否限制上传

提示上传成功,我们查看一下

此时我们上传一个一句话木马的PHP可执行文件,看是否限制上传

提示成功上传,我们查看一下

此时亮出我们的中国菜刀

成功进入

我们来分析下靶机源码

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'])) { //判断是否有post提交过来的变量

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

}

}
?>

1
2
低安全模式下
没有验证文件上传类型,后缀名,可以任意上传文件及文件大小
实验二(medium)

进入靶机环境
上传一张jpg图片文件,成功上传

上传一个PHP可执行文件,提示Your image was not uploaded.


我们来分析下靶机源码

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

<?php
if (isset($_POST['Upload'])) { //判断是否有post提交过来的变量

$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']; //文件的MIME类型
$uploaded_size = $_FILES['uploaded']['size']; //已上传文件的字节大小

if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){ //进行了一个MIME类型及文件大小判断


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

1
2
中安全模式下
对文件上传的MIME类型及大小进行了一个判断

此时,我们可以用burp suite抓包来做一个对比


利用burp suite抓包进行修改Content-Type值为imge/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'])) { //判断是否有post提交过来的变量

$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/"; //设置上传目录
$target_path = $target_path . basename($_FILES['uploaded']['name']); //获取上传文件名
$uploaded_name = $_FILES['uploaded']['name']; //客户端文件的原名称($_FILES['file']['name']在得到文件名时0x00【%00截断】之后的内容已经不见了,如果在此基础上判断后缀名是否合法,则肯定不能通过。)
$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
2
高安全模式下
后台检测上传文件后缀名(采取白名单)

这里我们结合文件包含漏洞
使用dos命令制作一句话图片木马

1
2
3
copy shell.jpg /b+ xiaowei.php shell3.jpg
--/b 以二进制的形式进行复制、合并文件。
--/a 以ASCII的形式进行复制、合并文件。


将制作好的一句话图片木马进行上传

结合文件包含漏洞,直接包含该文件会将该文件以PHP来运行:

上菜刀
此时,你可能会遇到这样子的问题

(根据排查初步断定菜刀没有进行一个身份认证,导致返回了一个200状态码的,一个登陆界面源码)

此时我们利用菜刀的浏览器登陆下我们的靶机环境,让它产生cookie

我们再次进行我们的一句话连接

-本文结束感谢您的阅读-