PHP編程語(yǔ)言中為我們提供了四個(gè)常見(jiàn)文件包含函數(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ù)通過(guò)動(dòng)態(tài)變量的范式引入需要包含的文件
·用戶(hù)能夠控制該動(dòng)態(tài)變量
·要保證php.ini中allow_url_fopen和allow_url_include要為On
注:PHP中只要文件內(nèi)容符合PHP語(yǔ)法規(guī)范,包含時(shí)不管擴(kuò)展名是什么都會(huì)被PHP解析,?
?若文件內(nèi)容不符合PHP語(yǔ)法規(guī)范則會(huì)暴漏其源碼。
php.ini配置文件:allow_url_fopen=off?時(shí)不可以包含遠(yuǎn)程文件,只有開(kāi)啟了才可以包含。Php4存在遠(yuǎn)程&本地,php5僅存在本地包含。
漏洞分類(lèi)
本地文件包含:可以包含本地文件,在條件允許時(shí)甚至能執(zhí)行代碼
讀敏感文件,讀PHP文件
包含日志文件GetShell
上傳圖片馬,然后包含從而GetShell
包含/proc/self/envion文件GetShell
包含data:或php://input等偽協(xié)議
若有phpinfo則可以包含臨時(shí)文件
遠(yuǎn)程文件包含:可以直接執(zhí)行任意代碼
php協(xié)議類(lèi)型:
? file:// — 訪(fǎng)問(wèn)本地文件系統(tǒng)
? http:// — 訪(fǎng)問(wèn) HTTP(s) 網(wǎng)址
? ftp:// — 訪(fǎng)問(wèn) FTP(s) URLs
? php:// — 訪(fǎng)問(wèn)各個(gè)輸入/輸出流(I/O streams)
? zlib:// — 壓縮流
? data:// — 數(shù)據(jù)(RFC 2397)
? glob:// — 查找匹配的文件路徑模式
? phar:// — PHP 歸檔
? ssh2:// — Secure Shell 2
? rar:// — RAR
? ogg:// — 音頻流
? expect:// — 處理交互式的流
想要開(kāi)啟文件包含的功能,首先要修改PHP的配置文件(PHP.ini)把文件里的功能選項(xiàng)開(kāi)啟。
在Linux中PHP.ini配置文件一般默認(rèn)安裝在?/etc目錄下。
下面是兩個(gè)功能選項(xiàng):
allow_url_fopen?:on?默認(rèn)開(kāi)啟?該選項(xiàng)為on便是激活了?URL?形式的?fopen?封裝協(xié)議使得可以訪(fǎng)問(wèn)?URL?對(duì)象文件等。
allow_url_include:off?默認(rèn)關(guān)閉,該選項(xiàng)為on便是允許?包含URL?對(duì)象文件等