一张图片如何变成服务器权限?文件上传漏洞全解析(第八弹·文件上传篇)
2026/7/17 14:30:38 网站建设 项目流程

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. 先上传一个合法的1.jpg,用Burp Suite抓包。

  2. 在Burp里把文件名从1.jpg改成shell.php

  3. 放行请求——服务器收到的是shell.php,前端JS的校验形同虚设。

💡 记住:前端校验只是“用户体验”,不是“安全防御”

🟠 手法二:MIME类型绕过——伪造一张“身份证”

服务器除了看文件名,还会检查HTTP请求头里的Content-Type字段——图片的MIME类型是image/jpeg,PHP文件是application/octet-stream

但这个值也在HTTP请求里,同样可以改。

实战操作:

  1. 上传shell.php,用Burp抓包。

  2. 找到Content-Type: application/octet-stream

  3. 改成Content-Type: image/jpeg

  4. 放行——服务器以为收到了图片,实际收到了木马。

🟡 手法三:黑名单绕过——你封不完的“马甲”

很多服务器用黑名单——禁止.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分钟)

  1. 打开DVWA,进入File Upload模块,安全级别调为Low

  2. 选择shell.php直接上传——Low级别没有任何校验。

  3. 页面返回上传路径:http://127.0.0.1/DVWA/hackable/uploads/shell.php

📌 第三步:连接木马——拿到服务器权限(3分钟)

下载中国蚁剑(AntSword)冰蝎(Behinder)

  1. 打开蚁剑,右键“添加数据”。

  2. URL填http://127.0.0.1/DVWA/hackable/uploads/shell.php

  3. 连接密码填cmd(就是木马里$_POST['cmd']cmd

  4. 点击“添加”——绿色图标亮起,连接成功!

你现在可以看到服务器的文件系统、数据库配置,甚至执行任意系统命令。这台“服务器”已经是你的了

📌 第四步:挑战Medium级别——绕过前端校验(5分钟)

把DVWA调到Medium级别再试。

直接上传shell.php会被拦截——因为Medium做了前端校验。

怎么办?用Burp Suite:

  1. shell.php重命名为shell.png

  2. 上传时用Burp抓包

  3. 在Burp里把文件名改回shell.php

  4. 放行——上传成功!

七、怎么防?记住这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只是开始,如何把普通权限变成管理员?》关注我,不错过每一篇干货

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询