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

news2024/11/24 13:29:47

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

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

在这里插入图片描述

但是比较巧的是当时刚对上面的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.coloradmin.cn/o/910294.html

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

相关文章

PostMan 测试项目是否支持跨域

使用PostMan可以方便快速的进行跨域测试。 只需要在请求头中手动添加一个Origin的标头&#xff0c;声明需要跨域跨到的域&#xff08;IP&#xff1a;端口&#xff09;就行&#xff0c;其余参数PostMan会自动生成。添加此标头后&#xff0c;请求会被做为一条跨域的请求来进行处…

Python编程基础-文件的打开和读取

文件的访问 使用 open() 函数 打开文件 &#xff0c;返回一个 file 对象 使用 file 对象的读 / 写方法对文件进行读 / 写的 操作 使用 file 对象的 close() 方法关闭文件 打开文件 open()方法&#xff0c;需要一个字符串路径&#xff0c;并返回一个文件对象&#xff0c;默认是”…

学习maven工具

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3e8;maven工具产生的背景&#x1f993;maven简介&#x1fa80;pom.xml文件(project object Model 项目对象模型) &#x1fa82;maven工具安装步骤两个前提&#xff1a;下载 m…

Android基础——英文复习资料

一.填空题 1.An Android project must be bulit before it is run&#xff0c;compiling the java source code(.java flises)into Java bytetcode(.class files)and the into .dex files 2.In Android an activity stores the code for a screen of an app&#xff0c; …

.NET6.0 System.Drawing.Common 通用解决办法

最近有不少小伙伴在升级 .NET 6 时遇到了 System.Drawing.Common 的问题&#xff0c;同时很多库的依赖还都是 System.Drawing.Common &#xff0c;而 .NET 6 默认情况下只在 Windows 上支持使用&#xff0c;Linux 上默认不支持这就导致在 Linux 环境上使用会有问题&#xff0c;…

# 电脑好用的工具推荐

电脑好用的工具推荐 文章目录 电脑好用的工具推荐必装工具浏览器火绒安全卸载工具Geek迅雷 记笔记工具Typora印象笔记 开发工具IntelliJ IDEAVisual Studio CodeDbeaverAnother Redis Desktop Manager 备份工具百度网盘阿里云盘一刻相册蓝奏云 必装工具 浏览器 就别装那些乱七…

vue2.x项目从0到1(七)之用户权限

此章节偏理论知识 对于小一点的项目 比如说角色都是平级的 那我们直接像之前 vue2.x项目从0到1&#xff08;二&#xff09;之后台管理侧边栏&#xff08;动态渲染路由以及高亮&#xff09;_vue动态渲染侧边栏_关忆北_的博客-CSDN博客这样渲染就行了 但是一旦项目大了 …

Reids 的整合 Spring Data Redis使用

大家好 , 我是苏麟 , 今天带来强大的Redis . REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…

如何使用CSS实现一个拖拽排序效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现拖拽排序效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

【HCIP】02.MSTP

运行RSTP/STP&#xff0c;局域网内所有的VLAN共享一棵生成树&#xff0c;被阻塞后的链路将不承载任何流量&#xff0c;无法在VLAN间实现数据流量的负载均衡&#xff0c;导致链路带宽利用率、设备资源利用率较低。802.1S,MSTP兼容STP和RSTP&#xff0c;通过建立多棵无环路的树&a…

论文及代码详解——HRNet

文章目录 论文详解 &#xff08;High-Resolution Networks&#xff09;Parallel Multi-Resolution ConvolutionsRepeated Multi-Resolution FusionsRepresentation Head 代码详解 论文&#xff1a;《Deep High-Resolution Representation Learning for Visual Recognition》 代…

MySQL报错:Incorrect integer value: ‘None‘ for column ‘managerId‘ at row 1

错误如下&#xff1a; 今天在建表的时候突然报错 上网查询了原因&#xff0c;把None改成NULL就行了。 5以上的版本如果是空值应该要写NULL&#xff0c;这种问题一般mysql 5.x上出现。 改完后就运行正常了

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s

前言 呵呵 最近再一次 环境部署的过程中碰到了这样的一个问题 我基于 docker 启动了一个 mysql 服务, 然后 挂载出了 数据目录 和 配置目录, 没有手动复制配置目录出来, 所以配置目录是空的 然后 我基于 docker 启动了一个 nacos, 配置数据库设置为上面的这个 mysql 然后 启…

【2023年11月第四版教材】《第6章-项目管理概论》(第二部分)

《第6章-项目管理概论》&#xff08;第二部分&#xff09; 3 项目经理的角色3.1 项目经理的影响力范围3.2 项目经理领导力风格 4 价值驱动的项目管理知识体系4.1 开发生命周期类型 5 五大过程组6 五个过程组和十大知识领域 3 项目经理的角色 3.1 项目经理的影响力范围 范围影…

从业务层的代码出发,去排查通用框架代码崩溃的问题

目录 1、问题说明 1.1、Release下崩溃&#xff0c;Debug下很难复现 1.2、用Windbg打开dump文件&#xff0c;发现崩溃在通用的框架代码中 2、进一步分析 2.1、使用IDA查看汇编代码尝试寻找崩溃的线索 2.2、在Windbg中查看相关变量的值 2.3、查看最近代码的修改记录&#…

渗透和红队快速打点工具

&#x1f525; POC-bomber &#x1f984; POC bomber 是一款漏洞检测/利用工具&#xff0c;旨在利用大量高危害漏洞的POC/EXP快速获取目标服务器权限 本项目收集互联网各种危害性大的 RCE 任意文件上传 反序列化 sql注入 等高危害且能够获取到服务器核心权限的漏洞POC/EXP…

【C++STL基础入门】深入浅出string类的比较(compare)、复制(copy)

文章目录 前言一、比较1.比较运算符2.compare函数 二、复制1.copy函数 总结 前言 本系列STL使用VS2022C20版本 在C标准库中&#xff0c;string类是一个功能强大的字符串处理类&#xff0c;提供了丰富的操作函数。本文将详细介绍string类的比较、复制、查找字串、返回字串、交…

d3dx9_43.dll如何修复?找不到d3dx9_43.dll怎么办

d3dx9_43.dll文件通常与DirectX 9运行时库一起安装在用户的计算机上。当用户运行需要DirectX 9支持的应用程序时&#xff0c;操作系统会自动加载d3dx9_43.dll文件&#xff0c;并提供所需的功能。如果缺少或损坏了该文件&#xff0c;用户可能会遇到无法运行应用程序、崩溃或显示…

如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现全屏滚动效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

深入理解Linux内核--Ext2和Ext3文件系统

Ext2的一般特征 类Unix操作系统使用多种文件系统。尽管所有这些文件系统都有少数POSIX API(如state())所需的共同的属性子集&#xff0c;但每种文件系统的实现方式是不同的。 Linux的第一个版本是基于MINIX文件系统的。当Linux成熟时&#xff0c;引入了扩展文件系统(Extended …