# 什么是文件上传漏洞
文件上传漏洞(File Upload Vulnerability)是指网站或应用程序在处理用户上传的文件时,未进行充分的安全检查,导致攻击者可以上传恶意文件(如 Web Shell、病毒、木马等),从而获取服务器控制权或执行其他恶意操作。
# 文件上传漏洞的危害
- 远程代码执行(RCE)
- 上传 Web Shell(如 PHP、JSP、ASP 等脚本),直接控制服务器。
- 示例:上传
shell.php
,访问后可执行任意命令。
- 网站篡改
- 上传恶意 HTML/JS 文件,进行钓鱼攻击或 XSS 攻击。
- 服务器入侵
- 上传后门程序,获取服务器权限,进一步渗透内网。
- 拒绝服务(DoS)
- 上传超大文件耗尽服务器存储空间或带宽。
- 数据泄露
- 上传包含敏感信息的文件,如数据库备份、配置文件等。
# 常见的文件上传绕过技术
攻击者会尝试绕过文件上传限制,常见方法包括:
# 1. 修改文件扩展名(黑名单绕过)
- 如果服务器仅禁止
.php
,攻击者可尝试:.php5
,.phtml
,.phar
(PHP 可解析的扩展名).jpg.php
(某些服务器可能只检查最后的后缀)
# 2. 修改 Content-Type
-
服务器可能仅检查
Content-Type: image/jpeg
,攻击者可伪造:http
-
`POST /upload.php HTTP/1.1Content-Type: image/jpeg
# 3. 利用双扩展名或特殊字符
shell.php.jpg
(某些解析漏洞可能仍执行 PHP 代码)shell.php%00.jpg
(空字节截断,旧版 PHP 可能忽略.jpg
)
# 4. 利用解析漏洞
- Apache/Nginx 解析漏洞:
shell.php.xxx
(某些配置可能仍解析为 PHP)
- IIS 解析漏洞:
shell.asp;.jpg
(IIS 可能忽略分号后的内容)
# 5. 利用.htaccess 或 web.config 文件
-
上传恶意
.htaccess
(Apache)或web.config
(IIS)覆盖服务器配置,使图片文件被解析为 PHP。htaccess
-
AddType application/x-httpd-php .jpg
# 如何防御文件上传漏洞?
# 1. 白名单限制文件扩展名
- 仅允许特定扩展名(如
.jpg
,.png
,.pdf
),拒绝可执行文件(.php
,.jsp
,.asp
)。
# 2. 检查文件内容(MIME 类型、魔术字节)
- 不仅检查扩展名,还要检查文件头(如 JPEG 文件应以
FF D8 FF
开头)。 - 使用
file
命令或 PHP 的finfo_file()
检测真实文件类型。
# 3. 重命名上传的文件
- 使用随机文件名(如
a1b2c3d4.jpg
),避免攻击者直接访问恶意文件。
# 4. 限制文件大小
- 防止攻击者上传超大文件导致 DoS 攻击。
# 5. 存储上传文件在非 Web 目录
- 上传的文件应存储在无法直接访问的目录,并通过脚本读取(如
/uploads/
禁止执行 PHP)。
# 6. 禁用危险函数(PHP 环境)
-
在
php.ini
中禁用危险函数:ini
-
disable_functions = exec, system, shell_exec, passthru
# 7. 使用 WAF(Web 应用防火墙)
- 配置规则拦截恶意文件上传请求。