PHP伪协议filter详解,php://filter协议过滤器

「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》

在这里插入图片描述

php://filter

  • 一、访问数据流
  • 二、过滤数据流
  • 三、多个过滤条件
  • 四、过滤并写入数据流
  • 五、过滤器
    • 1、string.rot13
    • 2、string.toupper
    • 3、string.tolower
    • 4、convert.base64-encode
    • 5、convert.iconv.*

php:// 用来访问输入和输出流(I/O streams)。

输入/输出流也就是「数据流」,数据流可以是某个文件(xx.php)或某个url(http://www.baidu.com)。

php://filter 可以在访问数据流之前进行「过滤」,并指定过滤方式。

php://filter 有4个可用参数:

名称描述
resource=<要过滤的数据流>这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>该参数可选。可以设定一个或多个过滤器名称
write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称
<;两个链的筛选列表>任何没有以 read=write= 作前缀 的筛选器列表会视情况应用于读或写链。

提示:read/write参数不是必须的,可以直接使用过滤器,比如 php://filter/convert.base64-encode/resource=hello.php

一、访问数据流

直接「读取」数据源的内容,resource 参数必须位于 php://filter 的末尾,并指定需要过滤筛选的数据流。

1)读取「url形式」的数据流。

<?php
# 指定源文件,实际上没有应用过滤,会直接输出 http://www.baidu.com网页的内容
# 等同于readfile('http://www.baidu.com');
readfile('php://filter/resource=http://www.baidu.com');

因为没指定过滤条件弹了几条告警,不影响执行结果,不用管。

在这里插入图片描述

2)读取「文件形式」的数据流。

<?php
# 指定源文件,实际上没有应用过滤,会直接输出 hello.php文件的内容
# 等同于 include('hello.php');
include('php://filter/resource=hello.php');

同样因为没指定过滤条件弹了几条告警,不影响执行结果,不用管。

在这里插入图片描述

二、过滤数据流

读取数据源之前,添加「过滤条件」

1)以「大写字母」读取 http://www.baidu.com页面的全部内容

<?php
readfile("php://filter/read=string.toupper/resource=http://www.baidu.com");

在这里插入图片描述

2)以「小写字母」读取 hello.php文件的全部内容

<?php
include("php://filter/read=string.tolower/resource=hello.php");

在这里插入图片描述

  1. hello.php文件的内容「base64加密」后读取出来。
    include()包含的文件,默认会执行文件中的代码,但加密后的内容不会被执行,而是直接输出在页面中,复制后解密就能拿到被包含文件的内容。
<?php
include("php://filter/read=convert.base64-encode/resource=hello.php");

在这里插入图片描述

三、多个过滤条件

同时使用「多个过滤条件」时,使用管道符 | 分隔。

1)base64加密并且转换为大写

<?php
include('php://filter/read=convert.base64-encode|string.toupper/resource=hello.php');

按照「从左到右」的顺序过滤,过滤条件的顺序可能会影响过滤的结果,比如:先转换大写再过滤的话,输出的结果就会变成小写的base64编码。

在这里插入图片描述

四、过滤并写入数据流

write 参数,过滤指定字符,并将过滤后的结果「输出」到指定文件中。

1)过滤字符,并输出到 result.txt文件中。

<?php
file_put_contents('php://filter/write=string.tolower/resource=result.txt','hello text');

在这里插入图片描述

五、过滤器

1、string.rot13

string.rot13 ,PHP4.3.0及以后版本,对数据流的内容进行「rot13编码」,等于用str_rot13() 函数编码。

ROT13(otate by 13 places)也叫回转13位,是一种替换式密码。

ROT13会把每一个字母替换成13位之后的字母,也就是把a换成n,b换成o,以此类推;如果超过了26个字母的范围,就会从开头重新开始。

ROT13转换对照表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

常用方式:rot13编码读取文件内容后,复制页面输出的编码后的内容,手动用str_rot13()函数解码。

