Webug4.0靶场通关笔记12- 第17关 文件上传之前端拦截(3种方法)

目录

一、文件上传前端拦截原理

二、第17关 文件上传(前端拦截)

1.打开靶场

2.构造php脚本

3.源码分析

(1)js源码

(2)服务器源码

(3)总结

4.渗透实战

(1)禁用js法

(2)修改页面法

(3)bp改包法


本文通过《webug4.0靶场第17文件上传之前端拦截》来进行渗透实战。文件上传前端拦截是文件上传前端拦截是一种在前端页面实现的对文件上传操作进行限制和验证的技术手段,但是这种方法可以通过修改前端代码或直接发送 HTTP 请求来绕过前端的限制,本文通过3种不同的方法实现渗透测试。

一、文件上传前端拦截原理

文件上传前端拦截是指在用户提交文件时,通过浏览器端的JavaScript或HTML5技术对文件进行初步验证,以减少非法文件上传的风险。前端拦截主要用于提升用户体验,快速反馈文件合法性,但不能替代后端安全校验,因为攻击者可以绕过前端直接发送恶意请求。

类别详情
定义文件上传前端拦截是指在网页前端对用户的文件上传操作进行限制和验证的技术,通过一定手段判断文件是否符合规定,在文件上传至服务器前进行初步处理
目的1. 安全层面:阻止用户上传恶意文件(如可执行文件、病毒脚本等)和不符合要求的文件类型,降低服务器被攻击、感染的风险,防止因文件上传引发的安全问题;
2. 体验层面:提前告知用户文件存在的问题(如格式不支持、大小超限等),减少用户等待时间和无效网络请求,提升上传操作的流畅性和用户满意度
实现方式以JavaScript 验证为例:监听change事件,获取用户所选文件,检查文件类型(通过file.type)、大小(通过file.size)等属性。借助FileReader对象读取文件部分内容,进一步验证文件格式,如检查文件头;
优势1. 即时反馈:能快速在用户选择文件后给出反馈,让用户及时知晓文件是否符合要求;
2. 减轻服务器压力:在前端过滤掉大量不符合要求的文件,减少服务器端的验证工作和无效文件传输,节省服务器资源
局限性1. 易被绕过:攻击者可通过修改前端代码(如修改 JavaScript 验证逻辑、accept属性值)或直接构造 HTTP 请求绕过前端拦截,无法提供绝对的安全防护;
2. 验证范围有限:前端验证主要基于文件基本属性,对于一些复杂的文件内容检测(如深度病毒扫描、文件内容合规性检查)能力不足,需结合服务器端验证

二、第17关 文件上传(前端拦截)

1.打开靶场

打开webug4.0靶场的第17关文件上传(前端拦截)关卡,完整URL地址如下所示。

http://192.168.71.1/webug4/control/upload_file/upload_file_1.php

2.构造php脚本

构造info.php,脚本内容为获取服务器的php版本信息,具体如下所示。

<?php phpinfo();?>

随手上传php脚本,提示不允许上传该格式类型,这说明本关卡进行了格式检查,如下所示。

3.源码分析

(1)js源码

右键查看源码,发现是使用js进行渗透的,也就是说这是前端验证的文件上传。

(2)服务器源码

如下服务器源码并未过滤,看来只有客户端进行过滤。

<?php
// 引入公共配置文件,该文件通常包含一些全局的函数、常量或配置信息
// 路径为相对于当前文件的上两级目录下的 common 文件夹中的 common.php 文件
require_once "../../common/common.php";// 检查用户会话中是否存在 'user' 变量
// 如果不存在,说明用户未登录,将用户重定向到登录页面
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}// 检查上传文件是否存在错误
// $_FILES['file']['error'] 是 PHP 中用于获取上传文件错误信息的变量
// 如果存在错误,直接终止脚本执行
if ($_FILES['file']['error']) {die();
}// 检查是否有文件被上传
if ($_FILES['file']) {// 将上传文件的相关信息赋值给变量 $arr$arr = $_FILES['file'];// 检查目标上传目录中是否已经存在同名文件// TPMELATE 应该是一个定义好的常量,表示上传目录的路径// 如果文件已存在,弹出提示框告知用户if (file_exists(TPMELATE."/upload/".$arr['name'])){echo "<script>alert('该文件已经存在')</script>";} else {// 将文件名从 UTF-8 编码转换为 gb2312 编码// 这可能是为了适应服务器文件系统的编码要求$filename = iconv("UTF-8","gb2312",TPMELATE."/upload/".$arr['name']);// 将临时上传的文件移动到目标目录// move_uploaded_file 是 PHP 中用于移动上传文件的函数// $arr["tmp_name"] 是临时上传文件的路径move_uploaded_file($arr["tmp_name"],$filename);// 输出文件的完整路径并终止脚本执行echo $filename;die();}
}// 引入上传文件页面的 HTML 文件
// 该文件通常包含一个文件上传表单
require_once TPMELATE."/upload_file_1.html";

(3)总结

综上,本关卡存在文件上传前端绕过的可能性,这是因为前端可被绕过且服务器未做过滤。

