网络安全 文件上传漏洞-20 第二十关 Pass-20

点击进入第二十关,并选择显示代码:

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){//检查MIME$allow_type = array('image/jpeg','image/png','image/gif');if(!in_array($_FILES['upload_file']['type'],$allow_type)){$msg = "禁止上传该类型文件!";}else{//检查文件名$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];if (!is_array($file)) {$file = explode('.', strtolower($file));}$ext = end($file);$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上传该后缀文件!";}else{$file_name = reset($file) . '.' . $file[count($file) - 1];$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg = "文件上传成功!";$is_upload = true;} else {$msg = "文件上传失败!";}}}
}else{$msg = "请选择要上传的文件!";
}
  • empty()用于判断是否为空值
  • a?b:c 是条件表达式,如果a为真,那么表达式b;如果a为假,那么表达式c
  • explode() 用于将字符串拆分为不同的字符串。该函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
  • end() 用于返回数组的最后一个元素
  • reset()用于将数组的内部指针回退到第一个元素,并返回第一个数组元素的值;如果数组为空,则返回FALSE
  • count() 用于返回数组的长度

对代码进行分析,可以看到首先进行mime检测,判断是否是图片类型。然后使用条件表达式给file变量赋值,如果如果存在 $_POST['save_name']) 的值,那么把他赋值给file,否则将 $_FILES['upload_file']['name'] 的值赋给file变量:

然后判断file是不是数组,如果file的值不是数组,使用explode()函数将其拆分为文件名和后缀组成的数组,并将数组的最后一个值作为后缀名。

接着判断后缀名是否是jpg png gif中的一种,如果满足条件执行下面的代码为上传的文件进行命名:

 $file_name = reset($file) . '.' . $file[count($file) - 1];

我们发现在给上传文件命名的时候,使用 $file[count($file) - 1] 确定文件的后缀。同时根据上面代码,我们可以将file的传入值设置为数组。我们首先确认是否存在$_POST["save_name"]的值。(确认file的值来自于谁,以方便我们后续修改)。首先我们先在文本文档中写一段一句话木马,然后将其另存为jpg格式。

然后打开bp进行抓包工具并开启监听状态,然后点击上传刚刚制作的jpg格式的木马文件。我们发现请求头中存在 save_name ,根据上面的条件表达式判断语句,也就是说file的值来源于$_POST["save_name"]。而且我们还知道file的值可以为数组,那么我们此时可以直接构建一个数组。

那么数组该怎么构建呢?见下图:

我们发现通过白名单验证时的后缀名和文件命名时的后缀名来源不一样。既然使用数组的最后一项用作白名单验证,那么我们就使得数组的最后一项设置为 jpg(png 或 gif都可),而数组的第一项肯定要用作存储文件名。即数组的大致结果如下:

以数组的的第n项作为后缀名,假如数组只有两项,即file = [文件名,"jpg"],则count[$file]=2(因为数组下标从0开始,所以需要减一)

那么 reset[$file] = 文件名,$file[1] = "jpg"。

这里我们可以发现,$file后缀名的获取和$file的长度息息相关,当长度确定,那么后缀名的下标也就确定了。

那么我们可以利用这一点进行绕过白名单,从而上传我们的php文件,我们令

$file[0] =  "myupload.php"

$file[2] = "jpg"

这里我们不对 $filep1]的值作定义。这时数组的长度仍然为2,但$file[1]不存在。

根据代码:

file_name = “myupload.php”  +  "." +   $file[1]

因为$file[1]不存在,那么file_name的最终结果为: "myupload.php. " 。这时我们就成功上传了一个php文件。

理论证明结束,实践继续,对刚刚我们抓取的包进行修改,即修改为 $file[0] =  "myupload.php"  , $file[2] = "jpg"  的数组

添加一段 Content-Disposition 内容,修改save_name为数组形式,并赋值:

然后点击forward发送请求,这时我们发现文件上传成功

右键单击复制文件地址,并在浏览器访问,发现获取服务器php信息成功

上一关(网络安全 文件上传漏洞-19 第十九关 Pass-19)

下一关(网络安全 文件上传漏洞-21 第二十一关 Pass-21)

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

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

相关文章

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…

N5 使用Gensim库训练Word2Vec模型

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊# 前言 前言 这周学习训练一个Word2Vec模型,并进行一些基本的词向量操作。 Word2Vec 模型 Word2Vec 是一种基于神经网络的词向量表示方法&#x…

HMI 的 UI 风格成就经典

HMI 的 UI 风格成就经典

力扣61. 旋转链表(java)

思路:用快慢指针找到最后链表k个需要移动的节点,然后中间断开节点,原尾节点连接原头节点,返回新的节点即可; 但因为k可能比节点数大,所以需要先统计节点个数,再取模,看看k到底需要移…

Python数据可视化书籍推荐:利用Python进行数据分析

《利用Python进行数据分析》 这本书几乎是数据分析入门必读书了 主要介绍了python 3个库numpy(数组),pandas(数据分析)和matplotlib(绘图)的学习 阅读本书可以获得一份关于在Python下操作、处…

Rustdesk如何编译代码实现安装后不会显示主界面,不会在右下角出现托盘图标,作为后台服务运行

