文章目录
- 一、简介
- 二、危害
- 三、文件检测方式分类
- 四、判断文件检测方式
- 五、文件上传绕过技术
- 六、漏洞防御措施
一、简介
文件上传漏洞是指Web应用程序在处理用户上传文件时,未对文件类型、内容、路径等进行严格校验和限制,导致攻击者可上传恶意文件(如WebShell、木马、病毒等)到服务器,进而控制服务器或执行非法操作。其核心原理在于服务器对上传文件的处理逻辑存在缺陷,例如未限制可执行文件的存储路径、未验证文件真实类型等。根据统计,约30%的Web应用存在此类漏洞。
二、危害
远程代码执行:上传WebShell(如PHP、ASP脚本)可直接执行系统命令,控制服务器。
数据泄露:攻击者可访问敏感文件(如数据库配置、用户信息)。
服务器瘫痪:通过上传大文件或恶意程序发起DDoS攻击。
权限提升:结合路径遍历漏洞覆盖系统关键文件,或篡改网站内容。
供应链攻击:上传恶意图片或跨域策略文件(如crossdomain.xml),控制客户端行为。
三、文件检测方式分类
文件上传检测主要分为以下五类:
客户端检测:通过JavaScript校验文件扩展名和大小,易被禁用或绕过。
服务端MIME检测:验证HTTP请求的Content-Type字段(如image/jpeg),但可伪造。
扩展名检测:黑名单或白名单校验文件后缀,易被大小写、双扩展名(如.php.jpg)绕过。
文件内容检测:检查文件头(Magic Number)或二次渲染图片破坏恶意代码。
目录路径检测:限制上传路径合法性,但可能被路径遍历(如…/)突破。
四、判断文件检测方式
客户端检测:
上传非法文件时,未发送请求即弹出错误提示(如“仅允许.jpg文件”)。
服务端检测:
MIME检测:修改Content-Type为合法类型(如image/png)可绕过。
扩展名检测:尝试上传非常见后缀(如.phtml、.php5)测试黑名单覆盖范围。
内容检测:添加合法文件头(如GIF89a)或嵌入恶意代码于图片元数据(Exif)。
五、文件上传绕过技术
扩展名绕过:
-
双扩展名:.php.jpg(Apache解析漏洞)。
-
空字节截断:shell.php%00.jpg(PHP版本<5.3.4)。
-
大小写混淆:.pHp、.AsP。
内容欺骗: -
图片马:通过copy /b 1.jpg+shell.php 2.jpg合并文件。
-
Exif元数据注入:使用工具(如ExifTool)插入恶意代码。
解析漏洞利用: -
Apache解析规则:从右向左解析扩展名(如1.php.xxx)。
-
IIS目录路径解析:/upload/shell.asp/1.jpg触发ASP解析。
条件竞争:快速上传并访问临时文件,绕过删除逻辑。
六、漏洞防御措施
严格校验机制:
-
白名单验证:仅允许特定扩展名(如.jpg、.png)和MIME类型。
-
文件内容检测:使用finfo库验证文件头,二次渲染图片破坏隐藏代码。
存储安全: -
随机重命名:使用UUID或哈希值生成文件名,避免直接访问。
-
非Web目录存储:上传文件存放于不可通过URL直接访问的路径。
-
权限控制:目录设置为不可执行(如chmod -x uploads/)。
服务器加固: -
禁用危险函数:如PHP的system()、exec()。
-
配置安全:Apache禁用.htaccess,Nginx限制解析特定扩展名。
其他措施: -
日志监控:记录上传行为,实时检测异常(如高频上传)。
-
CDN分发:通过CDN提供静态文件,隔离执行风险。
总结
文件上传漏洞的防御需从输入验证、存储隔离、服务器配置多层面综合防护。开发中应优先采用白名单机制,避免依赖客户端检测,并结合定期渗透测试修复潜在风险。攻击手法与防御技术持续演进,需紧跟安全社区动态更新防护策略。