文件上传漏洞是 Web 安全中高频高危漏洞,攻击者可通过上传恶意脚本(Webshell)控制服务器,窃取或篡改数据。本文基于课程 PPT,整理核心知识点、绕过技巧,并补充防御方案,适合入门学习与实战参考。
一、核心概念速览
1. 文件上传漏洞定义
因服务器对上传文件的后缀、类型、内容等过滤机制不严,导致攻击者可上传恶意脚本文件(如 PHP、ASP 后门),进而获取网站 / 服务器控制权的漏洞。
2. 漏洞危害
- 控制网站后台,篡改页面内容
- 读取、修改、删除服务器敏感数据
- 通过提权漏洞获取主机 root / 管理员权限
- 植入木马、挖矿程序,沦为僵尸主机
3. Webshell 核心知识
Webshell 是伪装成网页文件的命令执行环境(后门),核心用于控制服务器:
| 类型 | 特点 | 示例(一句话木马) |
|---|---|---|
| 大马 | 体积大、功能全、加密隐藏 | - |
| 小马 | 体积小、仅核心功能(如上传) | - |
| 一句话木马 | 代码简洁、隐匿性强、可变形免杀 | PHP:<?php @eval($_POST['pass']);?> |
| 一句话木马 | 代码简洁、隐匿性强、可变形免杀 | ASP:<%eval request("pass")%> |
| 一句话木马 | 代码简洁、隐匿性强、可变形免杀 | ASPX:<@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> |
4. 漏洞利用三要素
木马上传成功,未被杀
知道木马的路径在哪
上传的木马能正常运行(解析)

二、文件上传核心检测流程

