PHP編程語言中為我們提供了四個(gè)常見文件包含函數(shù),分別是include()?萨赁、require()?弊琴、include_once()?、require_once()?杖爽。這四個(gè)函數(shù)都可以進(jìn)行文件包含敲董,但功能卻不一樣,
區(qū)別如下:
·include():執(zhí)行到include時(shí)才包含文件慰安,找不到被包含文件時(shí)只會(huì)產(chǎn)生警告腋寨,腳本將繼續(xù)執(zhí)行
·require():只要程序一運(yùn)行就包含文件,找不到被包含的文件時(shí)會(huì)產(chǎn)生致命錯(cuò)誤化焕,并停止腳本
·include_once()和require_once():若文件中代碼已被包含則不會(huì)再次包含
漏洞利用的條件:
·程序用include()等文件包含函數(shù)通過動(dòng)態(tài)變量的范式引入需要包含的文件
·用戶能夠控制該動(dòng)態(tài)變量
·要保證php.ini中allow_url_fopen和allow_url_include要為On
注:PHP中只要文件內(nèi)容符合PHP語法規(guī)范精置,包含時(shí)不管擴(kuò)展名是什么都會(huì)被PHP解析,?
?若文件內(nèi)容不符合PHP語法規(guī)范則會(huì)暴漏其源碼锣杂。
php.ini配置文件:allow_url_fopen=off?時(shí)不可以包含遠(yuǎn)程文件脂倦,只有開啟了才可以包含。Php4存在遠(yuǎn)程&本地元莫,php5僅存在本地包含赖阻。
漏洞分類
本地文件包含:可以包含本地文件,在條件允許時(shí)甚至能執(zhí)行代碼
讀敏感文件踱蠢,讀PHP文件
包含日志文件GetShell
上傳圖片馬火欧,然后包含從而GetShell
包含/proc/self/envion文件GetShell
包含data:或php://input等偽協(xié)議
若有phpinfo則可以包含臨時(shí)文件
遠(yuǎn)程文件包含:可以直接執(zhí)行任意代碼
php協(xié)議類型:
? file:// — 訪問本地文件系統(tǒng)
? http:// — 訪問 HTTP(s) 網(wǎng)址
? ftp:// — 訪問 FTP(s) URLs
? php:// — 訪問各個(gè)輸入/輸出流(I/O streams)
? zlib:// — 壓縮流
? data:// — 數(shù)據(jù)(RFC 2397)
? glob:// — 查找匹配的文件路徑模式
? phar:// — PHP 歸檔
? ssh2:// — Secure Shell 2
? rar:// — RAR
? ogg:// — 音頻流
? expect:// — 處理交互式的流
想要開啟文件包含的功能,首先要修改PHP的配置文件(PHP.ini)把文件里的功能選項(xiàng)開啟茎截。
在Linux中PHP.ini配置文件一般默認(rèn)安裝在?/etc目錄下苇侵。
下面是兩個(gè)功能選項(xiàng):
allow_url_fopen?:on?默認(rèn)開啟?該選項(xiàng)為on便是激活了?URL?形式的?fopen?封裝協(xié)議使得可以訪問?URL?對(duì)象文件等。
allow_url_include:off?默認(rèn)關(guān)閉企锌,該選項(xiàng)為on便是允許?包含URL?對(duì)象文件等