php伪协议总结

https://www.cnblogs.com/zzjdbk/p/13030717.html

PHP伪协议,也称为PHP流协议,是PHP中用于访问各种资源的封装协议。具体来说,是PHP中用于统一流式接口访问不同资源的特殊协议。它们允许开发人员通过类似文件操作的函数(如fopen()等)处理网络资源、压缩文件、输入输出流等。

之所以被称为伪协议,是因为这些协议并非传统意义上的网络或系统协议,而是PHP内部实现的特殊资源访问机制。是PHP为了简化特定操作而设计的。

特征

  • 非标准协议

​ 不准寻HTTP,FTP等标准协议规范,而是PHP自定义的语法

  • 绕过常规文件操作

    允许开发者以类似文件操作的方式访问非文件资源(如内存流、输入输出流)

  • 上下文依赖

    仅在PHP运行时环境中生效。若将php://filter的URI直接粘贴到浏览器地址栏,浏览器会将其视为无效协议

file://协议

用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响(即在双off的情况下也能使用)

使用方法

1
file:// [文件的绝对路径和文件名]
1
http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

php://协议

PHP向用户提供的指定待打开文件的方式,是一个文件流

条件

不需要开启allow_url_fopen,仅php://input , php://stdin , php://memory , php://temp。 需要开启 allow_url_include

php://filter

读取源代码并进行base64编码输出,不然会直接当作php代码执行就看不见源代码内容了

在双off情况下也可以正常使用

参数

img

例子

1
http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php
img

注意file前后不要加空格

data://协议

https://www.php.net/manual/zh/wrappers.data.php

1
data:[<mediatype>][;base64],<data>

用法:data:// —数据

说明:数据流封装器

必需在双on才能使用

单独的?c=data://text/plain并没有仍和实际执行或展示数据的功能,它只是表达了数据传递的方式,需要后续指定数据内容,比如?c=data://text/plain,Hello%20World 就是传递纯文本 “Hello World”。

实例

  1. 打印data://的内容
1
2
3
4
<?php
// 打印 "I love PHP"
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
?>
  1. 获取媒体类型
1
2
3
4
5
6
7
<?php
$fp = fopen('data://text/plain;base64,', 'r');
$meta = stream_get_meta_data($fp);

// 打印 "text/plain"
echo $meta['mediatype'];
?>