php://filter伪协议(总结)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

这篇文章主要是关于php://filter伪协议中的知识点总结分析了常见的用法

文章目录

php://filter伪协议总结

php://filter伪协议介绍

php://filterphp中独有的一种协议它是一种过滤器可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据且在读取和写入之前对数据进行一些过滤例如base64编码处理rot13处理等。官方解释为

php://filter 是一种元封装器设计用于数据流打开时的筛选过滤应用。这对于一体式all-in-one的文件函数非常有用类似 readfile()、 file() 和 file_get_contents()在数据流内容读取之前没有机会应用其他过滤器。

php://filter伪协议可以用于如下函数

include()

file()

file_get_contents()

readfile()

file_put_contents()

可以用于读取、写入文件等函数

php://filter伪协议使用方法

php://filter伪协议的一般使用方法为

php://filter/过滤器|过滤器/resource=要过滤的数据流

过滤器可以设置多个使用管道符 |分隔按照从左到右的方式依次使用相应的过滤器进行过滤处理例如

echo file_get_contents("php://filter/read=convert.base64-encode|convert.base64-encode/resource=data://text/plain,<?php phpinfo();?>");

上述代码对 <?php phpinfo();?> 进行了两次base64编码处理。

read可以省略会自动根据函数作用来决定read还是write。

我们使用了 data伪协议file_get_contents() 想要读取的内容变成了data伪协议输入的内容。

php://filter过滤器分类

根据 php://filter官方说明 php://filter协议过滤器 大致分为以下四类

1、字符串过滤器

2、转换过滤器

3、压缩过滤器

4、加密过滤器

filter字符串过滤器

每个过滤器都正如其名字暗示的那样工作并与内置的 PHP 字符串函数的行为相对应。

字符串过滤器以 string 开头常见的过滤器有 rot13touppertolowerstrip_tags

string.rot13

使用该过滤器也就是用 str_rot13() 函数处理所有的流数据。

echo file_get_contents("php://filter/read=string.rot13/resource=data://text/plain,abcdefg");
//输出 nopqrst

string.toupper

string.tolower

该过滤器就是将字符串进行大小写转换.

等同于strtolower()strtoupper() 函数

echo file_get_contents("php://filter/read=string.toupper/resource=data://text/plain,abcdefg");
//输出 ABCDEFG

echo file_get_contents("php://filter/read=string.tolower/resource=data://text/plain,ABCDEFG");
//输出 abcdefg

string.strip_tags

本特性已自 PHP 7.3.0 起废弃。强烈建议不要使用本特性。

使用此过滤器等同于用 strip_tags() 函数处理所有的流数据。可以用两种格式接收参数一种是和 strip_tags() 函数第二个参数相似的一个包含有标记列表的字符串一种是一个包含有标记名的数组。

strip_tags() — 从字符串中去除 HTML 和 PHP 标签

strip_tags对数据流进行strip_tags函数的处理该函数功能为剥去字符串中的 HTMLXML 以及 PHP 的标签简单理解就是包含有尖括号中的东西。

echo file_get_contents("php://filter/string.strip_tags/resource=flag.php");

//flag.php
<b>flag{abc}</b>
    
//输出flag{abc}

filter转换过滤器

主要含有三类分别是base64的编码转换、quoted-printable的编码转换以及iconv字符编码的转换。该类过滤器以convert转换开头。

convert.base64-encode

convert.base64-decode

将数据进行base64编码、解码

使用这两个过滤器等同于分别用 base64_encode()base64_decode() 函数处理所有的流数据。

echo file_get_contents("php://filter/read=convert.base64-encode/resource=data://text/plain,abc");
//输出YWJj    abc的base64编码

echo file_get_contents("php://filter/read=convert.base64-decode/resource=data://text/plain,YWJj");
//输出abc

convert.quoted-printable-encode

convert.quoted-printable-decode

使用此过滤器的 decode 版本等同于用 quoted_printable_decode() 函数处理所有的流数据。没有和 convert.quoted-printable-encode 相对应的函数。

