了解了解php的伪协议
php伪协议就是php所支持的协议和封装协议,一种对数据流处理的方式合集。
php支持如下的伪协议方法。
file:// 访问本地文件系统
http:// 访问http(s)网址
ftp:// 访问ftp(s)urls
php:// 访问各个输入或输出流
zlib:// 压缩流
data:// 数据
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
逐一梳理各个协议。
1.php://
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、
标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操
作其他读取写入文件资源的过滤器。
php://stdin (允许访问输入流即读,当从外部读入流时可以看到) php://stdout php://stderr (允许访问输出流即写,当写出时可以看到)
php://input 是个可以访问请求的原始数据的只读流。因为它不依赖于特定的 php.ini 指令。
if(isset($user)&&(file_get_contents($user,’r’)===”the user is admin”)){
echo “hello admin!
“;
include($file); //class.php
}else{
echo “you are not admin ! “
代码举例,可以通过来读取post(即为读入流)的内容使得内容与 the user is admin. user=php://input访问原始数据的只读流(即为之前的post内容)
php://output允许写入写入缓冲区
php://filter可以利用进行任意文件的读取。设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,
类似 readfile()、 file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。
php://filter的参数有如下:
resource=要过滤的数据(必须的参数)
read=读链的筛选列表(可以设定多个过滤器和管道,通过|来分隔多个过滤器)
write=写链的筛选列表
过滤器种类
有字符串过滤器、转换过滤器、压缩过滤器、加密过滤器
字符过滤器:string.rot13,string.toupper(全部大写),string.tolower(全部小写),string.strip_tags(去除空字符、HTML 和 PHP 标记后的结果)
转换过滤器:
convert.base64-encode & convert.base64-decode(就是调用base64加解密函数)
压缩过滤器:
zlib.deflate(压缩), zlib.inflate (解压)
2.phar://archive.[zip/jpg/png…]/file.txt,可以将后缀为任意形式的文件,只要是zip压缩的都可以进行解压(文件上传+文件包含场景中的神器)
如果文件上传后可以利用文件包含实现代码执行的话,文件上传中的后缀名过滤基本上一点用都没有了,我们其实可以上传任意后缀名的压缩文件,
压缩文件里面包含着我们的任意文件,然后在文件包含的时候使用phar伪协议将我们的文件从压缩包里面提取出来。
zip://archive.zip#file.txt与上同理在url中书写时要将#替换成%23,因为在url中#后面的内容是不传输的。