文件上传漏洞完整原理与绕过
前言
文件上传漏洞是 Web 安全领域危害最高、实战利用最频繁的高危漏洞,同时也是 CTF 竞赛、渗透测试、护网红蓝对抗中的核心考点。绝大多数网站入侵、服务器沦陷、Webshell 植入,根源都来自不规范的文件上传功能。
文件上传功能广泛应用于头像上传、附件提交、图片素材上传等业务场景,若后端未对文件名、后缀、文件类型、文件内容做严格校验,攻击者即可通过各类绕过方式上传恶意脚本文件,最终实现代码执行、服务器控制、内网渗透等高危操作。
本文将从漏洞底层原理、校验机制缺陷、全网最全绕过技巧、中间件解析漏洞、竞争条件上传、蓝队防御加固等维度完整讲解文件上传漏洞,从零梳理全套知识体系,适合零基础入门、面试复习、护网实战学习使用。
【法律声明】⚠️本文仅用于企业授权环境下安全自查与网络安全学习,禁止在未授权网站、服务器上传恶意文件、测试上传漏洞。未经授权上传脚本、控制服务器、入侵计算机系统均属于违法犯罪行为,请严格遵守《网络安全法》《刑法》相关法律法规。
一、什么是文件上传漏洞
文件上传是 Web 业务常见功能(头像上传、附件上传、图片上传)。文件上传漏洞是指 Web 服务未对用户上传的文件做严格合法性校验,导致恶意脚本文件(php/jsp/asp/aspx)可成功上传至网站可访问目录,被服务器解析执行,最终造成远程代码执行、服务器沦陷。
漏洞核心本质
能上传 + 能访问 + 能解析 = Getshell
三个条件缺一不可:
- 能上传:绕过前端 / 后端校验,成功上传恶意脚本;
- 能访问:上传文件存储在 Web 可访问目录,可通过 URL 访问;
- 能解析:服务器中间件(Nginx/Apache/IIS)将文件当做脚本解析执行。
漏洞危害等级
超高危漏洞,直接拿下服务器权限,可实现:命令执行、文件读写、数据库窃取、植入持久化后门、内网横向渗透。
二、文件上传校验的四大层级(漏洞根源)
开发者通常会在四个层级做校验,校验不完整、校验逻辑错误是所有绕过的核心原因:
1. 前端 JS 校验(最弱)
仅在浏览器前端通过 JS 判断后缀、文件大小、文件类型。
- 缺陷:前端代码可控,可直接禁用 JS、抓包改包绕过。
2. Content-Type 校验
后端判断 HTTP 请求头的Content-Type字段,判断是否为图片类型。
- 缺陷:该字段由客户端可控,抓包可随意修改,极易绕过。
3. 文件后缀校验(黑白名单)
- 黑名单:禁止上传 php、jsp、exe 等危险后缀(极不安全,极易绕过)
- 白名单:仅允许 jpg、png、gif 等合法后缀(相对安全)
4. 文件内容校验(文件头校验)
读取文件前几位十六进制文件头,判断是否为真实图片:
- JPG:
FF D8 FF - PNG:
89 50 4E 47 - GIF:
47 49 46 38
缺陷:仅校验文件头,可制作图片马绕过。
三、全网最全文件上传绕过方式(实战合集)
3.1 前端 JS 校验绕过
原理
校验逻辑全部写在前端,后端无二次校验。
绕过方法
- 浏览器 F12 禁用 JavaScript;
- 修改前端上传代码,删除后缀判断逻辑;
- Burp 抓包,直接上传 shell.php,无视前端限制。
3.2 Content-Type 类型绕过
原理
后端仅判断请求头文件类型,未校验真实文件内容。
绕过方式
抓包修改请求头:
将 Content-Type: application/x-php
改为 Content-Type: image/jpeg / image/png
即可绕过后端 MIME 类型检测。
3.3 黑名单后缀绕过(高频)
黑名单存在大量遗漏后缀,PHP 不止.php一种可解析后缀:
可绕过后缀(Apache/Nginx 通用)
.php2 .php3 .php4 .php5 .php7 .phtml .pht
部分服务器默认解析以上后缀为 PHP 脚本,黑名单拦截 php 即可绕过。
3.4 大小写绕过
原理
Windows 系统文件名不区分大小写,后端黑名单区分大小写。
Payload
Shell.PHP、backdoor.PhP
后端拦截小写 php,Windows 自动识别为脚本文件,正常解析执行。
3.5 空格绕过(Windows 特性)
原理
Windows 自动去除文件名末尾空格,后端未过滤空格。
Payload
shell.php (文件名末尾加空格)
后端校验:后缀不是 php,拦截失效;
保存到服务器:自动去除空格,变为 shell.php 正常解析。
3.6 点号绕过(Windows 特性)
原理
Windows 自动去除文件名末尾点号。
Payload
shell.php.
后端校验后缀异常放行,服务器自动清除末尾点,生成 php 脚本。
3.7 00 截断绕过(经典老漏洞)
适用条件
PHP 版本<5.3.29、magic_quotes_gpc=Off
原理
%00为空字符,截断字符串,后端只读取截断前内容,服务器保存截断后内容。
Payload
shell.php%00.jpg
后端校验后缀为 jpg 放行,服务器保存为 shell.php,成功解析。
3.8 文件头绕过(图片马绕过)
原理
后端校验文件头是否为图片,未校验全文内容。
制作方式
- 手动头部添加
GIF89a; - CMD 合成图片马:
copy 图片.jpg /b + shell.php /b new.jpg
Payload
文件头为图片标识,尾部嵌入一句话木马,绕过内容校验,搭配文件包含漏洞即可执行。
3.9 双后缀绕过 / 后缀替换绕过
原理
后端简单替换、删除关键字,可双写绕过。
Payload
shell.pphphp
后端删除 php → shell.php,成功生成脚本文件。
3.10 特殊字符绕过
利用分号、斜杠等特殊字符截断解析:
shell.jpg;.php
部分中间件仅识别分号前内容,后端校验为图片,实际解析为 PHP 脚本。
四、三大服务器解析漏洞(上传必考点)
上传文件成功后,解析漏洞是执行后门的关键,是护网高频利用点。
4.1 Apache 解析漏洞
规则
Apache 从后往前识别后缀,不认识的后缀向前遍历解析。
利用
上传 shell.php.xxx
xxx 为未知后缀,Apache 向前识别 php,当做 PHP 脚本执行。
4.2 Nginx 解析漏洞(CVE-2013-4547)
规则
Nginx 默认将 xxx.jpg/xxx.php 路径解析为 PHP 文件。
利用
上传图片马 shell.jpg
访问路径:shell.jpg/.php
服务器将图片文件当做 PHP 解析,执行内嵌木马代码。
4.3 IIS 解析漏洞
.asp;xx.jpg解析为 ASP 脚本- 目录解析:
upload.asp/目录下所有文件当做 ASP 解析
五、竞争条件上传绕过(高阶无文件残留)
原理
服务器先保存文件,再做校验、删除文件,存在时间差。
攻击者利用高并发,在文件删除前瞬间访问文件,执行代码、写入持久化后门。
利用流程
- 高速重复上传恶意脚本;
- 同时并发访问上传文件地址;
- 服务器校验删除前,脚本已执行,写入不死马 / 持久化后门;
- 后续即使原文件被删除,后门依然留存。
六、文件上传漏洞核心防御方案(蓝队必备)
6.1 代码层核心防御(最关键)
- 放弃黑名单,强制使用白名单,仅允许指定图片、文档后缀;
- 禁止客户端可控后缀,服务端强制校验文件后缀;
- 校验真实文件内容 + 文件头,双重校验,杜绝图片马;
- 过滤特殊字符:空格、点号、%00、分号、斜杠;
6.2 服务器配置防御
- 上传目录禁止脚本解析(终极防御)
Nginx/Apache 配置上传目录不解析 php/jsp 脚本,即使上传成功也无法执行; - 关闭中间件解析漏洞补丁;
- 升级 PHP、Nginx、Apache 至最新版本,修复截断、解析漏洞。
6.3 业务层防御
- 上传文件随机重命名,杜绝可控文件名绕过;
- 分离上传目录与 Web 访问目录;
- 限制文件大小、上传频率,防御竞争条件暴力上传;
- WAF 拦截恶意后缀、伪协议、脚本内容。
七、新手常见误区总结
- ❶ 上传成功 = Getshell
✅ 正确:必须满足「上传成功 + 可访问 + 可解析」三个条件; - ❷ 图片马可以直接执行
✅ 正确:图片马必须搭配文件包含 / 解析漏洞才能执行; - ❸ 黑名单防御安全
✅ 正确:黑名单极易被后缀绕过、大小写绕过,完全不安全; - ❹ 仅校验 Content-Type 即可防御
✅ 正确:请求头完全可控,可随意篡改。
八、总结
文件上传漏洞的所有绕过逻辑,本质都是利用校验逻辑不严谨、服务器解析特性、系统文件名特性。
红队渗透中,上传漏洞是最快拿 shell的漏洞;蓝队防御核心是:白名单校验 + 文件内容校验 + 上传目录禁止脚本解析 + 随机重命名,四层防护可彻底杜绝上传漏洞。
掌握各类绕过方式,不仅用于渗透测试,更能帮助安全从业者完善代码安全加固,是 Web 安全、护网演练的核心必修课。
【免责声明】本文仅用于网络安全学习、企业授权环境安全自查。任何未经授权上传恶意脚本、利用文件上传漏洞入侵网站与服务器、获取非法权限的行为,均违反网络安全相关法律法规,一切违法后果由使用者自行承担,本文作者不承担任何法律连带责任。
最后
网络安全需要学习那些知识
网络安全零基础入门学习路线&规划
初级
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!

7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。

网络安全工程师企业级学习路线

视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

一些我自己买的、其他平台白嫖不到的视频教程:

要学习网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。
机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!
这份完整版的学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

1190



被折叠的 条评论
为什么被折叠?



