文件上传漏洞利用原理与防御方案
什么是文件上传漏洞?
文件上传漏洞是指服务器允许用户上传文件,但未对文件的名称、大小、类型或内容进行充分验证时产生的安全缺陷。攻击者可以利用此漏洞上传恶意脚本(如 Web Shell),从而控制服务器。
文件上传请求机制
文件上传请求通常包含以下关键部分:
- 文件名:客户端提供的原始文件名。
- Content-Type:HTTP 头中声明的文件 MIME 类型。
- 幻数(Magic Number):文件内容开头的十六进制字节序列,用于标识真实文件类型。
- 文件内容:实际传输的二进制数据。
理解这些组件有助于识别哪些校验点可能被绕过。
为什么文件上传漏洞是个问题?
文件上传功能实施不当会带来严重风险:
- 服务器端攻击:上传 Web Shell 允许执行任意系统命令、读取敏感文件或遍历目录。
- 客户端攻击:上传的恶意图片可能触发跨站脚本(XSS)或跨站内容劫持。
- 拒绝服务(DoS):上传超大文件或大量文件可耗尽磁盘空间或内存。
- 信息泄露:错误消息可能暴露服务器内部路径或配置细节。
漏洞 #1:通过文件内容利用
远程代码执行(Web Shell 上传)
攻击者尝试上传可执行的脚本文件。例如,一个 PHP Web Shell 如下:
<?php echo system($_GET['command']); ?>
若服务器未限制 .php 扩展名或解析逻辑存在缺陷,攻击者可通过 URL 访问该文件并执行命令。
绕过黑名单保护
黑名单仅阻止已知危险扩展名,但无法覆盖所有变种。
- 大小写绕过:将
php改为PHP或PhP,部分服务器不区分大小写。 - 替代扩展名:使用
phtml,php5,php3,asp,asa,cer等,取决于服务器配置(如 IIS 映射)。 - 文件遍历序列:在文件名中使用
../尝试写入到可执行目录,如../../exploit.php。 - Content-Type 篡改:拦截请求修改
Content-Type为image/png以通过检查。 - 文件签名伪造:在文件头部添加 PNG/JPG 的 Magic Bytes,配合后端代码注入。
绕过白名单保护
白名单看似更安全,但仍存在绕过方法。
- 双扩展名:上传
shell.jpg.php。某些服务器按最后一个后缀解析,而前端校验只看第一个。 - :在文件名中加入 (如 ),截断 C/C++ 处理逻辑中的字符串,导致保存为 。


