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

news2025/1/6 20:49:17

文章目录

    • php://filter伪协议总结
      • php://filter伪协议介绍
      • php://filter伪协议使用方法
      • php://filter过滤器分类
      • filter字符串过滤器
        • string.rot13
        • string.toupper
        • string.tolower
        • string.strip_tags
      • filter转换过滤器
        • convert.base64-encode
        • convert.base64-decode
        • convert.quoted-printable-encode
        • convert.quoted-printable-decode
        • convert.iconv.*
      • filter压缩过滤器
        • zlib.deflate(压缩)
        • zlib.inflate(解压)
        • bzip2.compress (压缩)
        • bzip2.decompress (解压)
      • filter加密过滤器
        • mcrypt.*
        • mdecrypt.*
    • 参考
      • [php://filter 官方文档](https://www.php.net/manual/zh/filters.php)
      • [PHP Filter伪协议Trick总结](https://blog.csdn.net/gental_z/article/details/122303393#:~:text=php%3A%2F%2Ffilter%20%E6%98%AF%20php%20%E4%B8%AD%E7%8B%AC%E6%9C%89%E7%9A%84%E4%B8%80%E7%A7%8D%E5%8D%8F%E8%AE%AE%EF%BC%8C%E5%AE%83%E6%98%AF%E4%B8%80%E7%A7%8D%E8%BF%87%E6%BB%A4%E5%99%A8%EF%BC%8C%E5%8F%AF%E4%BB%A5%E4%BD%9C%E4%B8%BA%E4%B8%80%E4%B8%AA%E4%B8%AD%E9%97%B4%E6%B5%81%E6%9D%A5%E8%BF%87%E6%BB%A4%E5%85%B6%E4%BB%96%E7%9A%84%E6%95%B0%E6%8D%AE%E6%B5%81%E3%80%82,%E9%80%9A%E5%B8%B8%E4%BD%BF%E7%94%A8%E8%AF%A5%E5%8D%8F%E8%AE%AE%E6%9D%A5%E8%AF%BB%E5%8F%96%E6%88%96%E8%80%85%E5%86%99%E5%85%A5%E9%83%A8%E5%88%86%E6%95%B0%E6%8D%AE%EF%BC%8C%E4%B8%94%E5%9C%A8%E8%AF%BB%E5%8F%96%E5%92%8C%E5%86%99%E5%85%A5%E4%B9%8B%E5%89%8D%E5%AF%B9%E6%95%B0%E6%8D%AE%E8%BF%9B%E8%A1%8C%E4%B8%80%E4%BA%9B%E8%BF%87%E6%BB%A4%EF%BC%8C%E4%BE%8B%E5%A6%82%20base64%20%E7%BC%96%E7%A0%81%E5%A4%84%E7%90%86%EF%BC%8C%20rot13%20%E5%A4%84%E7%90%86%E7%AD%89%E3%80%82)
      • 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典型为 8,16 或 32 字节的二进制数据。根据密码而定
key必须N/A典型为 8,16 或 32 字节的二进制数据。根据密码而定

参考

php://filter 官方文档

PHP Filter伪协议Trick总结

php://filter的各种过滤器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kotlin】空安全 ① ( Kotlin 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )

文章目录一、Kotlin 的空安全机制二、变量可空性1、默认变量不可赋空值2、声明可空类型变量一、Kotlin 的空安全机制 Java 中的空指针问题 : 在 Java 语言 编写的程序中 , 出现最多的崩溃就是 NullPointerException 空指针异常 , 该异常是 运行时 才爆出的 , 在 代码编写时 以…

冰冰学习笔记:C++11的新特性

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

k8s入门教程

文章导读 kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群&…

创建自己的docker镜像

dockerfile案例1导入dockerfiel以及java文件导入后第一步docker build -t javaweb:1.0 .docker build -t &#xff08;名称以及对应的版本&#xff09;javaweb:1.0 .&#xff08;空格之后的一个点表示从当前目录开始&#xff09;导入成功之后运行容器即可docker run --name web…

二十七、linux系统详解

一、Linux基础篇 1. Linux目录结构 ⑴ 基本介绍: linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 深刻理解linux树状文件目录是非常重要的&#xff0c;这里我给大家说明一下。 记住一…

Markdown生成目录结构的方法

参考文章&#xff1a;https://www.cnblogs.com/abc-x/p/13470575.htmlmarkdown生成目录结构的方法&#xff1a;示例&#xff1a;project│ README.md│ file001.txt │└───folder1│ │ file011.txt│ │ file012.txt│ ││ └───subfolder1│ │ file111.txt│ │ fil…

【Linux多线程编程】5. 线程锁(2)——死锁、读写锁

前言 上篇文章【Linux多线程编程】4. 线程锁&#xff08;1&#xff09;——互斥锁 我们介绍了线程同步的其中一种方式——互斥锁&#xff0c;互斥锁也可以理解为独占锁&#xff0c;只要有一个线程拿到该锁&#xff0c;其他的线程想要获取只能阻塞等待。但互斥锁的使用不当也可…

【云原生】Ceph 在 k8s中应用

文章目录一、概述二、Ceph Rook 介绍三、通过Rook在k8s中部署Ceph1&#xff09;下载部署包2&#xff09;部署 Rook Operator3&#xff09;创建 Rook Ceph 集群4&#xff09;部署Rook Ceph 工具5&#xff09;部署Ceph Dashboard6&#xff09;检查6&#xff09;通过ceph-tool工具…

VirusTotal智能搜索itw查找从github下载的恶意Android样本

1. Introduction ITW是in the wild的缩写&#xff0c;VirusTotal提供了itw这个搜索关键词&#xff0c;可以搜到从某个url&#xff08;部分url&#xff09;上下载到的样本。 作者写过的其他VirusTotal智能搜索用法的文章见参考1和2. 2. itw使用 比如为了查找从github下载的恶…

Day852.Thread-Per-Message模式 -Java 性能调优实战

Thread-Per-Message模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Thread-Per-Message模式的内容。 Thread-Per-Message 模式&#xff0c;简言之就是为每个任务分配一个独立的线程。 并发编程领域的问题总结为三个核心问题&#xff1a; 分工同步互斥 其中&…

client-go源码学习(三):Indexer、SharedInformer

本文基于Kubernetes v1.22.4版本进行源码学习&#xff0c;对应的client-go版本为v0.22.4 3、Informer机制 4&#xff09;、Indexer Indexer中有Informer维护的指定资源对象的相对于etcd数据的一份本地缓存&#xff0c;可通过该缓存获取资源对象&#xff0c;以减少对Kubernete…

计算Java对象大小(附实际例子分析)

对象大小如何计算 对象大小包括俩部分的内容&#xff0c;对象头和对象内容。&#xff08;图片源于网络&#xff09; 对象头 此处假设是64位的JVM 对象地址&#xff0c;占4个字节。对象标记&#xff0c;占8个字节&#xff0c;包括锁标记&#xff0c;hashcode, age 等。数组…

python 如何使用 pandas 在 flask web 网页中分页显示 csv 文件数据

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 python 分页 pandas 数据处理 flask web 框架 jinja 模版 三、菜鸟实战 初始化 Flask 框架&#xff0c;设置路由 jinja 模版 渲染列表数据 分页请求数据 显示详情页数据示例 运行结果 运行截图 …

[oeasy]python0040_换行与回车的不同_通用换行符_universal_newlines

换行回车 回忆上次内容 区分概念 terminal终端 主机网络中 最终的 端点 TeleTYpewriter 电传打印机终端硬件 shell 终端硬件基础上的 软件壳子 Console 控制台 主机旁边 的 控制面板 存储文件 的 时候 我 在文件里 打了回车\n系统 将0x0a存入字节 进文件换行 自动就有 回车…

航空客运订票系统(C语言,软件用的DEV)

这两天整理之前的作业代码&#xff0c;把自己一点一点敲出来的系统又看了一下&#xff0c;挑几个发出来供大家参考。想要源码、报告可以找我啦&#xff0c;代码的注释之前写的都是非常详细的&#xff01; 但是不是无偿的啦&#xff08;不坑&#xff0c;一杯奶茶喽&#xff0c;不…

Java逃逸分析(附实际例子分析)

Java逃逸分析 1. 什么是Java逃逸分析 我们知道对象一般是在堆上生成的&#xff0c;但这并不是绝对的。特例就是今天要说的逃逸分析。 JVM 在分析代码以后&#xff0c;发现一个对象在声明之后&#xff0c;只有在它当前声明的这个函数中调用&#xff0c;那么它就会将这个对象在…

《微SaaS创富周刊》第3期:GPT-3\ChatGPT、Stable Diffusion等AI模型驱动的微SaaS创意盘点

大家新年好&#xff01;第3期《微SaaS创富周刊》问世啦&#xff01;本周刊面向独立开发者、早期创业团队&#xff0c;报道他们主要的产品形态——微SaaS如何变现的最新资讯和经验分享等。所谓微SaaS&#xff0c;就是“针对利基市场的SaaS”&#xff0c;特点是一般由个人或者小团…

网络爬虫的危害与防御方法

爬虫程序是一种计算机程序&#xff0c;旨在通过执行自动化或重复性任务来模仿或替代人类的操作。爬虫程序执行任务的速度和准确性比真实用户高得多。爬虫程序在互联网上扮演着各种各样的角色&#xff0c;超过一半的网络流量是由爬虫程序产生的。有些爬虫程序非常有用&#xff0…

v-if和v-show的区别?使用场景?v-if状态改变调用钩子函数的示例

文章目录1、v-show与v-if的共同点2、v-show与v-if的区别3、v-show与v-if的使用场景4、附属到组件和普通元素时的情况4.1、v-show4.2、v-if5、具体实现的效果5.1 查看是否渲染5.2 查看调用的钩子函数6、钩子函数实现的过程分析1、v-show与v-if的共同点 v-show和v-if的作用效果是…

共享模型之管程(五)

1.多线程设计模式 1.1.同步模式之保护性暂停 1.1.1.定义 1>.即Guarded Suspension,用在一个线程等待另一个线程的执行结果的场景中; 2>.使用场景 ①.有一个结果(数据)需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject; ②.如果有结果(数据)不断从一个…