PHP伪协议的学习

关于PHP的伪协议有以下:

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

限制

allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等

进行伪协议访问的时候可能会被这两个功能拦截。

演示代码

$file";

file://协议

file:// — 访问本地文件系统,不受allow_url_fopen与allow_url_include的影响

用于本地文件包含 路径需要绝对路径

我不知道这个协议到底有啥用 还不是需要include这个函数的支持 那么直接可以包含了 也不需要file协议了呀!! 知道的人希望可以告知下

php://协议

1.php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

这个方法很常用,我们都拿它来进行任意的文件读取发现源码中遗漏的东西
并且不受allow_url_fopen和allow_url_include影响

名称									描述
resource=<要过滤的数据流>				这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>					该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
write=<写链的筛选列表>				该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
<;两个链的筛选列表>					任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

常用的方法:
php://filter/convert.base64-[encode/decode]/resource=xxx

http://127.0.0.1/code/1.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php

使用的过滤器是convert.base64-encode.它的作用就是读取phpinfo.php的内容进行base64编码后输出。可以用于读取程序源代码经过base64编码后的数据

2.php://input

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。

allow_url_include 需要on
注:当enctype=”multipart/form-data”时,php://input是无效的。

这个协议我们通常都是用来php代码执行getshell、或者是进行变量覆盖的时候使用

zip://, bzip2://, zlib://协议

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用
allow_url_fopen :off/on
allow_url_include:off/on

使用方法
zip://archive.zip#dir/file.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

ps:自己没复现成功 不知道是版本的原因还是啥

data://协议

allow_url_fopen :on
allow_url_include:on

http://127.0.0.1/muma.php?file=data://text/plain,
http://127.0.0.1/muma.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

PHP伪协议的学习_第1张图片

其他的协议 大家可以自己去了解下 我就介绍这几个常用的协议哈

你可能感兴趣的:(PHP)