前端验证可被绕过:前端代码实现的文件类型过滤逻辑仅在客户端执行。攻击者可以通过直接修改前端代码(例如在浏览器的开发者工具中修改 JavaScript 代码)来禁用或绕过这个验证逻辑。攻击者不需要经过服务器的验证,直接构造一个包含恶意文件的 HTTP 请求发送到服务器,就可以实现文件上传,因为服务器端没有对文件类型进行二次验证,所以存在被绕过的风险。

未与服务器端配合:该前端代码仅在客户端对文件类型进行判断,没有与服务器端的验证机制紧密配合。服务器端端没有对上传文件类型进行严格检查,那么即使前端做了限制,攻击者依然可以通过其他手段(如直接发送请求)绕过前端的限制上传任意文件,从而导致安全问题。

4.渗透实战

(1)禁用js法

将js开关变灰禁用,如下图红框所示。

禁用后刷新页面,再次上传文件,这里要特别强调如果不刷新会上传失败,此时上传成功,具体如下所示显示了脚本的完整URL地址。

上一步获取到的脚本路径如下所示。

D:/web/phpstudy_pro/WWW/webug4/template/upload/info.php

根据文件上传路径构造木马路径,如下所示。

http://192.168.71.1/webug4/template/upload/info.php 

做完渗透后记得打开js开关,如下所示。

打开开关后记得刷新页面才可以生效。

(2)修改页面法

右键查询元素-搜索框输入关键字filter。

 找到onchange,使其等于空处理,删除js的处理函数οnchange="type_filter(this.files)"。

将如下函数变为空处理。

onchange="type_filter(this.files)"

变空后如下所示。

onchange=""

修改后如下所示。

重新复制info.php,将文件复制为info1.php,修改后不刷新页面上传php文件。

上传结果如下所示。

如下所示,上传的脚本执行成功。

(3)bp改包法

由于对文件的检查是客户端处理,故而可以在客户端上传图片,绕过客户端的前端检查然后在bp中修改报文并将报文后缀改为info2.php 发送到服务器。

将info.php修改为info.jpg,如下所示。

bp开启拦截功能,firefox浏览器开启代理。

将info.jpg上传,并使用bp抓包,同时将报文发送给repeater。

接下来将info.jpg改名为info2.php。

如下所示,点击发送后上传成功。

访问info2.php,如下所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高性能 WEB 服务器 Nginx:多虚拟主机实现!

Nginx 配置多虚拟主机实现 多虚拟主机是指在一台 Nginx 服务器上配置多个网站 在 Nginx 中&#xff0c;多虚拟主机有三种实现方式&#xff1a; 基于IP地址实现多虚拟主机 基于端口号实现多虚拟主机 基于域名实现多虚拟主机 1 基于域名实现多虚拟主机 在 Nginx 中配置多个…

网星安全AWS攻防方案,重磅发布!

AWS介绍 AWS&#xff08;Amazon Web Services&#xff09; 是 Amazon 提供的云计算平台&#xff0c;提供了广泛的云服务&#xff0c;包括计算、存储、数据库、网络、安全、人工智能、大数据处理等功能&#xff0c;帮助企业和开发者构建、部署和管理应用程序。AWS 是全球最大的…

qt的containers里的QToolBox和QTabWidget

Tool Box是一个多层次的折叠面板&#xff0c;通常用于组织多个可展开/折叠的面板组&#xff0c;每个面板有一个标题栏&#xff0c;用户点击标题栏可以展开或收起内容区域。比如设置界面中的分类选项&#xff0c;每个分类可以展开查看详细内容。这样能节省空间&#xff0c;让界面…

【神经网络与深度学习】深度学习中的生成模型简介

深度学习中的生成模型 openai 的一个古早介绍 引言 深度学习中的生成模型能够学习数据分布并生成新数据&#xff0c;在人工智能的多个领域中都有重要应用。不同类型的生成模型在原理和结构上各有特点&#xff0c;适用于不同的任务&#xff0c;如图像生成、文本生成和时间序列…

js获取明天日期、Vue3大菠萝 Pinia的使用

直接上代码 const today new Date(2019, 2, 28) const finalDate new Date(today) finalDate.setDate(today.getDate() 3)console.log(finalDate) // 31 March 2019 安装 yarn add pinia # or with npm npm install pinia创建第一个store仓库 1、在src目录下创建store目录…

存储过程补充——定义条件、处理程序及游标使用

文章目录 1. 定义条件与处理程序1.1 定义条件1.2 处理程序1.3 案例演示 2. 游标2.1 使用游标第一步&#xff0c;声明游标第二步&#xff0c;打开游标第三步&#xff0c;使用游标&#xff08;从游标中取得数据&#xff09;第四步&#xff0c;关闭游标 2.2 举例2.3 小结 在 MySQL…

蓝桥杯单片机国赛模板——基于柳离风模板

