日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發(fā)布時間:2024/6/30 php 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP索引数组+unset使用不当导致的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉自先知社區(qū)?https://xz.aliyun.com/t/2443

0x00前言

通常網(wǎng)站后臺可以配置允許上傳附件的文件類型,一般登錄后臺,添加php類型即可上傳php文件getshell。但是,隨著開發(fā)者安全意識的提高,開發(fā)者可能會在代碼層面強制限制php等特定文件類型的上傳,有時會使用unset函數(shù)銷毀刪除允許上傳文件類型的索引數(shù)組,如:Array('gif','jpg','jpeg','bmp','png','php'),不過錯誤地使用unset函數(shù)并不能到達過濾限制的效果。

0x01問題詳情

問題描述:

最近在審計某CMS代碼過程中,發(fā)現(xiàn)后臺限制文件上傳類型的代碼如下:

$ext_limit = $ext_limit != '' ? parse_attr($ext_limit) : ''; foreach (['php', 'html', 'htm', 'js'] as $vo) {unset($ext_limit[$vo]); }

其目的是實現(xiàn):獲取配置中的允許上傳文件類型$ext_limit并轉換為數(shù)組,無論后臺是否添加了php等類型文件,均強制從允許上傳文件類型的數(shù)組中刪除php,html,htm,js等類型。

但是由于unset函數(shù)使用不當,導致其代碼無法達到該目的。具體地,執(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并沒有被刪除

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函數(shù)的使用說明可以參考php官網(wǎng),簡單理解就是:unset可以銷毀掉一個變量;或者根據(jù)傳入的key值,銷毀數(shù)組類型中指定的鍵值對。
針對PHP 索引數(shù)組,調用unset時必須調用其對應的數(shù)字索引才能銷毀指定的鍵值對。所以如果傳入unset函數(shù)的參數(shù)不是索引,而是其值的情況(如此處unset('php')),無法銷毀刪除對應為php的鍵值對。

0x03修復辦法

修改以上存在缺陷的代碼為如下,主要是枚舉索引數(shù)組為key=>value的形式,根據(jù)value進行比較,滿足條件時將對應的key傳入unset函數(shù),從而銷毀刪除。

$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小結

使用索引數(shù)組時,如果要使用unset銷毀刪除指定的鍵值對,切記采用枚舉索引數(shù)組為key=>value的形式,根據(jù)value進行比較,滿足條件時將對應的key傳入unset函數(shù)

ps:安全問題的分析與挖掘就是一個開發(fā)者與hacker攻防較量的過程,對抗的點就是哪一方考慮的更加周全。

轉載于:https://www.cnblogs.com/test404/p/9335876.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的PHP索引数组+unset使用不当导致的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。