SQL注入是“骗数据库”,XSS是“骗浏览器”,那文件上传就是——直接给服务器“送”一个病毒。
全文约2000字,阅读约6分钟。今天带你搞懂文件上传漏洞,亲手拿下一台“服务器”。
一、先讲一个真实故事:一张“头像”黑掉了整个系统
2022-2023年间,某知名办公系统因文件上传漏洞接连发生了3次重大安全事件。攻击者做了什么?很简单——在头像上传功能里,传了一张“伪装成图片的木马文件”。
服务器以为是张普通头像,乖乖存进了网站目录。结果攻击者通过浏览器访问这张“图片”,服务器把它当成了PHP程序来执行——整个系统就这样被控制了。
数据泄露、系统瘫痪、业务停摆……始作俑者,就是一张“图片”。
文件上传漏洞,一直位居OWASP Top 10高危漏洞之列。
二、文件上传漏洞到底是什么?说人话
官方定义是这样的:文件上传漏洞是指Web应用对用户上传的文件未做充分校验,导致攻击者上传恶意脚本文件(如Webshell),进而在服务器上执行任意代码的安全漏洞。
说人话就是一句话:
能让服务器执行你上传的代码,就是文件上传漏洞。
正常情况是:你上传一张头像 → 服务器存起来 → 展示给其他用户看。
漏洞情况是:你上传一个shell.php→ 服务器以为是头像存了起来 → 你访问这个文件 → 服务器把它当作PHP程序执行 →你拿到了服务器的控制权。
这就好比你把一把万能钥匙伪装成普通钥匙交给了保安,保安不仅收下了,还把它插进了总控室的门锁里。
三、漏洞产生的3个必要条件
一个文件上传漏洞要成立,三个条件缺一不可:
| 条件 | 说明 |
|---|---|
| ① 文件能上传 | 网站必须有文件上传功能(头像、附件、文档等) |
| ② 文件能被访问 | 上传目录在Web根目录下,用户能通过URL访问到 |
| ③ 文件能被解析执行 | 服务器支持PHP/ASP/JSP等脚本语言,且配置允许执行 |
只要同时满足这三条,攻击者就能把“上传功能”变成“服务器后门”。
四、一张图看懂攻击流程
构造恶意文件 → 绕过前端校验 → 绕过服务端过滤 → 文件落地服务器 → 找到访问路径 → 触发代码执行
每一步都有对应的“攻防博弈”。下面我带你拆解最常见的几种绕过方式。
五、4种最常见的绕过手法(附实战操作)
🔴 手法一:前端校验绕过——最弱的一道“门”
很多网站会用JavaScript在前端检查文件扩展名,比如“只允许.jpg和.png”。
但前端代码在用户浏览器里运行——用户想怎么改就怎么改。
实战操作:
先上传一个合法的
1.jpg,用Burp Suite抓包。在Burp里把文件名从
1.jpg改成shell.php。放行请求——服务器收到的是
shell.php,前端JS的校验形同虚设。
💡 记住:前端校验只是“用户体验”,不是“安全防御”。
🟠 手法二:MIME类型绕过——伪造一张“身份证”
服务器除了看文件名,还会检查HTTP请求头里的Content-Type字段——图片的MIME类型是image/jpeg,PHP文件是application/octet-stream。
但这个值也在HTTP请求里,同样可以改。
实战操作:
上传
shell.php,用Burp抓包。找到
Content-Type: application/octet-stream。改成
Content-Type: image/jpeg。放行——服务器以为收到了图片,实际收到了木马。
🟡 手法三:黑名单绕过——你封不完的“马甲”
很多服务器用黑名单——禁止.php、.jsp、.asp等后缀。
但黑名单永远封不完。
常见绕过方式:
大小写混写:
.pHp、.PhP——黑名单里只有小写.php双写绕过:
.pphphp——过滤掉中间的php后剩下.php利用漏网后缀:
.php5、.phtml、.php7——黑名单可能只写了.php加点加空格:
shell.php.、shell.php——系统解析时可能忽略末尾的点或空格
🟢 手法四:解析漏洞——服务器的“认知偏差”
这是最经典的手法——让服务器把一个文件“认错”。
Apache解析漏洞:Apache从文件名末尾往前解析,遇到不认识的扩展名就继续往前。shell.php.rar→ 不认识.rar→ 往前看到.php→当成PHP执行。
IIS解析漏洞:shell.asp;.jpg→ IIS看到分号;,把后面的.jpg截断 →当成ASP执行。
Nginx解析漏洞:shell.jpg被访问时带上/shell.php参数 → Nginx可能把它当作PHP来解析。
六、15分钟实战:在DVWA上拿下一台“服务器”
⚠️ 以下操作仅在DVWA本地靶场进行,请勿对未授权网站测试。
📌 第一步:准备“武器”——一句话木马(2分钟)
新建一个文件shell.php,写入:
php
<?php @eval($_POST['cmd']); ?>
这是最经典的一句话木马。eval()会把接收到的字符串当作PHP代码执行。你发什么命令,服务器就执行什么命令。
📌 第二步:上传木马——Low级别(3分钟)
打开DVWA,进入File Upload模块,安全级别调为Low。
选择
shell.php直接上传——Low级别没有任何校验。页面返回上传路径:
http://127.0.0.1/DVWA/hackable/uploads/shell.php
📌 第三步:连接木马——拿到服务器权限(3分钟)
下载中国蚁剑(AntSword)或冰蝎(Behinder)。
打开蚁剑,右键“添加数据”。
URL填
http://127.0.0.1/DVWA/hackable/uploads/shell.php连接密码填
cmd(就是木马里$_POST['cmd']的cmd)点击“添加”——绿色图标亮起,连接成功!
你现在可以看到服务器的文件系统、数据库配置,甚至执行任意系统命令。这台“服务器”已经是你的了。
📌 第四步:挑战Medium级别——绕过前端校验(5分钟)
把DVWA调到Medium级别再试。
直接上传shell.php会被拦截——因为Medium做了前端校验。
怎么办?用Burp Suite:
把
shell.php重命名为shell.png上传时用Burp抓包
在Burp里把文件名改回
shell.php放行——上传成功!
七、怎么防?记住这5条“保命原则”
防御永远比攻击重要。面试必问:
| 原则 | 具体做法 |
|---|---|
| ① 白名单优先 | 只用白名单(只允许.jpg、.png等),不用黑名单 |
| ② 重命名文件 | 上传后随机生成文件名(如20260716_abc123.jpg),让攻击者猜不到路径 |
| ③ 校验文件内容 | 不仅看后缀和MIME,还要用getimagesize()等函数检查文件真实内容 |
| ④ 禁止执行权限 | 上传目录设置php_flag engine off,让里面的文件无法被执行 |
| ⑤ 限制文件大小 | 防止攻击者上传超大文件耗尽磁盘空间 |
八、学习资源包
🎯 必刷靶场:
upload-labs:GitHub开源项目,21关由浅入深,涵盖各种绕过技术
DVWA的File Upload模块:Low→Medium→High→Impossible,逐级挑战
BUUCTF:搜索“文件上传”标签有大量CTF题目
📚 推荐阅读:
FreeBuf搜索“文件上传”标签,有大量实战案例分享
CSDN上的upload-labs通关笔记
写在最后
SQL注入是“骗数据库”,XSS是“骗浏览器”,文件上传是“直接给服务器送病毒”——论危害程度,文件上传绝对是顶级的。
但反过来想,防御它的核心逻辑其实特别简单:不要相信用户上传的任何东西。文件名可以伪造、MIME类型可以伪造、连文件内容都可以伪装。
今天这篇文章,我带你从原理到实战走了一遍文件上传漏洞。请你现在就打开DVWA,把Low、Medium两个级别都亲手打通关。
等你用一句话木马连上第一台“服务器”的那一刻,那种掌控感会让你上瘾。
—— 手把手带你上路的网安教练
📌下期预告:第九弹·提权篇——《拿到Webshell只是开始,如何把普通权限变成管理员?》关注我,不错过每一篇干货