未加星标

PHP索引数组+unset使用不当导致的问题

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二04 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏
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攻防较量的过程,对抗的点就是哪一方考虑的更加周全。

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

主题: PHP删除变量
tags: gt,php,length,string,ext,limit,unset,bmp,png,key,jpg,jpeg,gif,value,vo
分页:12
转载请注明
本文标题:PHP索引数组+unset使用不当导致的问题
本站链接:https://www.codesec.net/view/578675.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(24)