PHP文件包含伪协议
支持伪协议的函数
include()
require()
include_once()
require_once()
highlight_file ()
show_source ()
readfile()
file_get_contents ()
fopen()
file()
php://input
使用条件:
- php版本>=5.2
- allow_url_fopen == off/on
- allow_url_include == on
php://filter
使用条件:
- php版本>=5.2
- allow_url_fopen == on/off
- allow_url_include == on/off
使用方法:
读:php://filter/read=convert.base64-encode/resource=文件名
写:php://filter/write=convert.base64-encode/resource=文件名
过滤器:
1.字符串过滤器(string.*)- string.rot13:进行rot13加解密
- string.toupper:字母转大写
- string.tolower:字母转小写
- string.strip_tags(PHP 7.3.0 起废弃):去除HTML和PHP中的内容
2.转换过滤器(convert.*)
- base64-encode & convert.base64-decode:进行base64加密解密
- convert.quoted-printable-encode & convert.quoted-printable-decode:在字符串后面加=0A
- convert.iconv.* :进行编码直接转换
语法:convert.iconv.<input-encoding>.<output-encoding> 或 convert.iconv.<input-encoding>/<output-encoding>
可转换编码:
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
详细见:https://www.php.net/manual/en/mbstring.supported-encodings.php
3.压缩过滤器(zlib.* & bzip2.*)
*zlib.deflate & zlib.inflate 进行压缩和解压 如: php://filter/zlib.deflate|zlib.inflate/resource=flag.php
*bzip2.compress & bzip2.decompress 进行压缩和解压,用来读取bzip2(.bz2)文件
4.加密过滤器(PHP 7.1.0 起废弃) - mcrypt.*
- mdecrypt.*
compress.zlib://
等同于gzopen(),用来读取gzip(.gz)文件,也可以读取非gzip格式的文件。
compress.bzip2://
等同于bzopen(),用来读取bzip2(.bz2)文件。
file://
使用条件:
- php版本>=5.2
- allow_url_fopen == on/off
- allow_url_include == on/off
4.data://
使用条件:
- php版本>=5.2
- allow_url_fopen == on
- allow_url_include == on
语法
data://text/plain;base64,poc
data://text/plain,poc
phar://
PHP5.3之后的版本支持类似 Java的jar包,名为phar,用来将多个PHP文件打包为一个文件。此外,还可以和tar、zip相互转化,同时可以使用phar://伪协议解析这类文件。这一特性给我们留下了可以利用的空间。
用法:
phar://压缩包路径/压缩内容
列如:
我们有a.php和b.php将他们打包成一个1.zip文件,将1.zip文件上传至服务器当然如果上传有限制,如只能上传图片后缀文件,只需将1.zip改成1.jpg这类,phar://1.jpg同样会将其当作压缩文件处理。
以下是文件包含代码
<?php include($_GET[1])?>
我们上传phar://1.zip/a.php,就可以执行a.php,同理也可以执行b.php。1.zip改为1.jpg同样也可以