蓝桥杯单片机国赛模板——基于柳离风模板 文章目录 蓝桥杯单片机国赛模板——基于柳离风模板一、工程结构二、USER文件夹main.c 三、BSP文件夹1、sys2、display3、key4、timer5、iic6、ds13027、onewire8、uart9、ultrasound 四、源码五、内存不够 一、工程结构 与省赛模板相比…

C与指针——常见库函数

字符串 #include<stdlibs.h> int abs(int); long labs(long); int rand(void);//0-RAND_MAX //字符串转值 int atoi(const char*); long atol(const char*); float atof(const char*);数学\排序 #include<math.h> \\常见三角&#xff0c;sqrt(); exp(); double p…

数学复习笔记 2

前言 朋友和我讨论了一个二重积分题&#xff0c;非常有意思。内容非常细致。整理如下&#xff1a; 二重积分 题目来源是 1000 上面的 16 题&#xff0c;积分区域是一个偏心圆&#xff0c;偏心圆的圆心在 y 轴上面&#xff0c;偏心圆是关于 y 轴对称的&#xff0c;可以看关于…

Javaweb项目--Mybatis,导入com.mysql.cj.jdbc.Driver时报错,Cannot resolve class ‘Driver‘

目录 问题解决方法结果 问题 在项目java文件下&#xff0c;包文件下的application.properties文件中&#xff0c;项目目录如下&#xff1a; 报错信息如下&#xff1a; 解决方法 在pom.xml文件中增加此依赖 结果 报错信息消失

分布式-redisson

分布式锁redisson 加锁流程缓存相关问题 加锁流程 redisson底层通过lua脚本实现加锁的原子性lock动作包含&#xff1a;加锁、设置超时时间、锁续命未获取到锁的线程通过获取信号量许可等待&#xff0c;所释放后释放信号量通知等待线程 缓存相关问题 缓存失效&#xff08;击穿…

Java基础学完,继续深耕(0505)Linux 常用命令

昨天休息了一天&#xff0c;没有写csdn 昨天和今天把Linux大概学了一下。总结一下常用命令&#xff0c;总结的不全。 Linux目录结构 / 是所有目录的顶点 目录结构像一颗倒挂的树 注意&#xff1a;/itheima 是绝对路径&#xff0c;是指根目录 / 下的itheima目录 itheima…

【AI论文】Sadeed:通过小型语言模型推进阿拉伯语变音

摘要&#xff1a;由于语言的形态丰富&#xff0c;阿拉伯语文本的变音符号仍然是自然语言处理中一个持续的挑战。 在本文中&#xff0c;我们介绍了一种基于微调解码器语言模型的新方法Sadeed&#xff0c;该方法改编自Kuwain 1.5B Hennara等人[2025]的模型&#xff0c;该模型最初…

学习海康VisionMaster之亮度测量

一&#xff1a;进一步学习了 今天学习下VisionMaster中的亮度测量&#xff1a;这个和前面学习的都不一样了&#xff0c;这个是测量ROI区域内的平均亮度等 1&#xff1a;什么是亮度测量&#xff1f; 我们工业上用的相机里面有一个感光芯片&#xff08;CCD/CMOS&#xff09;&…

学习路线(python)

Python从初级到专家的学习路线# 初级阶段 (1-3个月)基础语法数据结构文件操作推荐资源 中级阶段 (3-6个月)面向对象编程常用模块错误处理进阶特性推荐资源 高级阶段 (6-12个月)并发编程性能优化元编程设计模式推荐资源 专业方向 (选择1-2个方向深入)Web开发数据分析/科学计算机…

svn文件提交失败

这里写自定义目录标题 1报错项目2.解决办法1.安装sqlite3.exe 数据库2.sqlite3.exe放到svn 项目的主目录下&#xff0c;和.svn目录同级下, 可以直接在数据库目录下执行cmd命令。3.在当前目录下 cmd 运行命令 4.最后再项目的文件夹下&#xff0c;看是否可以 clean up了。--成功&…

调试——GDB、日志

调试——GDB、日志 1. gdb常用指令2. 如何生成core文件并调试&#xff1f;3. 如何调试正在运行的程序4. 调试多进程程序5. 调试多线程程序6. log日志 gcc编译器可以帮我们发现语法错误&#xff0c;但是对业务逻辑错误却无能为力。当我们想找出逻辑错误时&#xff0c;就需要调试…

redis----通用命令

文章目录 前言一、运行redis二、help [command]三、通用命令 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 学习一些通用命令 以下操作在windows中演示 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、运行redis 我们先c…

CatBoost算法原理及Python实现

一、概述 CatBoost 是在传统GBDT基础上改进和优化的一种算法&#xff0c;由俄罗斯 Yandex 公司开发&#xff0c;于2017 年开源&#xff0c;在处理类别型特征和防止过拟合方面有独特优势。 在实际数据中&#xff0c;存在大量的类别型特征&#xff0c;如性别、颜色、类别等&#…

五一假期作业

sub_process.c #include <stdio.h> // 标准输入输出库 #include <pthread.h> // POSIX线程库 #include <sys/ipc.h> // IPC基础定义&#xff08;如消息队列/共享内存&#xff09; #include <sys/msg.h> // 消息队列操作相关…