记一次由于整型参数错误导致的任意文件上传

当时误打误撞发现的,觉得挺奇葩的,记录下

一个正常的图片上传的点,文件类型白名单

在这里插入图片描述

但是比较巧的是当时刚对上面的id进行过注入测试,有一些遗留的测试 payload 没删,然后在测试上传的时候就发现.php的后缀可以上传了,直接从白名单变成任意文件上传了。

id的正常格式是一串数字,但是如果将id出改成字符串,然后再修改上传的文件名为.php,就可以成功上传了,很奇怪的逻辑处理。当时的猜测是id处判断字符串错误进入了一个没有验证上传文件类型的代码段,导致直接任意文件上传了。

在这里插入图片描述

后面出于好奇,想验证下和我的猜测是否一致,去源码里面看了一眼,果然跟我的猜测一致,关键代码如下:

<?php 
    public function upload()
    {
    	.......
    	$id = intval($this->post('id'));
    	.......

    	$real_file_type = [];       // 限制文件类型
        $real_file_size = 0;        // 限制文件大小
        if ($id) {
            $where = "id = {$id}";
            if ($menu_id) {
                $where .= " and menu_id = '{$menu_id}'";
            }
            $config = publics::getOne(ApplyExtraField::TABLE, 'type, options', $where);
            if (empty($config)) {
                return $this->returnJson(400, $this->language['parameter_error']);
            }

            if (!in_array($config['type'], [8, 11, 12])) {
                return $this->returnJson(400, $this->language['error_field']);
            }

            $options = json_decode($config['options'], true);
            $condition = $options['condition'] ?? [];
            $real_file_type = $condition['file_type'] ?? [];
            $real_file_size = isset($condition['file_size']) && $condition['file_size'] ? $condition['file_size'] * 1024 : 0;
        }

        .......

        // 上传文件只会上传一个
        foreach ($this->request->getUploadedFiles() as $file) {
            $file_size = $file->getSize();
            $file_name = $file->getName();
            $file_type = strtolower($file->getExtension());

            // 判断文件类型
            if ($real_file_type && !in_array($file_type, $real_file_type)) {
                // 删除 Redis 列表中值
                $this->redis->lRem($uploadFileKey, $uploadFileVal, 0);
                $this->redis->sRem($executionListKey, $fileJsonStr);

                return $this->returnJson(400, $this->language['file_format_error']);
            }
            $fileExt = $fileExt ?: $file_type;

            .......
        }
		.......
		return $this->returnJson(200, $this->language['upload_success'], [
                'name' => $file_name,
                'url' => $file['url'],
                'file' => $file
            ]);
    }
 ?>

首先这里的正常功能是接收到的id是一串数字,只要不是数字0if ($id)就是True的,然后会根据menu_id去数据库中查询相关信息返回给,经过几层处理$real_file_type = $condition['file_type'],会得到数据库中查询出的文件白名单类型。

然后if ($real_file_type && !in_array($file_type, $real_file_type))会判断$file_type是否在白名单$real_file_type中,不在的话,就从Redis列表和集合中删除相应的值,并返回一个JSON格式的错误响应。

而当$id是字符串时,if ($id) 就是False

在这里插入图片描述

这样的话$real_file_type数组就没有接收到数据库查询出来的白名单,还是为空。而$real_file_type = []的话,if ($real_file_type && !in_array($file_type, $real_file_type)) == False,直接直接跳过判断文件类型,数组为空也没法做白名单校验。直接导致了任意文件上传。

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

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

相关文章

初识 JVM 01

JVM JRE JDK的关系 JVM 的内存机构 程序计数器 java指令的执行流程&#xff1a; 1 右侧的java源代码编译为左侧的java字节码&#xff08;右侧第一个方块对应左侧第一个方块&#xff09; 2 字节码 经过解释器 变为机器码 3 机器码就可以被cpu来执行 程序计数器的作用就…

C语言<自定义类型>结构体、枚举、联合

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

壁仞科技与百度飞桨完成II级兼容性测试

近日&#xff0c;壁仞科技BR104通用GPU与百度飞桨已完成II级兼容性测试。测试结果显示&#xff0c;双方兼容性表现良好&#xff0c;整体运行稳定。这是壁仞科技加入飞桨“硬件生态共创计划”后的阶段性成果。产品兼容性证明本次II级兼容性测试完成了涵盖自然语言处理、计算机视…

七月 NFT 行业解读:游戏和音乐 NFT 引领增长,Opepen 掀起热潮

作者&#xff1a;lesleyfootprint.network 2023 年 7 月&#xff0c;NFT 市场的波动性持续存在&#xff0c;交易量呈下降趋势。然而&#xff0c;游戏和音乐 NFT 等领域的增长引人注目。参与这些细分领域的独立用户数量不断增加&#xff0c;反映了这些领域的复苏。 本综合报告…

opencv 进阶17-使用K最近邻和比率检验过滤匹配(图像匹配)

K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;和比率检验&#xff08;Ratio Test&#xff09;是在计算机视觉中用于特征匹配的常见技术。它们通常与特征描述子&#xff08;例如SIFT、SURF、ORB等&#xff09;一起使用&#xff0c;以在图像中找到相似…

分布式锁系列之zookeeper分布式锁和mysql分布式锁

目录 介绍 下载安装 基本指令​编辑 java集成zookeeper 官方提供版 永久节点 临时节点​编辑 永久序列化节点 判断当前节点是否存在 获取当前节点中的数据内容 获取当前节点的子节点 更新节点内容 删除节点 zookeeper实现分布式锁 Mysql实现分布式锁 总结 介绍 ZooK…

