文件上传漏洞

一句话定义

1
文件上传漏洞是系统对上传文件的后缀、MIME、内容、路径和执行权限限制不严格,导致攻击者上传恶意脚本文件,最终可能获取 WebShell 或执行命令。

测试流程

  1. 上传正常图片,确认上传流程。
  2. Burp 抓包,判断前端校验还是后端校验。
  3. 测试后缀黑白名单。
  4. 测试 MIME 类型。
  5. 测试文件头。
  6. 测试大小写、双后缀、特殊后缀。
  7. 判断上传目录是否能访问。
  8. 判断上传目录是否有脚本执行权限。
  9. 根据中间件和语言环境选择 payload。

常见绕过

  • 前端 JS 校验绕过。
  • MIME 绕过。
  • 文件头绕过,如 GIF89a
  • 后缀绕过,如 .php3.php5.phtml
  • 大小写绕过。
  • 双后缀。
  • 图片马。
  • 解析差异。
  • 条件竞争。
  • 配置文件配合。

PHP 场景

关注:

  • .php
  • .php3
  • .php5
  • .phtml
  • .htaccess
  • .user.ini

.htaccess 主要适用于 Apache 且允许目录配置覆盖。
.user.ini 主要与 PHP-FPM 场景相关。

.NET/IIS 场景

关注:

  • .aspx
  • .ashx
  • .asmx
  • .asp
  • .asa
  • .cer
  • IIS 解析配置。
  • 上传目录执行权限。
  • web.config 配置风险。

Java/Tomcat 场景

关注:

  • .jsp
  • .jspx
  • war 包部署。
  • Tomcat 管理后台弱口令。
  • 上传目录是否会被 JSP 引擎解析。

关键理解

上传成功不等于 getshell。必须满足:

  1. 文件可访问。
  2. 上传目录有对应脚本执行权限。
  3. 文件能被对应中间件解析。

修复方案

  • 后端白名单限制。
  • 校验真实文件内容。
  • 文件重命名。
  • 上传目录禁止脚本执行。
  • 文件放到对象存储或静态资源域。
  • 限制文件大小和上传频率。
  • 不返回可预测路径。
  • 做病毒/恶意文件扫描。

面试标准回答

1
2
3
4
5
6
7
文件上传漏洞是因为系统对上传文件的后缀、MIME、内容、路径和执行权限限制不严格,导致攻击者上传恶意脚本。

测试时我会先上传正常图片确认流程,再用 Burp 抓包判断校验点。然后测试前端校验、MIME、文件头、大小写、双后缀、特殊后缀、图片马和上传目录执行权限。

如果是 PHP 环境,会关注 php、php3、php5、phtml、.htaccess、.user.ini;如果是 .NET/IIS 环境,会关注 aspx、ashx、asmx、asp、asa、cer;如果是 Java/Tomcat 环境,会关注 jsp、jspx 和 war 包。

修复上要用后端白名单、校验文件内容、重命名文件、上传目录禁止脚本执行,并把文件放到静态资源域或对象存储。