文件上传漏洞利用原理与防御方案
什么是文件上传漏洞?
文件上传漏洞是指服务器允许用户上传文件,但未对文件的名称、大小、类型或内容进行充分验证时产生的安全缺陷。攻击者可以利用此漏洞上传恶意脚本(如 Web Shell),从而控制服务器。
文件上传漏洞允许攻击者将恶意文件上传至服务器,可能导致远程代码执行、跨站脚本或拒绝服务。常见利用手段包括绕过扩展名黑名单、利用 SVG 解析缺陷触发 XXE/SSRF、以及通过文件名注入 XSS。防御策略应包含服务端内容校验、严格白名单、文件重命名存储、禁用目录执行权限及网络层防护,确保不信任任何客户端提供的文件属性。

文件上传漏洞是指服务器允许用户上传文件,但未对文件的名称、大小、类型或内容进行充分验证时产生的安全缺陷。攻击者可以利用此漏洞上传恶意脚本(如 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 为 image/png 以通过检查。白名单看似更安全,但仍存在绕过方法。
shell.jpg.php。某些服务器按最后一个后缀解析,而前端校验只看第一个。%00(如 shell.jpg%00.php),截断 C/C++ 处理逻辑中的字符串,导致保存为 .php。SVG 基于 XML,常被用于图形展示,但也引入特定风险。
攻击者可构造包含外部资源引用的 SVG,诱导服务器发起请求:
<svg xmlns="http://www.w3.org/2000/svg">
<image xlink:href="https://attacker.com/pic.svg"/>
</svg>
通过定义实体读取本地文件:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg><text>&xxe;</text></svg>
在 SVG 中嵌入 <script> 标签,当页面渲染该图片时触发:
<svg>
<script>alert('XSS');</script>
</svg>
上传超长文件名可能导致缓冲区溢出或日志膨胀,消耗服务器资源。
若文件名直接回显在页面上,可注入脚本:
<img src=x onerror=alert(1)>.jpg若不限制上传大小,攻击者可上传大文件耗尽磁盘空间(像素泛洪攻击)。
Content-Type,需结合文件头(Magic Number)验证。.png, .jpg),禁止脚本类扩展。Options -ExecCGI)。文件上传漏洞是 Web 应用的高危风险之一。防御的核心在于'不信任客户端',必须通过多层校验、存储隔离及权限控制来构建纵深防御体系。开发者应定期审查上传逻辑,及时修补绕过手段,确保系统安全。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online