一、文件包含介紹
程序開發人員通常會把可重復使用的函數寫到單個文件中,在使用某個函數的時候,直接調用此文件,無需再次編寫,這種調用文件的過程通常稱為包含。為了代碼靈活,開發通常把被包含的文件設置為變量,來進行動態調用,但正是由於這種靈活性,從而導致客戶端可以調用任意文件,造成文件包含漏洞。在PHP Web Application中較多。
原因:
1.Web應用實現了動態包含。
2.動態包含的文件路徑參數,客戶端可控。
危害:文件包含漏洞是非常嚴重的漏洞,如果存在就等於網站的防御措施全部失效。一般的大馬、小馬過不了安全狗,但是文件包含漏洞可以過掉安全狗。
特點:
1.無視文件擴展名讀取文件。如圖片.jpg,打開不是圖片,二是二進制碼。
2.無條件解析PHP代碼。如圖片.jpg中插入一句話木馬info.php。
二、PHP中四個文件包含函數
include() 文件包含失敗時,會產生警告,腳本會繼續運行。
include_once() 與include()功能相同,文件只會被包含一次。
require() 文件包含失敗時,會產生錯誤,直接結束腳本執行。
require_once() 與require()功能相同,文件只會被包含一次。
本質是將任意文件包含在上述函數的引用變量中。
三 、分類
1.本地文件包含:通過相對路徑的方式找到文件,然后包含。讀取和打開本地文件。
2.遠程文件包含:通過Http、Ftp、Php偽協議(php://),可以加載遠程文件。
可以通過php.ini來進行配置:
allow_url_fopen=On/Off 本地文件包含(LFI)的開關
allow_url_include=On/Off 遠程文件包含(RFI)的開關
四、文件包含的利用
1.讀取敏感文件。
[?path=路徑] 絕對路徑、相對路徑..\..\..\..\..\
2.直接包含圖片木馬。
[?path=圖片]
3.包含木馬寫shell。
4.訪問本地文件
[?path=file://路徑]
5.傳輸php文件
[?path=php://filter/read=convert.base64-encode/resource=文件]
然后把得到的所有字符串base64解碼即可。(獲取網站源代碼)
6.執行php命令:
通過BP抓包