PHP索引数组+unset使用不当导致的问题
轉(zhuǎn)自先知社區(qū)?https://xz.aliyun.com/t/2443
0x00前言
通常網(wǎng)站后臺(tái)可以配置允許上傳附件的文件類(lèi)型,一般登錄后臺(tái),添加php類(lèi)型即可上傳php文件getshell。但是,隨著開(kāi)發(fā)者安全意識(shí)的提高,開(kāi)發(fā)者可能會(huì)在代碼層面強(qiáng)制限制php等特定文件類(lèi)型的上傳,有時(shí)會(huì)使用unset函數(shù)銷(xiāo)毀刪除允許上傳文件類(lèi)型的索引數(shù)組,如:Array('gif','jpg','jpeg','bmp','png','php'),不過(guò)錯(cuò)誤地使用unset函數(shù)并不能到達(dá)過(guò)濾限制的效果。
0x01問(wèn)題詳情
問(wèn)題描述:
最近在審計(jì)某CMS代碼過(guò)程中,發(fā)現(xiàn)后臺(tái)限制文件上傳類(lèi)型的代碼如下:
$ext_limit = $ext_limit != '' ? parse_attr($ext_limit) : ''; foreach (['php', 'html', 'htm', 'js'] as $vo) {unset($ext_limit[$vo]); }其目的是實(shí)現(xiàn):獲取配置中的允許上傳文件類(lèi)型$ext_limit并轉(zhuǎn)換為數(shù)組,無(wú)論后臺(tái)是否添加了php等類(lèi)型文件,均強(qiáng)制從允許上傳文件類(lèi)型的數(shù)組中刪除php,html,htm,js等類(lèi)型。
但是由于unset函數(shù)使用不當(dāng),導(dǎo)致其代碼無(wú)法達(dá)到該目的。具體地,執(zhí)行如下代碼:
$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并沒(méi)有被刪除
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)問(wèn)題分析:
unset函數(shù)的使用說(shuō)明可以參考php官網(wǎng),簡(jiǎn)單理解就是:unset可以銷(xiāo)毀掉一個(gè)變量;或者根據(jù)傳入的key值,銷(xiāo)毀數(shù)組類(lèi)型中指定的鍵值對(duì)。
針對(duì)PHP 索引數(shù)組,調(diào)用unset時(shí)必須調(diào)用其對(duì)應(yīng)的數(shù)字索引才能銷(xiāo)毀指定的鍵值對(duì)。所以如果傳入unset函數(shù)的參數(shù)不是索引,而是其值的情況(如此處unset('php')),無(wú)法銷(xiāo)毀刪除對(duì)應(yīng)為php的鍵值對(duì)。
0x03修復(fù)辦法
修改以上存在缺陷的代碼為如下,主要是枚舉索引數(shù)組為key=>value的形式,根據(jù)value進(jìn)行比較,滿足條件時(shí)將對(duì)應(yīng)的key傳入unset函數(shù),從而銷(xiāo)毀刪除。
$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);輸出結(jié)果如下(php對(duì)應(yīng)的鍵值對(duì)已被刪除):
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小結(jié)
使用索引數(shù)組時(shí),如果要使用unset銷(xiāo)毀刪除指定的鍵值對(duì),切記采用枚舉索引數(shù)組為key=>value的形式,根據(jù)value進(jìn)行比較,滿足條件時(shí)將對(duì)應(yīng)的key傳入unset函數(shù)
ps:安全問(wèn)題的分析與挖掘就是一個(gè)開(kāi)發(fā)者與hacker攻防較量的過(guò)程,對(duì)抗的點(diǎn)就是哪一方考慮的更加周全。
轉(zhuǎn)載于:https://www.cnblogs.com/test404/p/9335876.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的PHP索引数组+unset使用不当导致的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: knockout checkbox 全选
- 下一篇: 常用的SQLAlchemy列选项