三、经典绕过技巧大全
1. 绕过客户端 JS 验证
原理
客户端通过 JS 脚本限制文件后缀(如仅允许.jpg/.png),未在服务端二次验证。
绕过方法
-
BurpSuite 篡改响应 :拦截服务器响应,删除页面中
checkFile()等 JS 验证函数
-
浏览器审计工具 :F12 打开开发者工具,删除表单
onsubmit="return checkFile()"属性,保存后上传
-
直接上传恶意文件,用 BurpSuite 拦截修改后缀(适用于仅前端验证场景)
2. 绕过服务端 MIME-Type 验证
原理
服务端通过 HTTP 请求头Content-Type字段判断文件类型(如图片为image/jpeg),未验证文件真实内容。
绕过步骤
-
准备恶意文件(如
webshell.php,内容为一句话木马)
-
BurpSuite 拦截上传请求,找到
Content-Type: application/octet-stream(默认脚本文件类型) -
修改为允许的类型(如图片类型
image/jpeg或image/png) -
发送请求,文件上传成功
示例对比
| 状态 | Content-Type 字段值 | 上传结果 |
|---|---|---|
| 未修改 | application/octet-stream | 上传失败 |
| 修改后 | image/jpeg | 上传成功 |
3. 绕过服务端黑名单验证
原理
黑名单限制禁止上传的后缀(如.php/.asp),但存在遗漏或可利用的解析特性。
常用绕过方法
| 绕过类型 | 适用场景 | 操作方法 |
|---|---|---|
| 后缀名漏检 | 黑名单未过滤.phtml/.php5 等 | 上传webshell.phtml,若服务器支持该后缀解析则成功 |
| .htaccess 文件 | Apache 服务器,未过滤.htaccess | 1. 上传.htaccess 文件,内容SetHandler application/x-httpd-php(指定目录所有文件按 PHP 解析)2. 上传1.jpg(内容为<?php phpinfo();?>),服务器会按 PHP 执行 |
| 大小写绕过 | Windows 服务器(大小写不敏感) | 将webshell.php改为webshell.PhP,绕过仅过滤小写.php 的黑名单 |
| 空格 / 点绕过 | 服务器未处理文件名特殊字符 | 文件名改为webshell.php.(末尾加英文点)或webshell.php (末尾加空格),Windows 会自动去除 |
| ::$DATA 绕过 | Windows 系统 | 文件名改为webshell.php::$DATA,服务器保存时会忽略::$DATA,实际保存为webshell.php |
工具实操
用 BurpSuite Intruder 模块枚举后缀名,字典包含.php/.phtml/.php5/.jspx等,寻找黑名单未过滤的可解析后缀。
四、漏洞防御方案(补充知识点)
文件上传漏洞防御需遵循 "多环节、纵深防御" 原则,核心措施如下:
1. 前端防御(辅助,不可单独依赖)
- 限制文件大小、后缀(仅允许必要类型,如头像仅.jpg/.png)
- 提示用户上传合法文件,增强用户认知
2. 服务端核心防御
(1)严格的后缀验证
- 优先使用白名单 (仅允许
.jpg/.png/.gif/.pdf等必要后缀),拒绝黑名单 - 过滤特殊字符:去除文件名中的
../、空格、点、::$DATA、大小写混合后缀 - 统一文件名:上传后重命名(如
uuid+原始后缀),避免路径泄露
(2)文件类型双重验证
- 验证
Content-Type字段,同时通过文件头检测真实类型(如用exif_imagetype()函数验证图片) - 禁止上传
.htaccess、.user.ini等配置文件(Apache/Nginx)
(3)存储与权限控制
- 上传文件存储目录禁止执行权限 (如 Apache 配置
php_flag engine off) - 独立存储目录:与网站业务目录分离,避免脚本被解析
- 限制文件大小:防止上传超大文件占用服务器资源
(4)安全工具防护
- 部署 WAF(Web 应用防火墙),拦截恶意文件上传
- 开启杀毒软件 / 安全插件,扫描上传文件中的木马
- 定期更新服务器组件(Apache/Nginx/PHP),修复解析漏洞
(5)日志与监控
- 记录所有文件上传操作(用户名、时间、文件名、路径)
- 监控异常文件访问(如上传的图片被频繁访问,且带有
cmd/pass等参数)
五、常见错误修正(PPT 补充说明)
- PPT 中 "绕过黑名单验证" 代码示例存在重复后缀(如
.php多次出现),实际黑名单应去重,且需覆盖所有可解析后缀 - 00 截断绕过需满足特定 PHP 版本条件(<5.3.4),高版本已修复,需注明适用场景
.htaccess仅适用于 Apache 服务器,Nginx 需通过user.ini等文件配置,不可通用- 图片马制作时,需确保文件头合法(如
GIF89a对应 GIF 图片),否则会被内容检测拦截
六、实战总结
- 漏洞利用核心:找到检测环节的 "薄弱点"(如仅前端验证、未验证文件内容)
- 绕过思路:"伪装合法"(改后缀、改 MIME、嵌合法内容)+"利用特性"(系统解析、配置文件)
- 防御核心:"白名单优先"+"多环节验证"+"权限隔离",避免单一防御失效
七、upload-labs-master靶场实践(1-3关)
1.Pass-01

发现无法上传php文件,只让上传文件格式的文件

把一句话木马文件后缀改为png上传,然后抓包,因为直接上传php文件他有弹窗抓不到包,抓包之后找到上传的那张图片,将后缀改为php,然后放包

发现.php文件上传成功了,右键点击复制图形连接,

打开中国菜刀,或者蚁剑等连接工具,我这里以中国菜刀为列,右键点击添加

填入复制的文件地址和一句话木马的密码,点击添加。

添加成功

双击刚刚添加的那条记录即可打开查看文件信息。

右键这条记录,点击虚拟终端就可以进入这个系统的终端


2.Pass-02
为了方便直接写一个查看php版本信息的木马

打开第二关

开启bp抓包拦截,上传刚刚创建那个1.png,把1.png改为1.php

放包后发现上传成功

右键复制图片连接

地址栏输入这个地址,显示如下php版本信息就表示成功了

3.Pass-03
打开第三关

点击查看源码,可以看到有黑名单,并且空格,大小写,空值,点号等都被过滤了

这个关卡其实就是寻找有没有其他类型的后缀格式也被识别为.php格式
打开老版本的phpstudy服务器,打开httpd-conf


#去掉之后保存退出,然后重启php服务器,如果不重启会导致修改不生效,依旧无法将phtml文件识别成php文件

然后开启bp抓包,上传1.png文件,修改1.png后缀为1.phtml

上传成功,复制链接

打开图片链接,显示出php版本信息就表示成功了