quoted-printable-encode可译为可打印字符引用编码可以理解为将一些不可打印的ASCII字符进行一个编码转换转换成=后面跟两个十六进制数例如

echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://text/plain,666".chr(12));
//输出666=0C

//将ascii码为12的字符编码为=0C

quoted-printable-decode 与上述操作相反将 =后面跟上两个16进制数 转换为不可打印的ascii字符

echo file_get_contents("php://filter/convert.quoted-printable-decode/resource=data://text/plain,666=0A888");

输出666      // =0A 是 \n 的编码
888

convert.iconv.*

在激活 iconv 的前提下可以使用 convert.iconv.* 压缩过滤器 等同于用 iconv() 处理所有的流数据。

iconv过滤器 就是对输入输出的数据进行编码转换即将输入的字符串编码转换成输出指定的编码

写法

该过滤器不支持参数但可使用输入/输出的编码名称组成过滤器名称比如 :    
    
convert.iconv.<input-encoding>.<output-encoding> 
    或
convert.iconv.<input-encoding>/<output-encoding>  两种写法的语义都相同。    

<input-encoding>和<output-encoding> 就是编码方式有如下几种;

UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

例如

abcdefg 从编码 UCS-2LE 转换为 UCS-2BE

echo file_get_contents("php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=data://text/plain,abcdefg");
//输出 badcfe

就是两两字符顺序互换一下两个两个一组如果不是字符串2的倍数最后1个字符不会被输出

abcdefgh1234 从编码 UCS-4LE 转换为 UCS-4BE :

echo file_get_contents("php://filter/convert.iconv.UCS-4LE.UCS-4BE/resource=data://text/plain,abcdefgh1234");
//输出dcbahgfe4321

四个一组将每一组内的成员倒序排列如果不是字符串4的倍数最后几个字符不会被输出

filter压缩过滤器

虽然 压缩封装协议 提供了在本地文件系统中 创建 gzip 和 bz2 兼容文件的方法但不代表可以在网络的流中提供通用压缩的意思 也不代表可以将一个非压缩的流转换成一个压缩流。对此压缩过滤器可以在任何时候应用于任何流资源。

zlib.deflate压缩

include("php://filter/read=zlib.deflate/resource=test.php");

//test.php
abcdef

输出

image-20230107171528799

zlib.inflate解压

include("php://filter/read=zlib.inflate/resource=test.php");
//test.php内容为上面压缩后的内容
image-20230107171630762

bzip2.compress (压缩)

bzip2.decompress (解压)

bzip2.compressbzip2.decompress 工作的方式与上面讲的 zlib 过滤器相同

filter加密过滤器

加密过滤器特别适用于文件/数据流的加密。

本特性已自 PHP 7.1.0 起废弃。强烈建议不要使用本特性。

mcrypt.*

mdecrypt.*

mcrypt.*mdecrypt.* 使用 libmcrypt 提供了对称的加密和解密。这两组过滤器都支持 mcrypt 扩展库中相同的算法格式为 mcrypt.ciphername其中 ciphername 是密码的名字将被传递给 mcrypt_module_open()。有以下五个过滤器参数可用

mcrypt 过滤器参数

参数是否必须默认值取值举例
mode可选cbccbc, cfb, ecb, nofb, ofb, stream
algorithms_dir可选ini_get(‘mcrypt.algorithms_dir’)algorithms 模块的目录
modes_dir可选ini_get(‘mcrypt.modes_dir’)modes 模块的目录
iv必须N/A典型为 816 或 32 字节的二进制数据。根据密码而定
key必须N/A典型为 816 或 32 字节的二进制数据。根据密码而定

后记

如果您觉得这篇文章不错的话请多多点赞支持一下您的支持是我最大的动力

参考

php://filter 官方文档

PHP Filter伪协议Trick总结

php://filter的各种过滤器

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: php

“php://filter伪协议(总结)” 的相关文章