0%

php://filter伪协议读取源码

php://filter 是什么?

 我的理解是,它是一个中间流处理器。就是说,我们 发送/接收 的数据先经过它的处理再发送给 内部/外部 。根据它的名字也不难判断,他本意是用来进行数据的过滤。
 它一般有以下可用的参数:

参数 描述 备注
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选

没有以read=write= 作为前缀的筛选器会视情况应用于写或读。
 我一般遇到的多是需要读的也就是read=,运用它的前提是要有 类似 include、require、include_once、require_once、file_get_contents、readfile 这些,就是会读取文件内容的。
 而写的话,一般就类似 file_put_contents 类似的函数会进行写操作的。

常用过滤器

 其实过滤器才是我们需要特别关注的东西,就像一次题目过滤了 base 和 string ,导致我们一系列过滤器无法使用,但经查阅资料是可替换的。

convert.base64

 这类过滤器是我以前最常用的过滤器,convert.* 是属于转换过滤器(Conversion Filters),
 convert.base64-encode ,它将我们读到的数据进行base64编码后返回,相当于执行了一个base64_encode() 。那么不难推测 convert.base64-decode 相当与执行一个 base64_decode()

convert.iconv.*

 这个过滤器需要 php 支持 iconv,而 iconv 是默认编译的,也就是默认支持。使用convert.iconv.*过滤器等同于用iconv()函数处理所有的流数据。
它有2中用法如:

1
2
3
convert.iconv.<input-encoding>.<output-encoding> 
or
convert.iconv.<input-encoding>/<output-encoding>

将读取到的内容从 input-encoding 转换为 output-encoding 返回。

iconv支持的编码

【详情参考官方手册】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

我们一般使用UCS-*这类编码作为output-encoding 就可以读到源码了。
 我们一般的页面使用的是utf-8编码(当然也不绝对)所以我们 将input-encodingutf -8即可。

string.rot13

 使用此过滤器等同于用 str_rot13()函数处理所有的流数据。
 string.rot13对字符串执行 ROT13 转换,ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母,同时忽略非字母表中的字符。因为总共是26个字母所以,编码和解码都使用相同的函数,传递 一个编码过的字符串作为参数,将得到原始字符串。

string.strip_tags

(PHP 4, PHP 5, PHP 7)(自PHP 7.3.0起已弃用此功能。)
使用此过滤器等同于用 strip_tags()函数处理所有的流数据。
 string.strip_tags从字符串中去除 HTML 和 PHP 标记,尝试返回给定的字符串 去除空字符、HTML 和 PHP 标记后的结果。它使用与函数 fgetss() 一样的机制去除标记。
这里需要特别注意:
HTML 注释和 PHP 标签也会被去除。

以上就是我对 php://filter 读取源码的一些理解和常用的姿势。 当然 php://filter 也可用来绕过 死亡exit。
【参考链接】


-------------本文结束感谢您的阅读-------------