实战|文件上传漏洞的花式绕过,这些坑很多人踩

前言

文件上传漏洞是 Web 安全里最经典、出现频率最高的漏洞。很多新手以为上传防护只需要简单判断后缀名,写个黑名单就能搞定。但在真实渗透场景里,各种解析漏洞、后缀变形、条件竞争、图片马等绕过方式层出不穷。

很多开发写的上传校验逻辑看似严谨,却存在各种缺陷,最终导致攻击者上传 Webshell 拿下服务器。本文整理实战中常见的上传绕过思路,附带原理、payload,同时给出对应的防御方案,适合安全测试、开发同学学习参考。

免责声明:本文内容仅用于授权环境下安全测试学习,禁止对未授权网站进行上传测试,违规操作需承担法律责任。

一、基础校验:前端 JS 校验绕过(最容易踩坑)

漏洞原理

只在前端通过 JavaScript 判断文件后缀,上传请求提交到后端没有二次校验。开发者以为前端限制就能阻挡恶意文件。攻击者直接禁用 JS 或者抓包修改请求包,绕过前端校验。

实战方法

  1. 浏览器 F12 禁用 JavaScript,直接上传 php 脚本;
  2. Burp 抓包,先上传合法图片,抓包后修改文件名后缀为.php,放行数据包。

坑点:很多开发只做前端校验,认为用户不会抓包,这是最低级但高频的错误。

防御方案
所有文件校验必须放在后端,前端校验仅做友好提示,不能作为安全限制。

二、后缀黑名单绕过

漏洞原理

后端采用黑名单,禁止.php、.jsp等脚本后缀,但是黑名单不全,遗漏大量可解析后缀。

常见 payload 示例(PHP 环境)

shell.php5
shell.php3
shell.phtml
shell.phpt

部分老版本 Nginx/Apache 会解析这类后缀作为 PHP 执行。

还有大小写绕过,当后端过滤没有转小写:
Shell.PHP

特殊后缀空字符绕过(老版本中间件)

shell.php%00

原理:00 截断,遇到 0x00 时字符串截断。PHP 版本 < 5.3.29 才存在该漏洞,新版已经修复,现在实战比较少见,但面试常考。

防御方案
放弃黑名单,使用白名单,只允许业务需要的后缀(jpg/png/gif 等)。统一将文件名转小写再判断。

三、中间件解析漏洞绕过(经典大坑)

这类不是代码问题,是 Web 服务器解析机制导致,很多开发完全不了解。

1. Nginx 解析漏洞

场景:服务器配置存在问题,访问 xxx.jpg/.php,Nginx 会把 jpg 交给 PHP 解析。
payload:上传图片 shell.jpg,然后访问 shell.jpg/.php。

2. Apache 解析漏洞

Apache 会从右向左识别后缀。文件名为 shell.php.xxx,xxx 不存在,继续往左解析 php。
payload:shell.php.aaa

坑点:代码校验后缀是 aaa 放行,但是 Apache 会解析前面 php。

防御方案

  1. 升级中间件,修复解析漏洞;
  2. 严格限制上传目录脚本执行权限;
  3. 文件存储后,不要直接使用原始文件名访问。

四、图片马 + 文件包含漏洞组合拳

原理

单纯上传图片马(图片尾部插入一句话木马),如果没有文件包含漏洞,图片只会当成图片展示,不会执行代码。必须搭配文件包含漏洞才能触发。

制作图片马

  1. 准备正常图片test.jpg
  2. 一句话文件 shell.php
copy test.jpg /b + shell.php test.jpg

上传后图片正常预览,用记事本打开,末尾存在 PHP 一句话。
然后利用文件包含漏洞 ?file=upload/test.jpg,即可执行里面的恶意代码。

很多新手误区:上传图片马就可以直接执行 shell。如果不存在文件包含漏洞,图片马无法执行,这是高频踩坑点。

防御方案
图片二次渲染(后端重新生成图片,剔除图片尾部多余恶意代码),杜绝文件包含漏洞。

五、文件名特殊字符绕过

1. 点绕过

shell.php. 部分 Windows 环境会自动忽略末尾点。

2. 空格绕过

shell.php 文件名后面加空格,Windows 会自动去除空格。

后端校验时没有去除首尾空格,校验失败,保存文件时系统自动删掉空格,最终文件变成 shell.php。

payload:shell.php (php 后面带空格)

防御方案
后端接收文件名,先去除首尾空格、末尾点,再做后缀校验。

六、条件竞争上传(竞争条件漏洞)

原理

业务逻辑:先把文件上传到服务器,再校验后缀,如果非法再删除。
攻击者利用上传和删除之间极短的时间窗口,并发请求持续访问这个临时文件,在删除前访问 shell 拿到执行权限。

