网络安全 文件上传漏洞-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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Langchain-实战篇-搭建本地问答机器人-01

项目背景 在这个快节奏的职场世界里,我们每个人都可能在某个时刻,化身为一头辛勤的牛或一匹奔腾的马,面对入职签合同时的迷茫,或是离职时的纠纷,心中难免会涌现出各种疑问。比如: "这份合同里的条款…

Mongodb集群中的分布式读写

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第81篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

百元蓝牙耳机推荐2024,百元蓝牙耳机排行榜盘点

在2024年面对琳琅满目的蓝牙耳机选项,消费者往往难以抉择,特别是在预算有限的情况下,如何在众多产品中挑选出既满足质量又符合预算的耳机成为了一个不小的挑战。 为了帮助大家在繁多的选择中找到真正物有所值的百元蓝牙耳机,我们…

vue响应式原理细节分享

在讲解之前,我们先了解一下数据响应式是什么?所谓数据响应式就是建立响应式数据与依赖(调用了响应式数据的操作)之间的关系,当响应式数据发生变化时,可以通知那些使用了这些响应式数据的依赖操作进行相关更…

【JavaEE】JVM

文章目录 一、JVM 简介二、JVM 运行流程三、JVM 运行时数据区1、堆(线程共享)2、Java虚拟机栈(线程私有)3、本地方法栈(线程私有)4、程序计数器(线程私有)5、方法区(线程…

# 音频处理4_傅里叶变换

1.离散傅里叶变换 对于离散时域信号 x[n]使用离散傅里叶变换(Discrete Fourier Transform, DFT)进行频域分析。 DFT 将离散信号 x[n] 变换为其频谱表示 X[k],定义如下: X [ k ] ∑ n 0 N − 1 x [ n ] e − j 2 π k n N X[k]…

.NET 漏洞情报 | 某整合管理平台SQL注入

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

揭秘Wish自养号秘诀:新手卖家如何快速出单?

对于卖家来说,如果想要提升店铺的转化率和销量,有几个关键策略是必不可少的: 一、精心挑选热销产品 成功的第一步在于选品。选择热销产品如同掌握了成功的钥匙。卖家需要深入分析平台用户群体,了解他们的需求和偏好。例如&#…

Tampermonkey 油猴脚本使用教程

Tampermonkey 油猴脚本使用教程 一、Tampermonkey 油猴脚本简介 Tampermonkey 是一款流行的浏览器扩展,它允许用户通过用户脚本增强网页功能或改变网页的外观。它支持包括 Chrome、Microsoft Edge、Safari、Opera Next 和 Firefox 在内的多种浏览器。Tampermonkey…

【C++ 初阶路】--- C++内存管理

目录 一、C/C内存分布二、C内存管理方式2.1 new/delete操作内置类型2.2 new和delete操作自定义类型 三、operator new与operator delete函数四、new和delete的实现原理4.1 内置类型4.2 自定义类型 一、C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Tes…

大模型+多模态合规分析平台,筑牢金融服务安全屏障

随着金融市场的快速发展,金融产品和服务日趋多样化,消费者面临的风险也逐渐增加。 为保护消费者权益,促进金融市场长期健康稳定发展,国家监管机构不断加强金融监管,出台了一系列法律法规和政策文件。对于金融从业机构…

代码托管服务:GitHub、GitLab、Gitee

目录 引言GitHub:全球最大的代码托管平台概述功能特点适用场景 GitLab:一体化的开发平台概述功能特点适用场景 Gitee(码云):中国本土化的代码托管服务概述功能特点适用场景 功能对比结论 引言 在现代软件开发中&#…

Pickle, SafeTensor, GGML和GGUF

如今,大型语言模型的使用方式有以下几种: 作为 OpenAI、Anthropic 或主要云提供商托管的专有模型的 API 端点作为从 HuggingFace 的模型中心下载的模型工件和/或使用 HuggingFace 库进行训练/微调并托管在本地存储中作为针对本地推理优化的格式的模型工…

机器学习 中数据是如何处理的?

数据处理是将数据从给定形式转换为更可用和更理想的形式的任务,即使其更有意义、信息更丰富。使用机器学习算法、数学建模和统计知识,整个过程可以自动化。这个完整过程的输出可以是任何所需的形式,如图形、视频、图表、表格、图像等等&#…

Linux基础篇——目录结构

基本介绍 Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后在根目录下再创建其他的目录 在Linux中,有一句经典的话:在Linux世界里,一切皆文件 Linux中根目录下的目录 具体的…

PHP留守儿童关爱之家网站-计算机毕业设计源码11079

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3 论文结构与章节安排 2 留守儿童关爱之家网站系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程和逻辑 2.5本章小结 3 留守儿童关爱之家网站总体设计 3.1系统结构设计 3.2系统功能模块设计 3.2 数…

基于SSM网上拍卖系统

设计技术: 开发语言:Java数据库:MySQL技术:SpringMybatisSpringMvc 工具:IDEA、Maven、Navicat 主要功能 管理员功能有个人中心,用户管理,卖家管理,商品类型管理,拍卖…

EDA 虚拟机 Synopsys Sentaurus TCAD 2017.09 下载

下载地址(制作不易,下载使用需付费,不能接受的请勿下载): 链接:https://pan.baidu.com/s/1327I58gvV1usWSqSrG7KXw?pwdo03i 提取码:o03i

AI网络爬虫001:用kimichat自动批量提取网页内容

文章目录 一、准备工作二、输入内容三、输出内容一、准备工作 在网页中按下F12键,查看定位网页元素 二、输入内容 在kimi中输入提示词: 你是一个Python编程专家,要完成一个爬取网页内容的Python脚本,具体步骤如下:在F盘新建一个Excel文件:提示词.xlsx打开网页:https:…

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…