一、什么是文件包含漏洞
在了解這個漏洞之前我們先要理解什么是文件包含,文件包含的初衷是為了減少程序代碼的冗余。
試想一下,我在每一個代碼文件中都要用到同一段代碼,如果我把這段都要用到的代碼轉換成一個文件,讓每一個用到它的代碼都將其包含在里邊,不就可以減少很多代碼量,減少很多工作量了嗎?
在php中,包含一個文件有四種函數:
include()、include_once()、require()、require_once()
include()和include_once()的區別在於,include_once()只會引用同樣的文件一次,為了避免函數和變量的重新定義,require和require_once()同理。
include()函數包含的文件如果不存在,程序會發出警告,但是會繼續運行。
require()函數包含的文件如果不存在,程序會拋出異常,停止運行。
在用這四個函數來包含文件的時候,不論文件類型為什么,其中的內容都會被當作php代碼來解析
根據包含文件位置的不同,文件包含漏洞可以分為兩類。遠程文件包含(RFI)和本地文件包含(LFI)。
二、本地文件包含(LFI)
在https://www.zllovell.com/phpstudy/ 服務器目錄下有一個zl.txt文件,內容如上圖,當前目錄還有一個test.php文件內容如下
這時候我們訪問https://www.zllovell.com/phpstudy/test.php?file=zl.txt,結果如下
這就是本地文件包含漏洞,可以讀取服務器本地的文件。
三、遠程文件包含(RFI)
RFI的利用條件較為苛刻,需要php.ini配置文件中allow_url_fopen與allow_url_include都為on才可以。
但是遠程文件包含意味着包含的文件內容是我們完全可控的,不是來自服務器端的文件,所以一旦服務器存在遠程文件包含漏洞會造成的危害極大。