PHP索引數組+unset使用不當導致的問題

來源:互聯網
上載者:User

標籤: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使用不當導致的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.