# rot13编码后读取 hello.php文件的内容
include('php://filter/read=string.rot13/resource=hello.php');

# 手动复制编码后的结果,输出rot13解码后的内容。
print str_rot13("<?cuc
rpub 'uryyb.cuc文件的内容:uryyb grfg';");

在这里插入图片描述

2、string.toupper

string.toupper,PHP5.0.0及以后版本,将数据流转换成「大写」,类似于 strupper() 函数。

需要注意的是,string.tuupper不是直接将文件内容变成大写,而是先执行文件内容,再将执行后的结果转换成大写。

# string.touper过滤器将 hello.php文件内容转换成大写
include('php://filter/read=string.toupper/resource=hello.php');

echo "\n";
# 手动复制 hello.php文件内容,并使用strtoupper()转换成大写
echo strtoupper("<?php
echo 'hello.php文件的内容:hello test';");

在这里插入图片描述

3、string.tolower

string.tolower,PHP5.0.0及以后版本,将数据流转换成「小写」,类似 strtolower()函数。

和 string.toupper,也是先执行文件的内容,再将执行后的结果转换成小写。

4、convert.base64-encode

1)convert.base64-encode,对数据流的内容进行「base64编码」,相当于 base64_encode()函数。

hello.php文件

<?php
echo 'hello.php文件的内容:hello test';

filter.php文件

<?php
include('php://filter/read=convert.base64-encode/resource=hello.php');

对 hello.php文件内容进行base64编码

在这里插入图片描述

2)编码后的内容可以使用 base64_decode()函数解码

print base64_decode('PD9waHANCmVjaG8gJ2hlbGxvLnBocOaWh+S7tueahOWGheWuue+8mmhlbGxvIHRlc3QnOw0KDQoNCg0KDQo=');

在这里插入图片描述

5、convert.iconv.*

convert.iconv.*,将数据流的内容按照「指定字符编码」来转换,使用格式有两种:

格式一:.分隔

convert.iconv.<input-encoding>.<output-encoding> 

格式二:/分隔

convert.iconv.<input-encoding>/<output-encoding>

比如,convert.iconv.utf-8*.utf-16* 的意思就是把文件的字符编码从 utf-8* 转换为 utf-16*

支持的字符编码有:

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*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
SJIS-mac (alias: MacJapanese)
SJIS-Mobile#DOCOMO (alias: SJIS-DOCOMO)
SJIS-Mobile#KDDI (alias: SJIS-KDDI)
SJIS-Mobile#SOFTBANK (alias: SJIS-SOFTBANK)
UTF-8-Mobile#DOCOMO (alias: UTF-8-DOCOMO)
UTF-8-Mobile#KDDI-A
UTF-8-Mobile#KDDI-B (alias: UTF-8-KDDI)
UTF-8-Mobile#SOFTBANK (alias: UTF-8-SOFTBANK)
ISO-2022-JP-MOBILE#KDDI (alias: ISO-2022-JP-KDDI)
JIS
JIS-ms
CP50220
CP50220raw
CP50221
CP50222
ISO-8859-1*
ISO-8859-2*
ISO-8859-3*
ISO-8859-4*
ISO-8859-5*
ISO-8859-6*
ISO-8859-7*
ISO-8859-8*
ISO-8859-9*
ISO-8859-10*
ISO-8859-13*
ISO-8859-14*
ISO-8859-15*
ISO-8859-16*
byte2be
byte2le
byte4be
byte4le
BASE64
HTML-ENTITIES (alias: HTML)
7bit
8bit
EUC-CN*
CP936
GB18030
HZ
EUC-TW*
CP950
BIG-5*
EUC-KR*
UHC (alias: CP949)
ISO-2022-KR
Windows-1251 (alias: CP1251)
Windows-1252 (alias: CP1252)
CP866 (alias: IBM866)
KOI8-R*
KOI8-U*
ArmSCII-8 (alias: ArmSCII8)

粉丝福利

