目录
一、伪协议介绍
1、php://协议
2、php://filter伪协议
3.php://input(读取POST数据)
4、file伪协议
5、phar://伪协议(读取压缩包文件内容)
6、压缩文件伪协议
6.1.zip://[压缩文件绝对路径]%23压缩文件内的子文件名
6.2.compress.bzip2://file.bz2(同样支持任意后缀名)
6.3.compress.zlib://file.gz(同样支持任意后缀名)
7、data协议
8、http://和https://协议
一、伪协议介绍
PHP伪协议,也是php支持的协议和封装协议。
常见的有:
- file:// 访问本地文件系统
- php:// 访问各个输入/输出流
- data:// 数据
- zip:// 压缩流 不过有些伪协议需要allow_url_fopen和allow_url_include的支持。
- allow_url_fopen On/Off 允许或禁止打开URL文件
- allow_url_include On/Off 允许或禁止引用URL文件
1、php://协议
条件:
allow_url_fopen:off/on
allow_url_include :仅php://input php://stdin php://memory php://temp 需要on
作用:
- php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,
- php://filter用于读取源码,php://input用于执行php代码。
说明
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
2、php://filter伪协议
条件
allow_url_fopen=on/off
allow_url_include=on/off
只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include
说明:
元封装器,设计用于"数据流打开”时的"筛选过滤”应用,对本地磁盘文件进行读写
①输出进行base64加密后的信息
?file=php://filter/read=convert.base64-encode/resource=xx.php
②获得将base64加密后的信息后,再将其解密,得出原信息
3.php://input(读取POST数据)
条件
allow_url_fopen=on/off
allow_url_include=on
说明
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的
4、file伪协议
file://伪协议用作是展现本地文件系统。 CTF中一般用来读取本地文件或者执行php脚本。 绝对路径和相对路径或者网络路径(http://127.0.0.1/info.php)都可以。不过网络路径就需要allow_url_fopen和allow_url_include都为On。
tips: include()/require()/include_once()/require_once()的参数可控的情况下,如果导入的文件为非.php文件,仍会按照PHP语法进行解析,这是include()函数所决定的。
例:使用file://伪协议去包含本地的phpinfo.php和flag.txt
<?php
$file = $_GET['file'];
include $file;
?>
payload:
?file=file://E:\phpinfo.php
?file=../flag.txt
?file=http://127.0.0.1/flag.txt
5、phar://伪协议(读取压缩包文件内容)
条件
allow_url_fopen: off/on
allow_url_include: off/on (均不受影响)
注:php 版本大于等于5.3.0,压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。
?file=phar://压缩包名/内部文件名
例:phar://x.zip/x.php
6、压缩文件伪协议
zip:// & bzip2:// & zlib:// 协议 zip://、bzip2://、zlib://都属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可以修改为任意后缀:jpg、png、gif、xxx等。
6.1.zip://[压缩文件绝对路径]%23压缩文件内的子文件名
?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
例:压缩phpinfo.txt为phpinfo.zip,将zip改为xxxx,包含里面的phpinfo.txt
<?phpinclude ($_GET['file']);
payload:
?file=zip://D:\phpstudy_pro\WWW\php-audit\fake_protocol\phpinfo.xxxx%23phpinfo.txt
6.2.compress.bzip2://file.bz2(同样支持任意后缀名)
?file=compress.bzip2://E:\phpinfo.xxx
6.3.compress.zlib://file.gz(同样支持任意后缀名)
?file=compress.zlib://E:\phpinfo.xxx
7、data协议
需要allow_url_include和allow_url_fopen都为On
data://伪协议是数据流封装器,传递相应格式的数据。 通常可以用来执行PHP代码。
用法:
data://text/plain,
data://text/plain;base64,
例:
<?php
$file = $_GET['file'];
include $file;
?file=data://text/plain,<?php%20phpinfo();?>
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
8、http://和https://协议
远程包含需要allow_url_fopen和allow_url_include都为On。
允许通过HTTP 1.0的GET方法,以只读的方式访问文件或者资源。 CTF中通常用于远程包含。
?file=http:/127.0.0.1/phpinfo.txt