文件上传漏洞是Web安全领域被广泛利用且危害极大的漏洞类型之一。
什么是文件上传漏洞?
文件上传漏洞是指Web应用在处理用户上传文件功能时,因未对文件内容、类型、路径等进行充分校验,导致攻击者可以上传恶意文件(如脚本、木马、后门等),并进一步利用服务器的解析执行或访问路径,实现篡改、控制、攻击服务器等目的。
文件上传漏洞的危害
- 服务器变为攻击平台
恶意脚本被执行后,可能获取对服务器的控制权,篡改网站内容、提权、收集敏感信息、扩展至内网等。
- 网站挂马/植入 WebShell
攻击者上传如
.php、.jsp、.aspx、.exe、.sh 等后门脚本,实现远程命令执行。
- 绕过权限或访问控制
上传并通过特殊路径访问服务器任意资源,实现信息泄露。
- 拒绝服务攻击(DoS)
上传大文件或构造数量巨大的请求,耗尽磁盘、内存等资源。
文件上传漏洞的常见表现
- 只校验文件扩展名,不校验内容和类型(如上传
.php 或 .jpg.php)
- 程序未采取文件名去重或过滤,上传后可被直接访问执行
- 对 MIME 类型校验不严或被绕过
- 上传路径可控,导致文件覆盖、目录遍历等问题
- 图片文件携带数据马(如图片+脚本混合文件)
攻击示例
-
图片马/双扩展绕过
上传 shell.php.jpg,应用仅检查扩展名为 .jpg,但服务器“优先解析”.php为代码,结果恶意脚本被执行。
-
直接上传 WebShell
上传如下内容为 shell.php:
<?php system($_GET['cmd']); ?>
然后通过 http://site.com/upload/shell.php?cmd=whoami 执行命令
-
使用路径遍历实现越权
上传的文件名为 ../../../../etc/passwd,如果程序没有过滤路径分隔符,可能覆盖或访问敏感文件。
防御措施
-
严格校验文件类型和内容
- 校验 MIME 类型,后台用常用库对文件头分析判断真实类型。
- 禁止上传可执行脚本文件(php、jsp、asp、exe、sh、bat 等)。
-
限制文件上传目录和访问权限
- 上传目录设为 Web 不可执行区,无需直接访问权限。
- 文件名随机化,禁止覆盖同名文件或暴露原始文件名。
-
改写文件扩展名
- 将所有上传文件扩展名统一改为不可解析的类型(如
.dat),或只允许白名单类型(如 .jpg, .png, .pdf)。
-
图片等特定文件内容检查
-
限制文件大小和数量
-
彻底禁止路径遍历
- 上传文件路径和文件名严格过滤,拒绝
../、\ 等特殊符号。
-
定期清理过期文件
-
使用独立文件服务且分离主站核心权限