环境: Rustdesk1.1.9 问题描述: Rustdesk如何编译代码实现安装后不会显示主界面,不会在右下角出现托盘图标,作为后台服务运行 解决方案: 可以自定义进程名称和图标,不会显示主界面,不会在…

LLM大模型中LoRA是什么?面试经验回答汇总(2024.7月最新)

目录 1 什么是 LoRA? 2 LoRA 的思路是什么? 3 LoRA 的特点是什么? 4 简单描述一下 LoRA? 5 QLoRA 的思路是怎么样的? 6 QLoRA 的特点是什么? 7 AdaLoRA 的思路是怎么样的? 8 LoRA权重是否可以合入…

笛卡尔乘积算法js实现

全因子实验设计( DOE) :指所有因子的所有水平的所有组合都至少进行一次实验,可以估计所有的主效应和所有的各阶交互效应。 笛卡尔乘积:指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),…

视频监控汇聚和融合平台的特点、功能、接入方式、应用场景

目录 一、产品概述 二、主要特点 1、多协议支持 2、高度集成与兼容性 3、高性能与可扩展性 4、智能化分析 5、安全可靠 三、功能概述 1. 视频接入与汇聚 2. 视频存储与回放 3. 实时监控与预警 4. 信息共享与联动 5. 远程管理与控制 四、接入方式 1、直接接入 2…

flask与vue实现通过websocket通信

在一些情况下,我们需要实现前后端之间的时刻监听,本文是一篇工具文档,用于解决前后端之间使用websocket交互。 一. Flask的相关配置 1. 下载相关依赖库 如果还没有配置flask的话,需要先安装flask,同时为解决跨域问题&#xff0…

创建线程的五种方式

一.继承Thread ,重写run class MyThread extends Thread{Overridepublic void run() {//这里的内容就是该线程要完成的工作while(true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeExceptio…

Qt开发 | qss简介与应用

文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用:实时打开关闭状态按钮五、QComboBo…

UE4_材质_使用彩色半透明阴影

学习笔记,不喜勿喷!侵权立删,祝愿大美临沂生活越来越好! 本教程将介绍如何配置虚幻引擎来投射彩色半透明阴影。 此功能在许多应用中都很有用,常见例子就是透过彩色玻璃窗的彩色光。 一、半透明阴影颜色 阴影在穿过半…

博途S7-1500PLC“虚轴“编程应用

1、CODESYS如何添加虚轴 如何添加虚轴(AM400PLC)-CSDN博客文章浏览阅读164次。EtherCAT运动控制总线启用的时候,选择EtherCAT总线任务周期。选择好后,选择点击添加。https://rxxw-control.blog.csdn.net/article/details/139898985虚轴是利用软件算法实现的运动控制轨迹规划…

HarmonyOS ArkUi 官网踩坑:单独隐藏导航条无效

环境: 手机:Mate 60 Next版本: NEXT.0.0.26 导航条介绍 导航条官网设计指南 setSpecificSystemBarEnabled 设置实际效果: navigationIndicator:隐藏导航条无效status:会把导航条和状态栏都隐藏 官方…

公网IP变更自动微信通知与远程执行命令的C++开源软件

基本功能 智能公网IP变更监测与微信通知 一旦检测到公网IP地址发生变更,系统将自动通过预设的QQ邮箱(该邮箱与微信绑定,实现微信通知)发送新IP地址通知。同时,软件会即时更新本地配置文件中的IP地址及变更时间&#…

深度学习标注文件格式转换

json转xml 原始数据集文件夹中图片格式为bmp&#xff0c;标注文件为json&#xff0c;图片和标注文件放在同一个文件夹下面&#xff0c;将json转为xml格式&#xff0c;图片和标注文件分别存放在一个文件夹下面。 headstr """\ <annotation><folder>…

帮人安装打印机驱动踩过的坑

自从当了程序员&#xff0c;总被人认为是无所不能。安装系统&#xff0c;组装电脑都会。有啥只要跟电脑沾点边的事情都来找我。这不今天就被叫去帮人安装打印机驱动。 问题描述 以前老电脑都可以用打印机的&#xff0c;自从换新电脑后就不行了。别人可以用&#xff0c;就他的新…

HNU电子测试平台与工具2_《计算机串口使用与测量》

&#xff08;这个有留word哈哈&#xff09; 4.1 4.2 Linux 操作系统平台 一、实验目的 了解 Linux 系统文件系统的基本组织了解 Linux 基本的多用户权限系统熟练使用 ls、cd、cat、more、sudo、gcc、vim 等基本命令会使用 ls 和 chmod 命令查看和修改文件权限 二、实…

【C++知识点总结全系列 (06)】:STL六大组件详细总结与分析- 配置器、容器、迭代器、适配器、算法和仿函数

STL六大组件目录 前言1、配置器(1)What(2)Why(3)HowA.调用new和delete实现内存分配与销毁B.STL Allocator (4)allocator类A.WhatB.HowC.allocator的算法 2、容器(1)What(2)Which&#xff08;有哪些容器&#xff09;(3)序列容器&#xff08;顺序容器&#xff09;A.WhichB.array&…