PHP索引数组+unset使用不当导致的问题
转自先知社区 https://xz.aliyun.com/t/2443
0x00前言
通常网站后台可以配置允许上传附件的文件类型,一般登录后台,添加php类型即可上传php文件getshell。但是,随着开发者安全意识的提高,开发者可能会在代码层面强制限制php等特定文件类型的上传,有时会使用unset函数销毁删除允许上传文件类型的索引数组,如:Array('gif','jpg','jpeg','bmp','png','php'),不过错误地使用unset函数并不能到达过滤限制的效果。
0x01问题详情
问题描述:
最近在审计某CMS代码过程中,发现后台限制文件上传类型的代码如下:
$ext_limit = $ext_limit != '' ? parse_attr($ext_limit) : ''; foreach (['php', 'html', 'htm', 'js'] as $vo) {unset($ext_limit[$vo]); }
其目的是实现:获取配置中的允许上传文件类型$ext_limit并转换为数组,无论后台是否添加了php等类型文件,均强制从允许上传文件类型的数组中删除php,html,htm,js等类型。
但是由于unset函数使用不当,导致其代码无法达到该目的。具体地,执行如下代码:
$ext_limit = Array('gif','jpg','jpeg','bmp','png','php'); var_dump($ext_limit); foreach (['php', 'html', 'htm', 'js'] as $vo) {unset($ext_limit[$vo]); } var_dump($ext_limit);
得到输出为如下,可以看到php并没有被删除
D:\wamp\www\test.php:15: array (size=6)0 => string 'gif' (length=3)1 => string 'jpg' (length=3)2 => string 'jpeg' (length=4)3 => string 'bmp' (length=3)4 => string 'png' (length=3)5 => string 'php' (length=3)D:\wamp\www\test.php:19: array (size=6)0 => string 'gif' (length=3)1 => string 'jpg' (length=3)2 => string 'jpeg' (length=4)3 => string 'bmp' (length=3)4 => string 'png' (length=3)5 => string 'php' (length=3)
问题分析:
unset函数的使用说明可以参考php官网,简单理解就是:unset可以销毁掉一个变量;或者根据传入的key值,销毁数组类型中指定的键值对。
针对PHP 索引数组,调用unset时必须调用其对应的数字索引才能销毁指定的键值对。所以如果传入unset函数的参数不是索引,而是其值的情况(如此处unset('php')),无法销毁删除对应为php的键值对。
0x03修复办法
修改以上存在缺陷的代码为如下,主要是枚举索引数组为key=>value的形式,根据value进行比较,满足条件时将对应的key传入unset函数,从而销毁删除。
$ext_limit = Array('gif','jpg','jpeg','bmp','png','php'); var_dump($ext_limit); foreach (['php', 'html', 'htm', 'js'] as $vo) {foreach($ext_limit as $key=>$value){if($value===$vo){unset($ext_limit[$key]);}} } var_dump($ext_limit);
输出结果如下(php对应的键值对已被删除):
D:\wamp\www\test.php:15: array (size=6)0 => string 'gif' (length=3)1 => string 'jpg' (length=3)2 => string 'jpeg' (length=4)3 => string 'bmp' (length=3)4 => string 'png' (length=3)5 => string 'php' (length=3)D:\wamp\www\test.php:23: array (size=5)0 => string 'gif' (length=3)1 => string 'jpg' (length=3)2 => string 'jpeg' (length=4)3 => string 'bmp' (length=3)4 => string 'png' (length=3)
0x04小结
使用索引数组时,如果要使用unset销毁删除指定的键值对,切记采用枚举索引数组为key=>value的形式,根据value进行比较,满足条件时将对应的key传入unset函数
ps:安全问题的分析与挖掘就是一个开发者与hacker攻防较量的过程,对抗的点就是哪一方考虑的更加周全。
转载于:https://www.cnblogs.com/test404/p/9335876.html
PHP索引数组+unset使用不当导致的问题相关推荐
- php索引数组转键数组,php索引数组和关联数组
这篇文章主要介绍的内容是关于php索引数组和关联数组,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 最近遇到个bug,记录一下//定义一个数组 $arr = Array('a','b' ...
- arrays中copyof_在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
面试三连 面试官:使用过集合吗?能说说都使用过哪些吗? 小明:当然使用过,使用比较多的就是ArrayList与HashMap,还有LinkedList.HashTable.ConcurrentHash ...
- Bash : 索引数组
Bash 提供了两种类型的数组,分别是索引数组(indexed array)和关联数组(associative array).本文主要介绍索引数组的基本用法. 索引数组的基本特点 Bash 提供的数组 ...
- php 关联数组 索引,PHP 数组:索引数组与关联数组
在静态语言(C.Java.Go)中,数组的定义通常是同一类型数据的连续序列,PHP 的数组从功能角度来说更加强大,可以包含任何数据类型,支持无限扩容,并且将传统数组和字典类型合二为一,在 PHP 中, ...
- 如何在 bash 中使用索引数组
数组是一种数据结构,表示具有相同数据类型的对象集合.bash shell中支持两种类型的数组:关联数组或索引数组.在本文中,将演示如何在 bash 中使用索引数组.以下使用 shell 示例来说明索引 ...
- 14.索引数组初始化
PHP有两种数组:索引数组.关联数组. 索引和关联两个词都是针对数组的键而言的. 先介绍下索引数组,索引数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推. 下面使用图来说明一下: 可 ...
- java redis使用卡死_记一次找因 redis 使用不当导致应用卡死 bug 的过程
原标题:记一次找因 redis 使用不当导致应用卡死 bug 的过程 作者:小木 my.oschina.net/xiaomu0082/blog/2990388 首先说下问题现象:内网sandbox环境 ...
- PHP索引数组关联数组
https://blog.csdn.net/qq_32849999/article/details/80290240 区分 索引数组:索引值是数字的 从0增加的 自动化的 关联数组:键值是字符串 人 ...
- mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析
索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...
最新文章
- Linux系统下如何安装软件包
- 徐匡迪、潘云鹤等纷纷撰文,关于人工智能的最新判断都在这里了
- java.两个例子充分阐述多态的可拓展性
- maven dependency中scope=compile 和 provided区别
- 中国机器人减速机行业十四五发展规划及未来需求预测报告2021-2027年
- 天玥运维安全网关默认密码_Soul网关发布全新架构V2.2.0,让高性能网关变得如此简单
- android中图型的阴影效果(shadow-effect-with-custom-shapes)
- oracle 索引字典,oracle数据字典、索引、序列
- 64k超高清3d程序 Warez出品的精品动画 近25万倍的压缩的精品
- JDY-10M串口调试、焊接问题总结
- linux之调试触摸屏驱动
- 打印机显示服务器脱机是什么原因,脱机使用打印机是什么意思?脱机打印机状态显示错误怎么办...
- 2015美团校招面试总结
- 非对称加密RSA文本和Excel文件加密练习
- label smooth标签平滑【ConvE(知识图谱补全-链接预测)中使用到】
- 加载Glove预训练词向量到字典
- java基于springboot+vue的企业员工人事工资薪酬管理系统 elementui
- 保存切片找不到html,HTML5切片,结果文件损坏
- matching wildcard is strict, but no declaration can be found for element forcontext:property-plac
- 线性筛求莫比乌斯函数前缀和