压缩流(zlib://)

compress.zlib://compress.bzip2://gzopen()bzopen() 是相等的。并且可以在不支持 fopencookie 的系统中使用。

用于读取压缩包的内容

Zlib:// Bzip2:// Zip://
compress.zlib://file.gz compress.bzip2://file.bz2 zip://archive.zip#dir/file.txt

例:

1
2
3
4
5
6
7
8
9
<?php
$fp = fopen('compress.zip://./foo.zip#bar.txt', 'r');
if( $fp ){
while( !feof($fp) ){
echo fread($fp, 8192);
}
fclose($fp);
}
?>

使用技巧:

  1. 配合phar流,读取phar包内的1.txt文件

    1
    compress.zlib://phar://pic/test.jpg/1.txt

输入/输出流(php://)

php:// — 访问各个输入/输出流(I/O streams)

提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

php://input

可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。

而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype=”multipart/form-data” 的时候 php://input 是无效的。

php://output

是一个只写的数据流, 允许你以 printecho 一样的方式 写入到输出缓冲区。

php://filter

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

php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。

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

例:

1
2
3
4
index.php?file1=php://filter/resource=file.txt
//读取file.txt文件内容
index.php?file1=php://filter/read=convert.base64-encode/resource=file.txt
//读取file.txt并以base64方式解码

归档流(phar://)

phar的本质是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,是phar反序列化攻击手法最核心的地方。

例:

1
2
phar://upload_file/phar.phar
//读取phar压缩包的同时,部分文件函数会触发对phar的反序列化,形成漏洞进而利用

数据流(data://)

用于打印数据

例:

1
2
data://text/plain;base64,SSBsb3ZlIFBIUAo=
//打印base64解码后的text数据