DVWA-1.9系列一共分爲10個功能模塊:
- Brute Force(暴力破解)
- Command Injection(命令行注入)
- CSRF(跨站請求僞造)
- File Inclusion(文件包含)
- File Upload(文件上傳)
- Insecure CAPTCHA(不安全的驗證碼)
- SQL Injection(SQL注入)
- SQL Injection(Blind)(SQL盲注)
- XSS(Reflected)(反射型跨站腳本)
- XSS(Stored)(存儲型跨站腳本)
之前四篇文章分別是:
- 介紹了DVWA
- 第一個功能模塊Brute Force(暴力破解)
- 第二個功能模塊Command Injection(命令行注入)
- 第二個功能模塊Command Injection(跨站請求僞造)
這一篇我們繼續介紹第四個功能模塊:File Inclusion(文件包含)
1. File Inclusion簡介
File Inclusion(文件包含),意思是文件包含(漏洞),是指當服務器開啓allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。文件包含漏洞分爲本地文件包含漏洞與遠程文件包含漏洞,遠程文件包含漏洞是因爲開啓了php配置中的allow_url_fopen選項(選項開啓之後,服務器允許包含一個遠程的文件)。
該模塊主要實現功能是三個文件的鏈接跳轉,跳轉請求通過GET方式在url參數中顯示。如圖所示:
2. Low 安全級別分析
首先我們把安全級別設置爲Low級別。查看源代碼:
Low
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
通過對源代碼進行分析,我們可以看到代碼中對參數“page”沒有做任何過濾,很顯然存在漏洞。
點擊任意文件查看url:http://192.168.197.136/dvwa/vulnerabilities/fi/?page=file1.php
。服務器期望用戶的操作是點擊下面的三個鏈接,服務器會包含相應的文件,並將結果返回。需要特別說明的是,服務器包含文件時,不管文件後綴是否是php,都會嘗試當做php文件執行,如果文件內容確爲php,則會正常執行並返回結果,如果不是,則會原封不動地打印文件內容,所以文件包含漏洞常常會導致任意文件讀取與任意命令執行。
理想的狀態下我們希望的是使用者點擊下面三個文件鏈接,然後服務器返回結果。然而我們作爲攻擊者,當然不會去乖乖的點擊已經設定好的參數鏈接,而源代碼中我們看到並沒有對page參數做任何檢查和過濾。
漏洞利用:
- 本地文件包含
構造攻擊payload:http://192.168.197.136/dvwa/vulnerabilities/fi/?page=/etc/passwd
正好我們的測試服務器是linux系統,所以返回了結果。
如圖所示:
2. 遠程文件包含
當服務器的php配置中,選項allow_url_fopen與allow_url_include爲開啓狀態時,服務器會允許包含遠程服務器上的文件,如果對文件來源沒有檢查的話,就容易導致任意遠程代碼執行。
在一臺服務器中構造一個文件:http://192.168.197.136/info.txt,文件內容如下:
構造攻擊payload:”http://192.168.197.136/dvwa/vulnerabilities/fi/?page=http://192.168.197.136/info.txt”
查看執行情況:
可以看到文件中的phpinfo()函數被執行。
3. Medium 安全級別分析
首先我們把安全級別設置爲Medium級別。查看源代碼:
Medium
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
可以看到,Medium級別的代碼增加了str_replace函數,對page參數進行了一定的處理,將”http:// ”、”https://”、 ” ../”、”..\”替換爲空字符,即刪除。
漏洞利用:
同樣的我們還是可以分爲本地文件包含和遠程文件包含。
- 本地文件包含
由於本地文件包含我們的測試服務器是linux服務器,所以源代碼中的對“../”的替換對我們執行的payload沒有造成影響,我們依然可以執行LOW端的payload:http://192.168.197.136/dvwa/vulnerabilities/fi/?page=/etc/passwd。查看執行情況:如圖所示:
我們可以看到代碼仍然被執行。
2. 遠程文件包含
通過對源代碼進行查看我們可以看到源代碼中通過str_replace函數把http://替換爲空,所以我們正好可以利用這一點構造payload。
payload:http://192.168.197.136/dvwa/vulnerabilities/fi/?page=htthttp://p://192.168.197.136/info.txt,當str_replace函數把http://字符串刪除時正好構造了原來的payload:http://192.168.197.136/dvwa/vulnerabilities/fi/?page=http://192.168.197.136/info.txt。
查看執行情況:
,可以看到文件依然執行了。
4. High 安全級別分析
首先我們把安全級別設置爲High級別。查看源代碼:
High
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
通過對源代碼進行分析,我們可以看到代碼中只允許以“file”字符串開頭的文件或者只能是include.php這兩種文件。其他方式的輸入一律返回ERROR。
但是以file字符串開頭的我們依然可以構造遠程文件包含:我們通過瀏覽器打開本地文件時可以發現使用的就是file協議,以file字符串開頭:
.
構造攻擊payload:http://192.168.197.136/dvwa/vulnerabilities/fi/?page=file:///var/www/html/info.txt
查看結果:
可以看到結果依然被執行出來了。
至於執行任意命令,需要配合文件上傳漏洞利用。首先需要上傳一個內容爲php的文件,然後再利用file協議去包含上傳文件(需要知道上傳文件的絕對路徑),從而實現任意命令執行。
5. Impossible 安全級別分析
首先我們把安全級別設置爲Impossible級別。查看源代碼:
Impossible
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
可以看到,Impossible級別的代碼使用了白名單機制進行防護,簡單粗暴,page參數必須爲“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了文件包含漏洞。