文件上传攻击

文件上传攻击

Scroll Down

一、简介

  • 文件上传攻击是一种利用系统的上传点,上传恶意文件,以此来获取系统信息或取得系统控制权的一种方式,这也是WEB攻击中常见的方式。
  • 大多数的编码者本身没有太多的安全意识,更多是在前端通过JS对用户上传文件进行校验,但实际上前端的JS校验是比较容易绕过的。而后端校验则要麻烦很多,一般是基于黑白名单后缀来进行限制,但也是有机会绕过的!

二、前端绕过

  • 对于前端JS校验而言,可以直接通过F12检查提交按钮的关联对象,将校验对象删除或在将文件提交后,通过BP修改文件名为.php、.jsp这些类型

image-20240510173947329

image-20240510174117159

二、后端绕过

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,其中phtmlphar也是可以执行php代码的。
  • 采用双延伸后缀尝试绕过:诸如shell.jpg.php
  • 采用反向双延伸后缀尝试绕过:诸如shell.php.png
  • 尝试使用字符注入的方式绕过,使用%20 、%0a 、%00 、%0d0a 、/ 、.\ 、. 、… 、:这些字符进行绕过,方法是:在允许的文件扩展名(例如shell.phar:.png)之前插入冒号,这也应该将文件写为 shell.phar

img

2.3 绕过MIME限制

通常是通过检查文件内容的前几个字节来完成的,其中包含文件签名魔字节

  • 例如,如果文件以 (GIF87aGIF89a) 开头,则表明它是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

image-20240510175109763

实验:

  • HTB-FileUpload-SkillAssessment

  • Special.png

  • 使用补充:

    • 将该图片保存下载,然后在上传文件时使用BP抓包,检查文件内容,添加攻击载荷于文件体末尾,修改文件名称,以此绕过黑白名单检查。
    • 该图片本身具备XXE的功能,可以用于访问系统文件,在将base64解码后,可以查看指定代码的详细情况,诸如审计upload.php以此来查找文件的保存路径,以便于WEBShell连接

image-20240510171416648

  • 最终效果:

image-20240510171914415