一、简介
- 文件上传攻击是一种利用系统的上传点,上传恶意文件,以此来获取系统信息或取得系统控制权的一种方式,这也是
WEB
攻击中常见的方式。 - 大多数的编码者本身没有太多的安全意识,更多是在前端通过
JS
对用户上传文件进行校验,但实际上前端的JS校验
是比较容易绕过的。而后端校验则要麻烦很多,一般是基于黑白名单后缀来进行限制,但也是有机会绕过的!
二、前端绕过
- 对于前端
JS校验
而言,可以直接通过F12
检查提交按钮的关联对象,将校验对象删除或在将文件提交后,通过BP
修改文件名为.php、.jsp
这些类型
二、后端绕过
2.1 简介
在服务器后端,通产对文件扩展进行黑白名单限制匹配,此外基于文件本身特征的MIME
进行校验。示例代码如下:
// blacklist test
if (preg_match('/.+\.ph(p|ps|tml)/', $fileName)) {
echo "Extension not allowed";
die();
}
// whitelist test
if (!preg_match('/^.+\.[a-z]{2,3}g$/', $fileName)) {
echo "Only images are allowed";
die();
}
// type test
foreach (array($contentType, $MIMEtype) as $type) {
if (!preg_match('/image\/[a-z]{2,3}g/', $type)) {
echo "Only images are allowed";
die();
}
}
// size test
if ($_FILES["uploadFile"]["size"] > 500000) {
echo "File too large";
die();
}
2.2 绕过黑白名单限制:
- 第一步:使用潜在扩展名列表来模糊上传功能,并查看其中哪些返回之前的错误消息。任何不返回错误消息、返回不同消息或成功上传文件的上传请求都可能指示允许的文件扩展名。
- 列表示例-注意开发语言:传送门
- 找到能够执行代码的扩展名:诸如常见的
PHP
,其中phtml
、phar
也是可以执行php
代码的。 - 采用双延伸后缀尝试绕过:诸如
shell.jpg.php
- 采用反向双延伸后缀尝试绕过:诸如
shell.php.png
- 尝试使用字符注入的方式绕过,使用
%20 、%0a 、%00 、%0d0a 、/ 、.\ 、. 、… 、:
这些字符进行绕过,方法是:
在允许的文件扩展名(例如shell.phar:.png
)之前插入冒号,这也应该将文件写为shell.phar
2.3 绕过MIME
限制
通常是通过检查文件内容的前几个字节来完成的,其中包含文件签名或魔字节。
- 例如,如果文件以 (
GIF87a
或GIF89a
) 开头,则表明它是GIF
图像,而以纯文本开头的文件通常被视为文件Text
。如果我们将任何文件的第一个字节更改为GIF
魔术字节,则其MIME
类型将更改为GIF
图像,无论其剩余内容或扩展名如何。 - 对于大多数上传点而言,
MIME
基本不会限制PNG
类型,因此可以通过插入PNG
文件签名89 50 4E 47 0D 0A 1A 0A
于伪造文件中,进而冒充PNG
文件,以此来饶过相关限制。 - 示例:
echo -e "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A" | cat a.png > tt && mv tt a.png
实验:
-
使用补充:
- 将该图片保存下载,然后在上传文件时使用
BP
抓包,检查文件内容,添加攻击载荷于文件体末尾,修改文件名称,以此绕过黑白名单检查。 - 该图片本身具备
XXE
的功能,可以用于访问系统文件,在将base64
解码后,可以查看指定代码的详细情况,诸如审计upload.php
以此来查找文件的保存路径,以便于WEBShell
连接
- 将该图片保存下载,然后在上传文件时使用
- 最终效果: