基本概念

PHP伪协议在CTF中经常使用到,这里写个简单的Demo小结一下,主要对file://、php://filter、php://input、data://、zip://、compress.bzip2://、compress.zlib://、phar://等协议进行简单的Demo介绍分析。

简单说一下,file://用于访问本地文件系统读取本地文件;php://访问各个输入/输出流(I/O streams),其中php://filter用于读取文件内容,php://input可以访问请求的原始数据的只读流、同时可将post请求中的数据作为PHP代码执行;zip://,bzip2://,zlib://均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名;data://即写入数据;phar://即PHP归档。

简单文件包含Demo代码

demo.php

1
2
3
4
5
6
7
<?php
echo '<h3>Hi, just a test for php pseudo protocol. :)</h3>';
echo '<p>u can input a param called "file" by GET method.</p>';
if(isset($_GET["file"])){
@include($_GET["file"]);
}
?>

正常访问,提示可以通过GET传入一个file参数包含文件:

文件包含Demo

file://协议

file://协议用于访问本地文件系统,在CTF中通常用来读取本地文件且不受allow_url_fopen与allow_url_include的影响。

注意:该协议的路径只能输入绝对路径,输入相对路径是不生效的。

先输入一个文本文件,可以读到该文件内容,比如CTF经常遇到的flag:

file://读取txt文件

输入php或JS文件,file://协议会执行该PHP文件里的代码而不是显示该内容,因而该协议不适用于获取文件内容源代码(而常用php://filter伪协议):

file://读取php文件

file://读取js文件

php://协议

php://访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

不需要开启allow_url_fopen,仅php://input、php://stdin、 php://memory和php://temp需要开启allow_url_include。

php://filter协议

php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。在CTF中主要用于读取文件内容。不需要开启allow_url_fopen和allow_url_include。

查看之前的test.js文件与PHP文件:

php://filter读取js文件

php://filter读取php文件

php://input协议

php://input可以访问请求的原始数据的只读流,在CTF中多用于执行php代码。

不需要开启allow_url_fopen和allow_url_include。

php://input写入phpinfo

php://input写入system

data://协议

data://即数据,在CTF中主要用于写入代码并包含该代码到当前页面中。

必须同时开启allow_url_fopen和allow_url_include。

使用形式如下:

1
2
3
4
data:text/plain;base64, <script>alert('xss')</script>
data://text/plain;base64, <script>alert('xss')</script>
data:text/plain;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=
data://text/plain;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=

data://协议写入phpinfo

data://协议写入js代码

zip://、bzip2://、zlib://协议

zip://、bzip2://、zlib://均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

不需要开启allow_url_fopen和allow_url_include。

zip://协议

zip://压缩流,不需要开启allow_url_fopen和allow_url_include。

使用方法:

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

文件路径必须为绝对路径。

上传一个包含PHP代码文件的zip包,只要zip://访问该协议即触发文件包含漏洞、将任意文本文件中的内容当作PHP代码执行:

demo

当然可以修改上传的zip文件后缀名为其他如图片后缀,根据特定情况可绕过一些上传文件类型的限制:

demo

zlib://协议

zlib://压缩流,不需要开启allow_url_fopen和allow_url_include。

使用方法:

compress.zlib://file

文件无绝对路径限制。

demo

demo

bzip2://协议

bzip2://压缩流,不需要开启allow_url_fopen和allow_url_include。

使用方法:

compress.bzip2://file

文件无绝对路径限制。

可是这里怎么测试都不成功,通过phpinfo查看bzip2://是enable且文件类型和文件路径都进行尝试,PHP版本也换了几个,还是无法显示phpinfo信息,哪位知道原因的大佬请指点一下 : )

phar://协议

phar://即PHP归档,常用于解析phar文件内容,最近的CTF中多用于phar反序列化漏洞利用。反序列化漏洞具体的利用可参考phar反序列化漏洞

demo