评论区留言即可参与抽奖,下图9本书中任选一本。

在这里插入图片描述

618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华
社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多 个 IT
开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

electron 快速创建一个本地应用

参考官方文档流程 快速入门 | Electron 建议先全局安装electron&#xff0c;npm install -g electron 开发过程中可以在本地开发安装 使用electron快速创建一个web页面 &#xff0c;参考官方demo 实例 electron-quick-start 第一步&#xff1a; mkdir my-electron-app &am…

Linux

Linux 摘要写在前面1.Linux介绍2.Linux基本概念与命令3.Shell编程4.桌面操作系统框架5.GTK图形编程6.QT图形编程7.DBUS8.GDB9.Wine开发10.高可用存储技术11.高可用网络技术12.云计算 摘要 本篇博客参考中科方德国产操作系统的培训课程&#xff0c;对其主要内容进行总结&#x…

超越密码:网络安全认证的未来

你的物理现实的数字对应物正在惊人地增长。虽然肯定会有积极的结果&#xff0c;但随着互联网的发展&#xff0c;与之相关的风险也在迅速增加。在讨论网络安全风险管理时&#xff0c;首先想到的是密码。但当出现诈骗、网络钓鱼等威胁时&#xff0c;这还不够。 那么&#xff0c;…

大数据分析与机器学习:技术深度与实例解析【上进小菜猪大数据系列】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 大数据分析与机器学习已成为当今商业决策和科学研究中的关键组成部分。本文将深入探讨大数据技术的背景和原则&#xff0c;并结合实例介绍一些常见的大数据分析和机器学习技术。 …

Redux的基础操作和思想

什么是Redux? Redux是JavaScript应用的状态容器&#xff0c;提供可预测的状态管理! Redux除了和React一起用外&#xff0c;还支持其它框架;它体小精悍(只有2kB&#xff0c; 包括依赖)&#xff0c;却有很强大的插件扩展生态! Redux提供的模式和工具使您更容易理解应用程序中的…

与用户同行!2023卡萨帝开启高端生活方式新时代

6月20日&#xff0c;2023思享荟暨卡萨帝品牌升级发布会在重庆国际博览中心举行。在经历了高端产品引领、高端品牌引领、高端场景引领后&#xff0c;卡萨帝启动全新品牌升级&#xff0c;持续与用户同行&#xff0c;开启高端生活方式引领的新时代。 现场&#xff0c;海尔智家副总…

量化交易:止盈策略与回测

我们买基金或股票的时候通常用最简单的策略进行决策&#xff1a;低买高卖&#xff0c;跌的多了就加仓拉低持有成本&#xff0c;达到收益率就卖出。 那么如何用代码表示这个策略呢&#xff1f;首先定义交易信号则是&#xff1a;0.5%时买入&#xff0c;目标止盈线是1.5%&#xf…

ELFK日志分析系统并使用Filter对日志数据进行处理

目录 一、 FilebeatELK 部署Filebeat 节点上操作 二、Filtergrok 正则捕获插件内置正则表达式调用自定义表达式调用 mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、 FilebeatELK 部署 Node1节点&#xff08;2C/4G&#xff09;&#xff1a;node1/192.168.15…

Django rest framework基本知识

使用pycharm生成Django项目后&#xff0c;会生成工程目录和app目录 工程目录下5个文件&#xff0c;settings.py是全局配置相关的 urls.py是路有相关的 app相关的目录 models.py 数据库ORM对应的模型类 serializers.py 序列化与反序列化处理 views.py 根据request进行…

手工测试没有前途,自动化测试会取代手工测试?

在测试行业&#xff0c;一个一直被讨论的问题就是&#xff1a;手工测试没有前途&#xff0c;自动化测试会取代手工测试&#xff1f; 首先说结论&#xff1a;自动化测试不会取代手工测试&#xff0c;这完全是两个维度的事情。为什么不会呢&#xff1f;我们需要从本源上说起。 什…

