网络安全中级阶段学习笔记(七):Web 安全之文件上传漏洞笔记1(包含upload-labs-master靶场前三关实战)

文件上传漏洞是 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),未验证文件真实内容。

绕过步骤
  1. 准备恶意文件(如webshell.php,内容为一句话木马)

  2. BurpSuite 拦截上传请求,找到Content-Type: application/octet-stream(默认脚本文件类型)

  3. 修改为允许的类型(如图片类型image/jpegimage/png

  4. 发送请求,文件上传成功

示例对比
状态 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 补充说明)

  1. PPT 中 "绕过黑名单验证" 代码示例存在重复后缀(如.php多次出现),实际黑名单应去重,且需覆盖所有可解析后缀
  2. 00 截断绕过需满足特定 PHP 版本条件(<5.3.4),高版本已修复,需注明适用场景
  3. .htaccess仅适用于 Apache 服务器,Nginx 需通过user.ini等文件配置,不可通用
  4. 图片马制作时,需确保文件头合法(如GIF89a对应 GIF 图片),否则会被内容检测拦截

六、实战总结

  1. 漏洞利用核心:找到检测环节的 "薄弱点"(如仅前端验证、未验证文件内容)
  2. 绕过思路:"伪装合法"(改后缀、改 MIME、嵌合法内容)+"利用特性"(系统解析、配置文件)
  3. 防御核心:"白名单优先"+"多环节验证"+"权限隔离",避免单一防御失效

七、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版本信息就表示成功了

相关推荐
走在路上的菜鸟6 小时前
Android学Dart学习笔记第十五节 类
android·笔记·学习·flutter
xian_wwq6 小时前
【学习笔记】AI赋能安全运营中心典型场景
人工智能·笔记·学习
千天夜6 小时前
深入排查Unity开发中的“要实例化的对象为空”异常:一次从报错到修复的完整历程
学习
liebe1*16 小时前
第十四章 网络安全方案设计
安全·web安全
知识分享小能手7 小时前
CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 的 Docker 容器 —— 语法详解与实战案例(16)
学习·docker·centos
非凡ghost7 小时前
FlexiPDF(专业PDF编辑软件)
windows·学习·pdf·软件需求
d111111111d7 小时前
嵌入式面试问题:STM32中指针和数组的本质区别是什么,常用数组存储什么数据?
java·笔记·stm32·单片机·嵌入式硬件·学习
Nan_Shu_6147 小时前
学习:Pinia(1)
javascript·vue.js·学习
wuletaotao7 小时前
Redis 主从搭建笔记
数据库·redis·笔记