File Inclusion,意思是檔案包含(漏洞),是指當服務器開啟allow_url_include選項時,就可以通過php的某些特性函式(include(),require()和include_once(),require_once())利用url去動態包含檔案,此時如果沒有對檔案來源進行嚴格審查,就會導致任意檔案讀取或者任意命令執行,
檔案包含漏洞分為本地檔案包含漏洞與遠程檔案包含漏洞,遠程檔案包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之后,服務器允許包含一個遠程的檔案),
檔案包含時,不管包含的檔案是什么型別,都會優先嘗試當作php檔案執行,如果檔案內容有php代碼,則會執行php代碼并回傳代碼執行的結果,如果檔案內容沒有php代碼,則把檔案內容列印出來
Low
漏洞利用
1.本地檔案包含
構造url:http://192.168.0.104/dvwa/vulnerabilities/fi/?page=/etc/shadow

報錯,顯示沒有這個檔案,說明不是服務器系統不是Linux,但同時暴露了服務器檔案的絕對路徑為E:\phpStudy2019_64\phpstudy_pro\WWW
構造url(絕對路徑):
http://192.168.0.104/dvwa/vulnerabilities/fi/?page=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\php.ini
成功讀取了服務器的php.ini檔案

構造url(相對路徑);
http://192.168.0.104/dvwa/vulnerabilities/fi/?page=..\..\..\..\..\..\..\C:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\php.ini
加這么多..\是為了保證到達服務器的C盤根目錄,可以看到讀取是成功的,(我這里相對路徑不在同一盤符,只能用絕對路徑)
同時我們看到,組態檔中的Magic_quote_gpc選項為off,在php版本小于5.3.4的服務器中,當Magic_quote_gpc選項為off時,我們可以在檔案名中使用%00進行截斷,也就是說檔案名中%00后的內容不會被識別,即下面兩個url是完全等效的,
A)http://192.168.0.104/dvwa/vulnerabilities/fi/page=..\..\..\..\..\..\..\..\..\xampp\htdocs\dvwa\php.ini
B)http://192.168.0.104/dvwa/vulnerabilities/fi/page=..\..\..\..\..\..\..\..\..\xampp\htdocs\dvwa\php.ini%0012.php
使用%00截斷可以繞過某些過濾規則,例如要求page引數的后綴必須為php,這時鏈接A會讀取失敗,而鏈接B可以繞過規則成功讀取,
2.遠程檔案包含
當服務器的php配置中,選項allow_url_fopen與allow_url_include為開啟狀態時,服務器會允許包含遠程服務器上的檔案,如果對檔案來源沒有檢查的話,就容易導致任意遠程代碼執行,
在遠程服務器192.168.0.104上傳一個testphpinfo.txt檔案,內容如下

構造url:http://192.168.0.104/dvwa/vulnerabilities/fi/?page=http://192.168.0.104/testphpinfo.txt

為了增加隱蔽性,可以對http://192.168.0.104/testphpinfo.txt進行編碼
Medium
可以看到,Medium級別的代碼增加了str_replace函式,對page引數進行了一定的處理,將”http:// ”、”https://”、 ” ../”、”..\”替換為空字符,即洗掉,
漏洞利用
使用str_replace函式是極其不安全的,因為可以使用雙寫繞過替換規則,
例如page=hthttp://tp://192.168.0.104/phpinfo.txt時,str_replace函式會將http://洗掉,于是page=http://192.168.0.101/phpinfo.txt,成功執行遠程命令,
同時,因為替換的只是“../”、“..\”,所以對采用絕對路徑的方式包含檔案是不會受到任何限制的,
1.本地檔案包含
http://192.168.153.130/dvwa/vulnerabilities/fi/page=…/./…/./…/./…/./…/./…/./…/./…/./…/./…/./xampp/htdocs/dvwa/php.ini
讀取組態檔成功
http://192.168.0.104/dvwa/vulnerabilities/fi/?page=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\php.ini
絕對路徑不受任何影響,讀取成功
2.遠程檔案包含
http://192.168.0.104/dvwa/vulnerabilities/fi/?page=htthttp://p://192.168.0.104/testphpinfo.txt
遠程執行命令成功
經過編碼后的url不能繞過替換規則,因為解碼是在瀏覽器端完成的,發送過去的page引數依然是http://192.168.5.12/phpinfo.txt,因此讀取失敗,
High
可以看到,High級別的代碼使用了fnmatch函式檢查page引數,要求page引數的開頭必須是file,服務器才會去包含相應的檔案,
漏洞利用
High級別的代碼規定只能包含file開頭的檔案,看似安全,不幸的是我們依然可以利用file協議繞過防護策略,file協議其實我們并不陌生,當我們用瀏覽器打開一個本地檔案時,用的就是file協議,如下圖,
http://192.168.0.104/dvwa/vulnerabilities/fi/?page=file:///E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\php.ini

至于執行任意命令,需要配合檔案上傳漏洞利用,首先需要上傳一個內容為php的檔案,然后再利用file協議去包含上傳檔案(需要知道上傳檔案的絕對路徑),從而實作任意命令執行,
Impossible
可以看到,Impossible級別的代碼使用了白名單機制進行防護,簡單粗暴,page引數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了檔案包含漏洞,
本文僅是個人學習記錄,部分摘自FreeBuf.Com等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/21016.html
標籤:其他
上一篇:CSRF(跨站請求偽造)
下一篇:day13 IP包頭分析 | 路由器原理 1