標籤:alt 存在 系統 引擎 遠程檔案 文字檔 使用 注意 這不
遠程檔案包含(Remote File Inclusion),簡稱RFI,與其對應的是本地檔案包含(Local File Inclusion,LFI),它們都是通過PHP的包含函數即:require(),require_once(),include()和include_once()來使用。
一般情況下,使用者通過包含函數將具有特定功能的函數或類包含到當前指令碼中,是沒有什麼問題的。但是有時候,為了方便,需要動態包含檔案,這就會留下一些攻擊漏洞。
通常情況下,LFI攻擊威脅不大,因為本機伺服器上的檔案是比較確定的,攻擊者想要上傳帶有攻擊性代碼的檔案也不是件容易的事。RFI攻擊才是我們需要防範的事。那麼,RFI攻擊是如何?的呢?
首先,提供一個存在RFI漏洞的程式碼範例(index.php):
<?php// 存在RFI漏洞的程式碼片段$file = $_GET[‘file‘];include $file;?>
指令碼中使用了利用GET方法來動態包含檔案,例如:在index.php同級目錄下存在include.php檔案,我們就可以通過訪問類似URL“127.0.0.1/lab/index.php?file=include.php”來包含include.php檔案,隨後,伺服器將解析include.php指令碼,將產生的HTML代碼傳送給瀏覽器執行。
目前看來,還沒出現什麼安全問題,因為還僅僅只是包含本地檔案。如果是包含遠程檔案,問題就來了,因為攻擊者是可以任意編碼遠程檔案的。
需要說明的是,進行RFI攻擊需要同時具備三個條件(被攻擊機器):
- allow_url_fopen = On (預設開啟)
- allow_url_include = On (預設關閉)
- 被包含的變數前沒有目錄的限制
同時滿足了這三個條件,就等於為攻擊者開啟了大門。為了清楚地理解,下面給出一個LFI攻擊的執行個體。(說明:在本地搭建一個存在RFI漏洞的環境,通過包含一個遠程主機上的檔案來攻擊這個本地主機)
第一步:設定php.ini檔案,將“allow_url_fopen ”和“allow_url_include”都開啟,重啟Apache。
第二步:建立存在RFI漏洞的指令檔,如上面的index.php。
第三步:在遠程主機上建立一個帶有攻擊性代碼的文字檔hack.txt(Just test),注意這個檔案不能被伺服器解析,如不能為PHP指令檔。因為只是示範,文字檔被執行就能滿足示範效果了。hack.txt檔案內容如下:
hahaha,You are hacked. <?php echo $_GET[‘a‘]; ?>
將文字檔放在一個擁有登入許可權的主機根目錄下,文字檔在互連網上的位置為:http://yourhost/hack.txt。
第四步:將攻擊檔案的URL帶入include,進行攻擊,:
可以看到,文字檔被執行。接著,我們使用其中的PHP代碼,:
可以看到,文字檔中的PHP代碼被成功執行,現在只是一個示範,但是已經能說明RFI攻擊過程。如果攻擊者在檔案中放入了系統命令,後果將不堪設想。
上面提到,攻擊檔案不能是PHP檔案,所以有些經驗豐富的開發人員會考慮將被包含檔案的副檔名寫死,如:
<?php// 存在RFI漏洞的程式碼片段$file = $_GET[‘file‘];include $file.‘.php‘;?>
這樣,通過以上方法包含遠程檔案,系統就會警告找不到被包含檔案,從而避免攻擊。
這種方法確實能起到一定作用,但對那些有經驗的攻擊者來說,這不是問題。我們知道PHP引擎是有C來實現的,C中Null 字元就是字串結束符,因此可以使用Null 字元將副檔名截斷,實現RFI攻擊。
理解了RFI攻擊原理,防禦也就簡單了。在配置層面,保持PHP的預設設定,將“allow_url_include”關閉;在代碼層面,如果一定要動態包含檔案,最好明確規定包含哪些檔案,進行白名單比對。同時,也可以在包含函數中加入目錄限制。
【轉載】PHP本地檔案包含和遠程檔案包含漏洞