開發過程總結的漏洞:
一,,如何造成包含漏洞:在通過函數包含檔案時,由于沒有對包含的檔案名進行有效的過濾處理,被攻擊者利用進而導緻了包含了Web根目錄以外的檔案進來,就會導緻檔案資訊的洩露甚至注入了惡意代碼。
PHP檔案包含的幾個危險函數:
include():隻有代碼執行到該函數時才會包含檔案進來,發生錯誤時隻給出一個警告并繼續向下執行。
include_once():和include()功能相同,差別在于當重複調用同一檔案時,程式隻調用一次。
require():隻要程式執行就包含檔案進來,發生錯誤時會輸出錯誤結果并終止運作。
require_once():和require()功能相同,差別在于當重複調用同一檔案時,程式隻調用一次。
二,要想成功的利用檔案包含漏洞需要滿足下面兩個條件:
1,include()等函數通過動态變量的方式引入需要包含的檔案
2,使用者能夠控制該變量
分類:
本地檔案包含
檔案包含漏洞也是代碼注入的一種,代碼注入的原理是注入一段使用者能夠控制執行的腳本或代碼,并讓伺服器端執行
遠端檔案包含
如果PHP的配置選項allow_url_include為On的話,則include/require函數是可以加載遠端檔案的,這種漏洞被稱為遠端檔案包含漏洞
三,檔案包含漏洞如何避免
禁止伺服器遠端檔案包含
從代碼層來講,在開發過程中應該盡量避免動态的變量,尤其是使用者可以控制的變量。一種保險的做法是采用“白名單”的方式将允許包含的檔案列出來,隻允許包含白名單中的檔案,這樣就可以避免任意檔案包含的風險
将檔案包含漏洞利用過程中的一些特殊字元定義在黑名單中,對傳入的參數進行過濾,但這樣有時會因為過濾不全,導緻被有經驗的攻擊者繞過。過濾.(點)/(斜杠)\(反斜杠)
伺服器安全配置方面可以通過設定php.ini中open_basedir的值将允許包含的檔案限定在某一特定目錄内,這樣可以有效的避免利用檔案包含漏洞進行的攻擊。需要注意的是,open_basedir的值是目錄的字首。如:open_basedir=/var/www/test