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