文件包含漏洞原理
程序開發人員一般會把重複使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件,而無需再次編寫,這種文件調用的過程一般被稱爲文件包含。通過函數包含文件時,由於沒有對包含的文件名進行有效的過濾處理,被攻擊者利用從而導致了包含了Web根目錄以外的文件進來,就會導致文件信息的泄露甚至注入了惡意代碼。
分類
本地文件包含
被包含的文件在本地服務器中。
遠程文件包含
被包含的文件在第三方服務器中。
文件包含函數
a、include():只有代碼執行到該函數時纔會包含文件進來,發生錯誤時只給出
一個警告並繼續向下執行。
b、include_once():和include()功能相同,區別在於當重複調用同一文件時,程
序只調用一次。
c、require():只要程序執行就包含文件進來,發生錯誤時會輸出錯誤結果並終止
運行。
d、require_once():和require()功能相同,區別在於當重複調用同一文件時,程序
只調用一次。
存在的風險
讀取文件、寫入文件。
實戰
攻擊目標
系統:Ubuntu16.04
IP:192.168.1.11
環境:Apache2+PHP7.2+mysql5.7
應用:DVWA
讀取文件
使用…/…/…/…/…/…/etc/shadow讀取本地賬戶信息
2、寫入文件
使用input寫入文件
如何防禦
1、嚴格檢查變量是否已經初始化。
2、嚴格判斷包含中的參數是否外部可控。
3、基於白名單的包含文件驗證,驗證被包含的文件是否在白名單中。
4、儘量不要使用動態包含,可以在需要包含的頁面固定寫好,如:include("func.php")。
5、對所有輸入提交可能包含的文件地址,包括服務器本地文件及遠程文件,
進行嚴格的檢查,參數中不允許出現../之類的目錄跳轉符。
6、可以通過調用str_replace()函數實現相關敏感字符的過濾,
一定程度上防禦了遠程文件包含。