PHP索引数组+unset使用不当导致的问题
轉自先知社區(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: knockout checkbox 全选
- 下一篇: 动态规划算法php,php算法学习之动态