PHP伪协议
/基本概念
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 |
|
正常访问,提示可以通过GET传入一个file参数包含文件:
file://协议
file://协议用于访问本地文件系统,在CTF中通常用来读取本地文件且不受allow_url_fopen与allow_url_include的影响。
注意:该协议的路径只能输入绝对路径,输入相对路径是不生效的。
先输入一个文本文件,可以读到该文件内容,比如CTF经常遇到的flag:
输入php或JS文件,file://协议会执行该PHP文件里的代码而不是显示该内容,因而该协议不适用于获取文件内容源代码(而常用php://filter伪协议):
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://input协议
php://input可以访问请求的原始数据的只读流,在CTF中多用于执行php代码。
不需要开启allow_url_fopen和allow_url_include。
data://协议
data://即数据,在CTF中主要用于写入代码并包含该代码到当前页面中。
必须同时开启allow_url_fopen和allow_url_include。
使用形式如下:
1 | data:text/plain;base64, <script>alert('xss')</script> |
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代码执行:
当然可以修改上传的zip文件后缀名为其他如图片后缀,根据特定情况可绕过一些上传文件类型的限制:
zlib://协议
zlib://压缩流,不需要开启allow_url_fopen和allow_url_include。
使用方法:
compress.zlib://file
文件无绝对路径限制。
bzip2://协议
bzip2://压缩流,不需要开启allow_url_fopen和allow_url_include。
使用方法:
compress.bzip2://file
文件无绝对路径限制。
可是这里怎么测试都不成功,通过phpinfo查看bzip2://是enable且文件类型和文件路径都进行尝试,PHP版本也换了几个,还是无法显示phpinfo信息,哪位知道原因的大佬请指点一下 : )
phar://协议
phar://即PHP归档,常用于解析phar文件内容,最近的CTF中多用于phar反序列化漏洞利用。反序列化漏洞具体的利用可参考phar反序列化漏洞。