File Inclusion(文件包含)
File Inclusion(文件包含),是指當服務器開啟了allow_url_include選項時,通過一些PHP的特性函數(比如:include(),require(),include_once()和require_once())利用URL去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。
文件包含分類
本地文件包含:當被包含的文件在本地服務器時,就叫做本地文件包含
例:../../../../../etc/passwd
遠程文件包含:當被包含的文件在第三方服務器時,就叫做遠程文件包含
例:http://www.baidu.com 可以直接打開百度
特性函數區別
include() 當使用該函數包含文件時,只有代碼執行到include()函數時才將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行
include_once() 功能和include()相同,區別在於當重復調用同一文件時,程序只調用一次
require() require()與include()的區別在於require()執行如果發生錯誤,函數會輸出錯誤信息,並終止腳本的運行 。使用require()函數包含文件時,只要程序一執行,立即調用文件,而include()只有程序執行到函數時才調用 .require()在php程序執行前執行,會先讀入 require 所指定引入的文件,使它變成 PHP 程序網頁的一部份。
require_once() 它的功能與require()相同,區別在於當重復調用同一文件時,程序只調用一次
File Inclusion主題:
Low
源碼解析
<?php // The page we wish to display //直接獲取page參數,未做任何過濾 $file = $_GET[ 'page' ]; ?>
漏洞復現
(1)先點擊下面的鏈接,進行嘗試,可以看到有結果直接返回了
(2)這個地方因為我知道他的phpinfo.php文件在他的前兩級目錄文件中,所以我在這里就直接進行嘗試了(本地包含)
(3)嘗試一下包含百度頁面,發現直接成功了(遠程包含)
Medium
源碼解析
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation //將參數中的http:// https:// ../ ..\都替換成空 $file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\"" ), "", $file ); ?>
這個地方加了一些過濾,將“http://”,“https://”,“../”,“..\”全部替換成了空,這個地方其實可以考慮雙寫繞過。
漏洞復現
構造一個新的
hthttp://tp://www.baidu.com
過濾后
http://www.baidu.com
過濾前
…/./
過濾后
../
High
源碼解析
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation //文件名必須以file開始,或只能為include.php if( !fnmatch( "file*", $file ) && $file != "include.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; } ?>
匹配"file*",以'file'開頭的文件,或者匹配include.php,如果不是以'file'開頭的文件,或者不是include.php,就輸出"ERROR: File not found!"。
漏洞復現
使用偽協議:file:// (訪問本地文件系統)(偽協議文章參考:https://blog.csdn.net/Wu000999/article/details/101925271)
Impossible
源碼解析
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Only alLow include.php or file{1..3}.php //file變量只能為include.php、file1、file2、file3其中一個 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”之一,徹底杜絕了文件包含漏洞。