攻击思路

多线程并发上传文件,同时循环请求上传后的文件地址,抢在程序删除之前访问 shell。

坑点:代码逻辑顺序错误:先保存文件,后校验。正确逻辑是:校验通过,才写入磁盘。

防御方案
先校验文件合法性,校验成功后,再保存文件;上传文件随机重命名。

七、Content-Type MIME 类型校验绕过

原理

后端只检查请求头里的 Content-Type,例如image/jpeg,判断是不是图片。这个请求头客户端可以随意修改。

绕过方式

Burp 抓包修改 Content-Type 为 image/jpeg,文件内容依旧是 php 一句话。后端只看请求头,直接放行。

坑点:Content-Type 由客户端可控,绝对不能作为安全判断依据。

防御方案
读取文件二进制头部(文件幻数)校验真实文件类型,不依靠请求头。

八、双后缀绕过

例子:shell.php.png
后端正则只过滤最后一个 png,但是中间件解析前面 php。
或者正则写的有问题,正则只匹配第一个后缀。
很多新手写正则 .*\.png$ 写错,导致可以绕过。

防御方案
取最后一个.后面的后缀进行白名单判断。

九、.htaccess 绕过(Apache 环境特有)

如果 Apache 允许上传.htaccess文件,攻击者上传 htaccess 文件,指定将某后缀文件当做 PHP 解析。

  1. 上传.htaccess,内容:
AddType application/x-httpd-php .jpg
  1. 再上传图片马shell.jpg,此时 jpg 会被当做 php 执行。

坑点:Apache 默认允许 htaccess 覆盖配置,上传目录没禁止 htaccess 写入。

防御方案
上传目录配置禁止.htaccess生效。

十、开发常踩的上传坑汇总

❌ 坑 1:只做前端 JS 校验,后端无校验
❌ 坑 2:使用黑名单过滤后缀,遗漏大量脚本后缀
❌ 坑 3:依靠 Content-Type 请求头判断文件类型
❌ 坑 4:先保存文件到服务器,再校验后缀(条件竞争)
❌ 坑 5:文件名没有过滤空格、点,Windows 特性绕过
❌ 坑 6:上传目录拥有脚本执行权限,一旦上传脚本直接执行
❌ 坑 7:直接使用原始文件名,没有随机重命名
❌ 坑 8:只校验文件后缀,不校验文件内容(幻数),图片马可上传
❌ 坑 9:忽略中间件解析漏洞,认为后缀没问题就安全
❌ 坑 10:图片校验只检查文件头,不做二次渲染,图片马依旧保留恶意代码

十一、文件上传安全加固最佳实践

  1. 后端校验,前端仅做提示,禁止前端校验充当安全防线;
  2. 后缀采用白名单,只允许业务需要的图片 / 附件后缀;
  3. 校验文件真实类型:读取文件头部幻数,不依赖请求头;
  4. 图片上传二次渲染,清除图片马恶意代码;
  5. 文件上传后随机重命名,例如 UUID,不要保留原始文件名;
  6. 上传目录禁止脚本执行权限;
  7. 上传目录和业务代码目录分离,优先使用对象存储;
  8. 校验逻辑顺序:先校验,校验通过,再保存文件;
  9. 过滤文件名特殊字符:空格、点、00 字符等;
  10. 定期扫描上传目录,监控新增脚本文件。

总结

文件上传漏洞的各类绕过,本质都是校验逻辑不严谨。很多防护手段看似有效,但是忽略中间件特性、操作系统文件名特性、并发时序问题,被攻击者轻松绕过。

在渗透测试中,文件上传的测试顺序一般:前端 JS 绕过 → Content-Type 绕过 → 后缀黑名单 → 文件名特殊字符 → 中间件解析漏洞 → 条件竞争 → .htaccess。

对于开发人员,记住核心安全原则:永远不要相信客户端传来的任何数据。文件上传防护不是简单写几行后缀判断代码,需要多维度叠加防护,才能阻挡各类花式上传绕过。

上传漏洞防护,白名单 + 二次渲染 + 随机文件名 + 关闭目录执行权限,四重防护缺一不可。


了解网络安全,首先要搞清楚下面这些前提

  • 网络安全到底包含哪些技术?是否需要会编程?
  • 网络安全行业有哪些职业方向?“我”该如何选择?
  • 网络安全的职业发展和成长路线是什么?

如果你是准备学习网络安全(黑客)或者正在学习,下面这些你应该能用得上:

①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

一、网络安全(黑客)学习路线

网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、网络安全教程视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

三、网络安全CTF实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

img

四、网络安全面试题

最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。

在这里插入图片描述

网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。

机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!

这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

img

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