File Inclusion,意思是文件包含(漏洞),是指當服務器開啓allow_url_include選項時,就能夠經過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時若是沒有對文件來源進行嚴格審查,就會致使任意文件讀取或者任意命令執行。
文件包含漏洞分爲本地文件包含漏洞與遠程文件包含漏洞,遠程文件包含漏洞是由於開啓了php配置中的allow_url_fopen選項(選項開啓以後,服務器容許包含一個遠程的文件)。
文件包含時,無論包含的文件是什麼類型,都會優先嚐試看成php文件執行,若是文件內容有php代碼,則會執行php代碼並返回代碼執行的結果,若是文件內容沒有php代碼,則把文件內容打印出來
Low
漏洞利用
1.本地文件包含
報錯,顯示沒有這個文件,說明不是服務器系統不是Linux,但同時暴露了服務器文件的絕對路徑爲E:\phpStudy2019_64\phpstudy_pro\WWW
構造url(絕對路徑):
成功讀取了服務器的php.ini文件
構造url(相對路徑);
加這麼多..\是爲了保證到達服務器的C盤根目錄,能夠看到讀取是成功的。(我這裏相對路徑不在同一盤符,只能用絕對路徑)
同時咱們看到,配置文件中的Magic_quote_gpc選項爲off。在php版本小於5.3.4的服務器中,當Magic_quote_gpc選項爲off時,咱們能夠在文件名中使用%00進行截斷,也就是說文件名中%00後的內容不會被識別,即下面兩個url是徹底等效的。
使用%00截斷能夠繞過某些過濾規則,例如要求page參數的後綴必須爲php,這時連接A會讀取失敗,而連接B能夠繞過規則成功讀取。
2.遠程文件包含
當服務器的php配置中,選項allow_url_fopen與allow_url_include爲開啓狀態時,服務器會容許包含遠程服務器上的文件,若是對文件來源沒有檢查的話,就容易致使任意遠程代碼執行。
在遠程服務器192.168.0.104上傳一個testphpinfo.txt文件,內容以下
Medium
能夠看到,Medium級別的代碼增長了str_replace函數,對page參數進行了必定的處理,將」http:// 」、」https://」、 」 ../」、」..\」替換爲空字符,即刪除。
漏洞利用
使用str_replace函數是極其不安全的,由於可使用雙寫繞過替換規則。
同時,由於替換的只是「../」、「..\」,因此對採用絕對路徑的方式包含文件是不會受到任何限制的。
1.本地文件包含
讀取配置文件成功
絕對路徑不受任何影響,讀取成功
2.遠程文件包含
遠程執行命令成功
High
能夠看到,High級別的代碼使用了fnmatch函數檢查page參數,要求page參數的開頭必須是file,服務器纔會去包含相應的文件。
漏洞利用
High級別的代碼規定只能包含file開頭的文件,看似安全,不幸的是咱們依然能夠利用file協議繞過防禦策略。file協議其實咱們並不陌生,當咱們用瀏覽器打開一個本地文件時,用的就是file協議,以下圖。
http://192.168.0.104/dvwa/vulnerabilities/fi/?page=file:///E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\php.ini
至於執行任意命令,須要配合文件上傳漏洞利用。首先須要上傳一個內容爲php的文件,而後再利用file協議去包含上傳文件(須要知道上傳文件的絕對路徑),從而實現任意命令執行。
Impossible
能夠看到,Impossible級別的代碼使用了白名單機制進行防禦,簡單粗暴,page參數必須爲「include.php」、「file1.php」、「file2.php」、「file3.php」之一,完全杜絕了文件包含漏洞。