当前位置: 博客首页>> 网络安全 >> 阅读正文

文件上传验证绕过

作者: 分类: 网络安全 发布于: 2024-06-27 20:11:09 浏览:1,177 评论(0)


文件上传验证绕过

文件上传是Web网页中常见的功能之一,通常情况下恶意文件的上传,会形成漏洞。

大致逻辑是:用户通过上传点上传了恶意文件,通过服务器的校验后保存到指定的位置。当用户访问已经上传成功的文件时,上传的Web脚本会被Web容器解析,从而对网站造成危害。

文件上传常见点

上传头像
上传相册
上传附件
添加文章图片
前台留言资料上传
编辑器文件上传
......

文件上传绕过方式

仅客户端验证文件后缀时

  • 禁用JS: 浏览器直接禁用JS,先按F12,然后按F1,找到禁用JS
  • burp抓包修改:先把一句话木马改为 .jpg|.png 其中一个后缀。上传,抓包修改后缀名为php
  • 修改前端代码:删除验证文件后缀那一段代码

服务端黑名单绕过

  • 特殊可解析后缀: 上传文件改成特殊可解析后缀,如 phtml .phps .php5 .pht 等, 不在黑名单内的文件后缀,某些场景中可解析

  • 大小写绕过:可尝试后缀名修改大小写方式, 如服务器代码未做相关防护, 可绕过

  • 点绕过:如上传文件后缀名最后有个点(可通过burp抓包后修改),在windows系统服务器下可绕过并执行。修改文件名如:1.php.

  • 空格绕过:与点绕过相似,在windows系统服务器下可绕过并执行。修改文件名如:1.php

  • 配合解析绕过:在数据包中把后缀名改为.php. .(两个点之间有个空格)首先系统发现最后有一个点,这时会把它去掉,又发现有一个空格,也会把它去掉,这时还有一个点,也就是.php. 由于系统只验证一次,所以不会再去掉剩下的点,这时就可以上传成功。

  • .htaccess文件绕过: 在apache中间件环境下,并且后端未检查 .htaccess文件后缀,前提条件需要 1.mod_rewrite模块开启。 2.AllowOverride All。

    • 我们需要先准备好两个文件( .htaccess 和 test.jpg)

      <!-- .htaccess文件 -->
      <FilesMatch "magedu.jpg">
      	Sethandler application/x-httpd-php
      </FilesMatch>
      
      //test.jpg
      <?php @eval($_POST["test"]); ?>
      
    • 先上传.htaccess文件,再上传test.jpg文件,这样test.jpg也可被php解析,实现注入

  • ::$DATA绕过:与点绕过相似,在windows系统服务器下可绕过并执行,文件名如:1.php::$DATA

  • 双写后缀名绕过: 如后端只replace了一次,如用此方法绕过。文件名如:1.pphphp

服务端黑名单绕过

  • MIME类型检测绕过: 通过burp修改Content-Type类型为Content-Type:image/jpeg,可绕过只验证Content-Type的逻辑验证

  • %00截断绕过

    • %00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0(%00或者00)字符的方式,达到字符串截断的目的。
      漏洞条件比较苛刻:
      
      截断条件:
      1、php版本小于5.3.4
      2、php.ini的magic_quotes_gpc为OFF状态
      3、上传存储地址可人为设置
      
      示例: 上传文件夹原本地址为:/upload/ ,然后拼接完上传文件地址后为:/upload/1.jpg。
      	  漏洞复现:修改上传原本地址为/upload/a.php%00(原本地址需要在url上, 如在body上需要url解码),然后拼接完上传文件地址后就变成了:/upload/a.php%001.jpg。  最终存入系统的文件就变成了/upload/a.php,形成上传漏洞
      

服务端内容检查绕过

文件头检查, 需配合文件包含漏洞

.jpg FF D8 FF E0 00 10 4A 46 49 46
.gif 47 49 46 38 39 61
.png 89 50 4E 47

注意:上面的文件头的格式是16进制的格式

工具 Hex Fiend,mac版下载地址;Windows下可使用 010 editor

如以下代码逻辑:

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

由于只检查了文件头16进制前两个字节,所以我们只需通过16进制工具在图片的结尾插入一句话木马如<?php eval(@$POST['shell']) 。依然可以上传上去,再通过文件包含漏洞包含此文件, 即可实现漏洞

突破getimagesize及exif_imagetype 也可使用此方法绕过检查

二次渲染绕过

二次渲染:就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。

与文件夹检查一致,但是由于新生成的图片可能会与原有图片的16进制不同, 所以需要在没有发生变化的数据块部分直接插入 Webshell 即可。 建议使用GIF格式上传

  • GIF:渲染前后的两张 GIF,没有发生变化的数据块部分直接插入 Webshell 即可

  • PNG:没有 GIF 那么简单,需要将数据写入到 PLTE 数据块 或者 IDAT 数据块

  • JPG: 需要使用脚本将数据插入到特定的数据块,而且可能会不成功,所以需要多次尝试

总结

image20240626105243080.png

文件上传漏洞安全防御

1、文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。

2、判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

3、使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

4、使用安全设备防御
文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。

5、使用阿里的OSS或者腾讯的COS
       

转载时请注明出处及相应链接。

本文永久链接: http://www.baigei.com/articles/upload-round