upload-labs前十一关实战:文件上传漏洞绕过与防御

发布时间:2026/10/20 3:22:56
upload-labs前十一关实战:文件上传漏洞绕过与防御 1. 从零搭建本地文件上传演练环境文件上传漏洞是Web安全领域最经典、也最容易被低估的一类问题。很多人觉得不就是传个文件吗但真正上手一套完整的上传靶场从第一关到第十一关一路打下来你会发现每一关背后都对应着一种真实的防御思路和绕过手法。这套靶场业内通常叫 upload-labs一共二十来关我打算分上下两篇来写上篇覆盖前十一关下篇再啃后面那些更刁钻的。这篇文章适合谁看如果你刚接触Web安全想找一个能系统练手的靶场或者你已经会一些基础操作但每次遇到上传点就只会传个图片马然后一脸茫然那这篇内容应该能帮到你。我会把每一关的判断逻辑、绕过原理、实操步骤、以及我踩过的坑都讲清楚尽量做到你跟着做就能复现。1.1 环境准备为什么推荐用集成环境而不是手动搭搭建这套靶场最省事的方式是用现成的集成环境。我试过手动配 Apache PHP MySQL光是版本兼容就能折腾一下午——PHP 版本高了某些函数行为变了版本低了又跑不起来新代码。所以我的建议是直接用 phpStudy 或者类似的集成面板选一个 PHP 5.6 到 7.4 之间的版本这个区间对靶场的兼容性最好。具体步骤大致是这样下载并安装集成环境面板启动 Apache 和 MySQL 服务。把 upload-labs 的源码放到网站根目录下比如WWW/upload-labs。浏览器访问http://localhost/upload-labs能看到关卡列表就说明环境通了。如果遇到报错优先检查 PHP 版本和php.ini里的file_uploads、upload_max_filesize、post_max_size这几个配置项。提示靶场里有些关卡依赖特定的 PHP 配置比如magic_quotes_gpc在旧版本才有如果你用的是 PHP 7 以上个别关卡的表现可能和教程不一样。遇到这种情况先确认自己的 PHP 版本再对照关卡说明调整。1.2 上传漏洞到底在防什么先建立正确的认知框架在动手之前有必要把文件上传漏洞这件事的本质说清楚。服务器允许用户上传文件本身是正常需求——头像、附件、导入数据都需要上传。问题出在如果服务器对上传文件的类型、内容、存放位置、执行权限没有做严格限制攻击者就能上传一个可执行脚本然后通过访问这个脚本在服务器上执行任意代码。所以防御的核心就三件事不让传危险类型、传上去了也不能执行、执行了也拿不到高权限。后面十一关本质上就是在反复演练这三件事的各种做了但没做全的情况。理解了这条主线你再看每一关的代码就会觉得思路特别清晰。常见的绕过维度有这么几类先有个印象绕过维度典型手法对应关卡思路前端校验改包、禁用JS第一关MIME类型校验修改Content-Type第二关黑名单后缀大小写、特殊后缀、点空格第三到五关内容检测图片马、绕过getimagesize部分关卡解析漏洞利用服务器解析特性后续关卡2. 前端校验与MIME类型最基础的两道门前两关是整套靶场里最简单的但恰恰是新手最容易知其然不知其所以然的地方。很多人照着教程改个包就过了但问他为什么能过答不上来。我把这两关的原理拆开讲。2.1 第一关前端JS校验改个包就完事第一关的代码逻辑是在前端用 JavaScript 做校验只允许上传.jpg、.png、.gif这类图片后缀。你在页面上选一个.php文件它会直接弹窗告诉你不允许上传该类型。这里的核心问题是前端校验完全运行在浏览器里而浏览器是用户可以完全控制的。校验代码在客户端执行就意味着用户可以绕过它。绕过方式有两种方法一禁用浏览器 JavaScript。在浏览器设置里关掉JS或者用开发者工具临时禁用前端校验直接失效请求会原样发到服务器。方法二改包。先把文件名改成.jpg让前端校验通过然后用抓包工具比如 Burp Suite拦截请求把文件名改回.php再放行。我一般用第二种因为更贴近真实场景——真实环境里你未必能随便关JS但抓包改包是标配技能。具体操作准备一个内容为?php echo test; ?的shell.php文件。在页面上传时先把文件名改成shell.jpg让它通过前端校验。抓包找到filenameshell.jpg这一行改成filenameshell.php。放行请求提示上传成功。访问上传后的文件路径如果页面输出test说明PHP代码被执行了。注意这一关能成功的前提是服务器端完全没有做任何校验只靠前端挡着。现实中如果只做前端校验等于没做。2.2 第二关MIME类型校验改Content-Type即可第二关在前端校验的基础上服务器端加了一层 MIME 类型检查。它读取请求头里的Content-Type字段判断是不是image/jpeg、image/png这类图片类型。这里要理解一个关键点Content-Type是客户端在请求里自己声明的服务器如果只信这个字段那它就是在信用户的一面之词。你完全可以在抓包工具里把它改成任意值。绕过步骤上传shell.php抓包。找到请求头里的Content-Type: application/x-php或者类似值。改成Content-Type: image/jpeg。放行上传成功。这一关和第一关的区别在于第一关改的是文件名第二关改的是请求头里的类型声明。两关都在告诉你同一个道理——凡是客户端能控制的东西都不能作为安全判断的依据。我见过不少初学者在这里卡住原因是他们只改了文件名没改 Content-Type或者反过来。记住这一关文件名保持.php不变只改 Content-Type。3. 黑名单的千层套路后缀绕过的花式玩法从第三关开始服务器端开始用黑名单来过滤后缀了。所谓黑名单就是列出一堆危险后缀比如.php、.asp、.jsp只要上传的文件后缀不在黑名单里就放行。听起来挺合理但黑名单这东西只要漏掉一个变体整个防御就形同虚设。第三到第五关就是黑名单漏网之鱼的三种典型。3.1 第三关黑名单不全换个后缀就过第三关的黑名单里只写了.php、.asp、.jsp这些常见脚本后缀但它漏掉了一些冷门但同样能被解析的后缀。比如在 Apache 的某些配置下.php3、.php4、.php5、.phtml这些后缀也会被当作 PHP 来解析。绕过方式就是直接把文件名改成shell.phtml或者shell.php3如果服务器配置支持就能解析执行。这一关给我的启发是黑名单永远不可能穷举完整。你列了十个危险后缀可能还有第十一个你没见过。所以成熟的做法是用白名单——只允许明确安全的类型其余一律拒绝。这也是后面几关会反复出现的对比。3.2 第四关大小写绕过Windows下的经典坑第四关的黑名单比第三关全了一些把.php3、.phtml这些也加进去了。但它犯了一个低级错误没有做大小写统一处理。在 Windows 环境下文件系统对大小写不敏感shell.PHP和shell.php在系统看来是同一个文件。而黑名单里只写了小写的.php所以你上传shell.PHP就能绕过。操作很简单把文件名改成shell.PHP直接上传。提示这一关在 Linux 环境下不一定能成功因为 Linux 文件系统区分大小写。靶场通常跑在 Windows 上所以能过。这也提醒我们防御代码要考虑跨平台差异不能想当然。3.3 第五关点空格绕过Windows文件名的特性第五关的黑名单又全了一点大小写也处理了。但它没考虑到 Windows 文件系统的一个特性文件名末尾的点和空格会被自动去掉。也就是说你上传一个叫shell.php.末尾带点或者shell.php末尾带空格的文件Windows 在保存时会自动把末尾的点和空格删掉最终存成shell.php。但黑名单在检查时看到的后缀是.或者空格不在黑名单里就放行了。绕过方式抓包把文件名改成shell.php.注意末尾有个点放行。这一关和第四关一样都是利用了操作系统层面的特性来绕过应用层的检查。这类漏洞的隐蔽性很强因为写代码的人往往只盯着后缀字符串忽略了文件系统本身的行为。4. 从后缀到内容检测维度的升级前面几关都在跟后缀较劲从第六关开始服务器端的检测维度开始升级——有的开始检查文件内容有的开始用更复杂的逻辑。这一部分我挑几个有代表性的关卡来讲。4.1 第六关黑名单加空格过滤但还有漏网之鱼第六关的黑名单把点空格、大小写这些都处理了看起来严实了不少。但它依然有漏洞——它没有过滤::$DATA这种 Windows 特有的数据流后缀。在 Windows 的 NTFS 文件系统里shell.php::$DATA会被解析成shell.php但黑名单看到的后缀是::$DATA不在名单里。抓包把文件名改成shell.php::$DATA就能绕过。这一关再次印证了那个观点黑名单是在和攻击者玩找漏网之鱼的游戏而攻击者只需要找到一个漏洞就够了。4.2 第七关空格被过滤试试点号第七关把空格也过滤了。这时候可以试试在末尾加点号也就是shell.php.。原理和第五关类似利用 Windows 自动去掉末尾点的特性。如果点号也被过滤了还可以尝试其他特殊字符组合。这一关的核心思路是当一种绕过方式被封堵时换一个操作系统层面的特性继续尝试。4.3 第八关::$DATA被过滤后的思路第八关把::$DATA也加进了黑名单。这时候常规的后缀绕过基本都被堵死了。但别忘了我们还有内容检测这条路可以走——也就是制作图片马。图片马的原理是把一个 PHP 脚本代码嵌入到一张正常的图片文件里。这样文件从后缀看是图片从内容看也包含合法的图片头能骗过getimagesize这类内容检测函数。但文件里同时藏着 PHP 代码一旦被当作 PHP 解析代码就会执行。制作图片马的方法# 用 copy 命令把图片和PHP文件合并 copy normal.jpg /b shell.php /a webshell.jpg在 Linux 下可以用cat normal.jpg shell.php webshell.jpg上传这个webshell.jpg如果服务器只检查内容不检查后缀就能过。但要注意图片马单独访问是不会执行 PHP 的需要配合文件包含漏洞或者服务器解析漏洞才能触发。这一关如果只要求上传成功那上传图片马即可。5. 那些容易翻车的细节与排查思路打到第十关、第十一关的时候很多人会发现自己明明按照教程操作了却总是失败。这一部分我专门讲讲排查思路和常见坑这些是文档里不会写的。5.1 上传成功但访问不执行先确认这三件事这是最常见的问题。你上传了shell.php提示成功但访问的时候要么下载文件要么显示源码就是不执行。排查顺序确认文件真的传上去了。有些关卡上传后会重命名文件或者存到别的目录。去上传目录里看看文件到底叫什么、在哪。确认服务器解析配置。如果上传的是.phtml、.php3这类后缀需要 Apache 配置里有对应的解析规则。默认配置可能不支持。确认访问路径正确。靶场的上传目录通常是upload/或者按日期分的子目录路径错了自然访问不到。我踩过最坑的一次是文件传上去了但被重命名成了一串随机字符加.jpg后缀我还在那傻傻地访问shell.php。后来才发现要去上传目录里看实际文件名。5.2 抓包工具的正确用法别只盯着文件名很多人用抓包工具只改文件名其实请求里能改的地方多着呢。除了filename和Content-Type还有文件内容可以直接在抓包工具里修改上传文件的内容不用在本地反复改文件。请求路径有些关卡的上传接口路径有讲究改路径可能有意想不到的效果。多个同名参数有些服务器只检查第一个参数但实际用的是最后一个这种参数污染也是绕过思路。提示抓包工具里改内容后记得更新Content-Length否则请求可能被截断。不过大多数现代抓包工具会自动帮你算不用手动改。5.3 第十关和第十一关组合拳的味道第十关和第十一关通常是前面几种绕过手法的组合。比如同时存在黑名单、内容检测、后缀处理你需要把前面学到的技巧串起来用。这两关我没有单独展开讲是因为它们本质上是前面知识的综合应用——先判断服务器做了哪几层检测再逐层找绕过点。我的建议是遇到这种综合关卡不要急着试先把关卡源码读一遍靶场一般会提供源码看清楚每一层检测的逻辑然后针对性地设计绕过方案。这比盲目尝试效率高得多。6. 打完前十一关后我对上传防御的几点体会一路打下来最大的感受是文件上传防御没有一招鲜它是一个多层配合的体系。前端校验、MIME检查、后缀黑名单、内容检测单独拿出来任何一个都不够必须叠起来用而且每一层都要做对。具体来说我现在做上传功能时会坚持几条原则用白名单而不是黑名单。只允许明确的几种后缀其余全拒。黑名单永远有漏网之鱼。重命名上传文件。不管用户传什么名字服务器统一重命名成随机字符串加安全后缀彻底断掉后缀绕过的念想。上传目录禁止执行脚本。通过服务器配置让上传目录里的文件只能被读取不能被当作脚本执行。这样即使传了恶意文件也执行不了。内容检测要做但不能只靠它。getimagesize这类函数可以被图片马绕过它只能作为辅助手段。前十一关基本覆盖了后缀绕过和基础内容检测这两大类场景。后面还有更精彩的——比如利用服务器解析漏洞、竞争条件、二次渲染等等那些我放在下篇再聊。如果你把前十一关的每一关都亲手复现一遍并且能说清楚每一关的绕过原理那你对文件上传漏洞的理解就已经超过大部分只会照抄教程的人了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询