DINO-DETR匈牙利匹配与加噪过程学习记录

今天再来回顾一下DINO中匈牙利匹配与损失函数部分&#xff0c;该部分大致与DETR相似&#xff0c;却又略有不同。 为了查看数据方便&#xff0c;博主将num_query改为20&#xff0c;max_select值也为20。 匈牙利匹配过程 首先是数据送入匈牙利匹配中进行标签匹配过程了。 获取…

【Android自动化测试】Ui Automator技术(以对QQ软件自动发说说为例)

文章目录 一、引言二、了解&#xff08;Android官方文档&#xff09;1、UiDevice 类2、UI Automator API3、UI Automator 查看器 三、使用1、依赖2、代码 一、引言 描述&#xff1a;UI Automator 是一个界面测试框架&#xff0c;适用于整个系统上以及多个已安装应用间的跨应用…

react---react router 5 基本使用

目录 1.路由介绍 2.路由使用 3.路由组件和一般组件 4.Switch 单一匹配 5.解决二级路由样式丢失的问题 6.路由精准匹配和模糊匹配 7.Redirect路由重定向 1.路由介绍 路由是根据不同的 URL 地址展示不同的内容或页面&#xff0c;在 SPA 应用中&#xff0c;大部分页面结果…

理解Web3公链共识算法的原理与机制

Web3时代带来了去中心化、透明和安全的数字经济发展&#xff0c;而公链的共识算法是实现这一目标的关键。共识算法确保了公链网络中的节点对交易和状态的一致性达成共识&#xff0c;同时防止了恶意行为和双重支付等问题。本文将深入探讨Web3公链共识算法的核心原理与机制。 1.共…

【Uniapp】小程序携带Token请求接口+无感知登录方案2.0

本次改进原文《【Uniapp】小程序携带Token请求接口无感知登录方案》&#xff0c;在实际使用过程中我发现以下bug&#xff1a; 若token恰好在用户访问接口时到期&#xff0c;就会直接查询为空&#xff0c;不反映token过期问题&#xff08;例如&#xff1a;弹窗显示订单查询记录…

【数据库数据恢复】SQL Server数据表结构损坏的数据恢复案例

数据库故障&分析&#xff1a; SQL server数据库数据无法读取。 经过初检&#xff0c;发现SQL server数据库文件无法被读取的原因是因为底层File Record被截断为0&#xff0c;无法找到文件开头&#xff0c;数据表结构损坏。镜像文件的前面几十M空间和中间一部分空间被覆盖掉…

饶派杯XCTF车联网安全挑战赛Reverse GotYourKey

文章目录 一.程序逻辑分析二.线程2的operate方法解析三.找出真flag 一.程序逻辑分析 onCreate方法中判断SDK版本是否>27 然后创建两个线程 第一个线程是接受输入的字符串并发送出去 第二个线程用于接受数据 线程1,就是将字符串转为字节数组发送出去 线程2,作为服务端接受…

springboot动态加载json文件

resources下面的配置文件&#xff0c;application文件修改启动会实时加载新的内容 其他的文件属于静态文件&#xff0c;打包后会把文件打入jar里面&#xff0c;修改静态文件启动不会加载新的内容 Resource areacode nre FileSystemResource("config" File.separa…

STM32——07-STM32定时器Timer

定时器介绍 软件定时 缺点&#xff1a;不精确、占用 CPU 资源 void Delay500ms () //11.0592MHz { unsigned char i , j , k ; _nop_ (); i 4 ; j 129 ; k 119 ; do { do { while ( -- k ); } while ( -- j ); } while ( -- i ); } 定时器工…

Springboot--关于自定义stater的yml无法提示

1.前言 在以前在搭建架构的时候就碰到了类似的情况&#xff0c;在使用EnableConfigurationProperties注解的时候&#xff0c;不管怎样&#xff0c;在项目中引入了该starter的情况下依然不发自动的提示properties里面的属性。 Data ConfigurationProperties(prefix "pro…