php://filter伪协议(总结)
前言
这篇文章主要是关于php://filter伪协议中的知识点总结,分析了常见的用法
文章目录
php://filter伪协议总结
php://filter伪协议介绍
php://filter
是php
中独有的一种协议,它是一种过滤器,可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如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,");
上述代码对 进行了两次base64编码处理。
read可以省略,会自动根据函数作用来决定read还是write。
我们使用了 data伪协议
将 file_get_contents()
想要读取的内容变成了data伪协议输入的内容。
php://filter过滤器分类
根据 php://filter官方说明 ,php://filter协议
的过滤器 大致分为以下四类:
字符串过滤器
转换过滤器
压缩过滤器
加密过滤器
filter字符串过滤器
每个过滤器都正如其名字暗示的那样工作并与内置的 PHP 字符串函数的行为相对应。
字符串过滤器以 string
开头,常见的过滤器有 rot13
、toupper
、tolower
、strip_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");//输出 ABCDEFGecho 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
函数的处理,该函数功能为剥去字符串中的 HTML
、XML
以及 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> (两种写法的语义都相同)。
就是编码方式,有如下几种;
UCS-4*UCS-4BEUCS-4LE*UCS-2UCS-2BEUCS-2LEUTF-32*UTF-32BE*UTF-32LE*UTF-16*UTF-16BE*UTF-16LE*UTF-7UTF7-IMAPUTF-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.phpabcdef
输出:
zlib.inflate(解压)
include("php://filter/read=zlib.inflate/resource=test.php");//test.php内容为上面压缩后的内容
bzip2.compress (压缩)
bzip2.decompress (解压)
bzip2.compress
和bzip2.decompress
工作的方式与上面讲的zlib
过滤器相同
filter加密过滤器
加密过滤器特别适用于文件/数据流的加密。
本特性已自 PHP 7.1.0 起废弃。强烈建议不要使用本特性。
mcrypt.*
mdecrypt.*
mcrypt.*
和 mdecrypt.*
使用 libmcrypt 提供了对称的加密和解密。这两组过滤器都支持 mcrypt 扩展库中相同的算法,格式为 mcrypt.ciphername
,其中 ciphername
是密码的名字,将被传递给 mcrypt_module_open()。有以下五个过滤器参数可用:
mcrypt 过滤器参数
参数 | 是否必须 | 默认值 | 取值举例 |
---|---|---|---|
mode | 可选 | cbc | cbc, cfb, ecb, nofb, ofb, stream |
algorithms_dir | 可选 | ini_get(‘mcrypt.algorithms_dir’) | algorithms 模块的目录 |
modes_dir | 可选 | ini_get(‘mcrypt.modes_dir’) | modes 模块的目录 |
iv | 必须 | N/A | 典型为 8,16 或 32 字节的二进制数据。根据密码而定 |
key | 必须 | N/A | 典型为 8,16 或 32 字节的二进制数据。根据密码而定 |
后记
如果您觉得这篇文章不错的话,请多多点赞支持一下,您的支持是我最大的动力!
参考
php://filter 官方文档
PHP Filter伪协议Trick总结
php://filter的各种过滤器
来源地址:https://blog.csdn.net/qq_61839115/article/details/128593214
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341