【Spring框架】Spring事务的介绍与使用方法

⚠️ 再提醒一次&#xff1a;Spring 本身并不实现事务&#xff0c;Spring事务 的本质还是底层数据库对事务的支持。你的程序是否支持事务首先取决于数据库 &#xff0c;比如使用 MySQL 的话&#xff0c;如果你选择的是 innodb 引擎&#xff0c;那么恭喜你&#xff0c;是可以支持…

2023年计算机设计大赛国三 数据可视化 (源码可分享)

2023年暑假参加了全国大学生计算机设计大赛&#xff0c;并获得了国家三等奖&#xff08;国赛答辩出了点小插曲&#xff09;。在此分享和记录本次比赛的经验。 目录 一、作品简介二、作品效果图三、设计思路四、项目特色 一、作品简介 本项目实现对农产品近期发展、电商销售、灾…

基于AVR128单片机世界电子时钟的设计

一、系统方案 上电初始化完成系统初始化&#xff0c;液晶滚动显示北京、莫斯科、东京、伦敦、巴黎、纽约等六个城市的标准时间&#xff0c;显示的内容包括地区名及相应地区的年、月、日、星期、时、分、秒。 使用K1按键控制滚动显示或稳定显示某个地区的时间。 使用K3、K4、K5按…

Linux操作系统面试题汇总

Linux操作系统 1.Linux操作命令 Linux 目录结构及常用命令详细介绍参考 2.在Linux中find和grep的区别&#xff1f; 在Linux中&#xff0c;find命令用于按照指定条件搜索文件或目录&#xff0c;而grep命令则用于在文件中搜索指定的文本字符串。具体来说&#xff0c;find命令可…

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和

在一些字典绑定中&#xff0c;往往为了方便展示详细数据&#xff0c;需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中&#xff0c;为了快速的处理数据的绑定操作&#xff0c;比较每次使用涉及太多细节的操作&#xff0c;我们可以把…

深入了解Git:介绍及常用命令指南

当今软件开发领域中&#xff0c;版本控制是一个至关重要的概念&#xff0c;而Git作为最流行的分布式版本控制系统&#xff0c;发挥着不可替代的作用。本文将介绍Git的基本概念以及常用命令&#xff0c;帮助你更好地理解和使用这一强大的工具。 Git简介 Git是一种分布式版本管…

RK3399平台开发系列讲解(内核调试篇)网络调试工具

🚀返回专栏总目录 文章目录 一、dstat 工具介绍二、例如dstat 进行网络问题调试三、ss 命令查看 TCP 详细信息四、netstat 查看TCP详细信息沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍网络的相关工具。 一、dstat 工具介绍 当设备产生问题,而我们又…

Mysql 开窗函数(窗口函数)

文章目录 全部数据示例1&#xff08;说明&#xff09;开窗函数可以比groupby多查出条件列外的字段&#xff0c;开窗函数主要是为了跟聚合函数一起使用&#xff0c;达到分组统计效果&#xff0c;并且开窗函数的结果集基本都是跟总行数一样示例2示例3示例4错误示例1错误示例2错误…

2023河南萌新联赛第(六)场:河南理工大学

目录 A 简单的异或 题目&#xff1a; 解析&#xff1a; B 这是dp题吗 题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/63602/B 解析&#xff1a; D 买饼干的小Y 题目&#xff1a;https://ac.nowcoder.com/acm/contest/63602/D 解析&#xff1a; E 不爱吃早…

Redisson 分布式锁

Redis是基础客户端库&#xff0c;可用于执行基本操作。 Redisson是基于Redis的Java客户端&#xff0c;提供高级功能如分布式锁、分布式集合和分布式对象。 Redisson提供更友好的API&#xff0c;支持异步和响应式编程&#xff0c;提供内置线程安全和失败重试机制。 实现步骤…

【算法】活用双指针完成复写零操作

Problem: 1089. 复写零 文章目录 题目解析算法原理分析找到最后一个复写的位置从后往前进行复写操作 代码展示 题目解析 首先我们来分析一下本题的题目意思 可以看到题目中给到了一个数组&#xff0c;意思是让我们将数组中的零元素都复写一遍&#xff0c;然后将其余的元素向后平…

云计算在IT领域的发展和应用

文章目录 云计算的发展历程云计算的核心概念云计算在IT领域的应用1. 基础设施即服务&#xff08;IaaS&#xff09;&#xff1a;2. 平台即服务&#xff08;PaaS&#xff09;&#xff1a;3. 软件即服务&#xff08;SaaS&#xff09;&#xff1a; 云计算的拓展应用结论 &#x1f3…

无涯教程-PHP - 全局变量函数

全局变量 与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字 GLOBAL 放置在应被识别为全局变量的前面,可以很方便地实现这一目标。 <?php$somevar15;function addit() {GLOBAL $somevar;$somevar;print "Somevar is $somevar";}addit(); ?> …

NineData中标移动云数据库传输项目(2023)

近日&#xff0c;玖章算术NineData智能数据管理平台成功中标《2023年移动云数据库传输服务软件项目》&#xff0c;中标金额为406万。这标志着玖章算术NineData平台已成功落地顶级运营商行业&#xff0c;并在数据管理方面实现了大规模应用实践。 NineData中标2023移动云数据库传…
最新文章