標籤:href 檔案上傳 == 效果 value asp top 群組類型 指定
轉自Crowdsourced Security Testing社區 https://xz.aliyun.com/t/2443
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索引數組+unset使用不當導致的問題