转自先知社区 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使用不当导致的问题相关推荐

  1. php索引数组转键数组,php索引数组和关联数组

    这篇文章主要介绍的内容是关于php索引数组和关联数组,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 最近遇到个bug,记录一下//定义一个数组 $arr = Array('a','b' ...

  2. arrays中copyof_在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?

    面试三连 面试官:使用过集合吗?能说说都使用过哪些吗? 小明:当然使用过,使用比较多的就是ArrayList与HashMap,还有LinkedList.HashTable.ConcurrentHash ...

  3. Bash : 索引数组

    Bash 提供了两种类型的数组,分别是索引数组(indexed array)和关联数组(associative array).本文主要介绍索引数组的基本用法. 索引数组的基本特点 Bash 提供的数组 ...

  4. php 关联数组 索引,PHP 数组:索引数组与关联数组

    在静态语言(C.Java.Go)中,数组的定义通常是同一类型数据的连续序列,PHP 的数组从功能角度来说更加强大,可以包含任何数据类型,支持无限扩容,并且将传统数组和字典类型合二为一,在 PHP 中, ...

  5. 如何在 bash 中使用索引数组

    数组是一种数据结构,表示具有相同数据类型的对象集合.bash shell中支持两种类型的数组:关联数组或索引数组.在本文中,将演示如何在 bash 中使用索引数组.以下使用 shell 示例来说明索引 ...

  6. 14.索引数组初始化

    PHP有两种数组:索引数组.关联数组. 索引和关联两个词都是针对数组的键而言的. 先介绍下索引数组,索引数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推. 下面使用图来说明一下: 可 ...

  7. java redis使用卡死_记一次找因 redis 使用不当导致应用卡死 bug 的过程

    原标题:记一次找因 redis 使用不当导致应用卡死 bug 的过程 作者:小木 my.oschina.net/xiaomu0082/blog/2990388 首先说下问题现象:内网sandbox环境 ...

  8. PHP索引数组关联数组

    https://blog.csdn.net/qq_32849999/article/details/80290240 区分 索引数组:索引值是数字的 从0增加的  自动化的 关联数组:键值是字符串 人 ...

  9. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析

    索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...

最新文章

  1. Linux系统下如何安装软件包
  2. 徐匡迪、潘云鹤等纷纷撰文,关于人工智能的最新判断都在这里了
  3. java.两个例子充分阐述多态的可拓展性
  4. maven dependency中scope=compile 和 provided区别
  5. 中国机器人减速机行业十四五发展规划及未来需求预测报告2021-2027年
  6. 天玥运维安全网关默认密码_Soul网关发布全新架构V2.2.0,让高性能网关变得如此简单
  7. android中图型的阴影效果(shadow-effect-with-custom-shapes)
  8. oracle 索引字典,oracle数据字典、索引、序列
  9. 64k超高清3d程序 Warez出品的精品动画 近25万倍的压缩的精品
  10. JDY-10M串口调试、焊接问题总结
  11. linux之调试触摸屏驱动
  12. 打印机显示服务器脱机是什么原因,脱机使用打印机是什么意思?脱机打印机状态显示错误怎么办...
  13. 2015美团校招面试总结
  14. 非对称加密RSA文本和Excel文件加密练习
  15. label smooth标签平滑【ConvE(知识图谱补全-链接预测)中使用到】
  16. 加载Glove预训练词向量到字典
  17. java基于springboot+vue的企业员工人事工资薪酬管理系统 elementui
  18. 保存切片找不到html,HTML5切片,结果文件损坏
  19. matching wildcard is strict, but no declaration can be found for element forcontext:property-plac
  20. 线性筛求莫比乌斯函数前缀和

热门文章

  1. 重磅官宣:Nacos2.0性能提升10倍
  2. 来自Riot 的一份游戏美术教程(一):核心原则
  3. 手忙脚乱的快乐 谈谈Overcooked让人爱恨交织的多人合作机制
  4. 《博德之门 3》究竟有多「DnD」?
  5. 第九届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)
  6. Java 异常 总结 try catch finally Exception
  7. 一个释放临时表空间的实例
  8. springboot运行原理
  9. JAVA获取系统相关的信息
  10. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB