文件上传漏洞绕过方法

1. 客户端 JS 绕过

这是最简单也是最常见的绕过方法。许多开发者为了方便,只在前端(浏览器)使用 JavaScript 脚本来检查文件类型,如 .jpg.png.gif

  • 绕过方法:
    • 禁用 JavaScript: 在浏览器设置中直接禁用 JS,或者使用抓包工具(如 Burp Suite)拦截请求,修改文件名和内容后再发送
    • 抓包修改文件名: 正常上传一个合法的图片文件(1.jpg),然后使用 Burp Suite 拦截数据包,将文件名修改为 1.php。由于服务器后端没有进行二次验证,就会直接上传成功

2. MIME 类型绕过

服务器有时会通过检查 HTTP 请求头中的 Content-Type 字段来验证文件类型。例如,一个图片的 Content-Type 通常是 image/jpegimage/png

  • 绕过方法:
    • 修改 Content-Type 攻击者可以上传一个 webshell.php 文件,同时在抓包工具中将 Content-Type 字段从 application/octet-stream(默认值)修改为 image/jpeg。如果后端只依赖这个字段进行判断,恶意文件就会上传成功

3. 文件头内容检测绕过(魔术字节)

一些更安全的系统会检查文件的“魔术字节”(Magic Bytes),也就是文件头部的一串特定字节,用以识别文件类型。例如,JPEG 图片文件开头通常是 FF D8 FF E0

  • 绕过方法:
    • “图片马”: 攻击者可以将恶意代码嵌入到图片文件中,制作成一个“图片马”
    • 制作方法:
      1. 准备一张正常的图片(1.jpg)和一个包含恶意代码的文本文件(shell.php),内容为 <?php eval($_POST['cmd']);?>
      2. 使用命令将两者合并:copy 1.jpg/b + shell.php/a webshell.jpg
    • 利用方式:
      1. 上传 webshell.jpg 文件。如果服务器检查了文件头,但没有检查文件内容,就会上传成功。
      2. 然后,攻击者需要找到一种方法来解析这个图片文件,使其作为 PHP 代码执行。这通常需要结合 文件包含漏洞(LFI) 来实现,例如 include('webshell.jpg'),或者一些服务器配置错误(如 Apache 的 .htaccess 配置)

4. 文件名、路径绕过

服务器通常会有一份黑名单或白名单来限制可上传的文件扩展名。黑名单会阻止 .php, .asp, .jsp 等脚本文件,而白名单只允许 .jpg, .png, .gif 等图片文件

a. 黑名单绕过

  • 大小写绕过: shell.Phpshell.pHP
  • 文件后缀名加空格或点: 在 Windows IIS 服务器上,文件名末尾的空格或点会被自动去除
    • shell.php(空格)
    • shell.php.(点)
  • 双重扩展名: 某些服务器只检查最后一个扩展名
    • shell.php.jpg:上传后,如果服务器处理不当,可能会被当做 shell.php 来执行。
  • 特殊字符绕过: 利用一些特殊字符,如 shell.php%00.jpg(00 截断)
    • 00截断: 在 PHP 5.3 之前,PHP 的 move_uploaded_file() 函数在处理文件名时,遇到 0x00 字节会截断后面的内容。攻击者可以在文件名中注入 %00,如 shell.php%00.jpg,上传时,服务器只检查 .jpg,但实际保存的文件名是 shell.php

b. 白名单绕过

  • 服务器解析漏洞:
    • Apache: 如果服务器配置了 AddHandler php5-script .jpg,那么所有 .jpg 文件都会被当作 PHP 脚本来解析
    • IIS 6.0: 目录解析漏洞,例如 /xx.asp/shell.jpg。服务器会把 shell.jpg 当作 ASP 脚本执行
    • IIS 7.0/7.5: web.config 配置文件解析漏洞。攻击者可以上传一个恶意的 web.config 文件来改变目录的解析规则
  • 竞争条件(Race Condition):
    • 一些服务器在处理文件上传时,会先将文件临时保存,然后进行安全检查,最后再重命名或移动到目标目录
    • 利用方法: 攻击者可以利用这个时间差,在文件被检查并删除之前,迅速访问该文件
    • 步骤:
      1. 上传一个包含恶意代码的脚本文件(如 shell.php),其中恶意代码会创建一个新的 Webshell 文件
      2. 在文件上传成功后,但在服务器删除它之前,通过一个脚本循环快速访问该文件
      3. 恶意脚本被执行,并创建一个新的、无法被删除的 Webshell 文件
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:53

results matching ""

    No results matching ""