PHP伪协议
# PHP伪协议
# file://
条件
allow_url_fopen:on/offallow_url_include:on/off
作用
- 用于读取本地文件系统,不受
allow_url_fopen与allow_url_include的影响 include( ) /require( )/include_once()/require_once()参数可控的情况下,如导入为非.php文件,则仍按照php语法进行解析,这由include()函数所决定。
说明
file://文件系统是PHP使用的默认封装协议,展现了本地文件系统。当指定了一个相对路径(不以/、、\或 Windows盘符开头的路径)提供的路径将基于当前的工作目录。在很多情况下是脚本所在的目录,除非被修改了。使用CLI的时候,目录默认是脚本被调用时所在的目录。在某些函数里,例如fopen()和file_get_contents(), include_path 会可选地搜索,也作为相对的路径。
用法
/path/to/file.ext
relative/path/to/file.ext
fileInCwd.ext
C : /path/to/winfile.ext
C : \path\to\winfile.ext
\\smbserver\share\path\to\winfile.ext
file : ///path/to/file.ext
示例
file: //[文件的绝对路径和文件名]
http://127.0.0.1/include.php?file=file://E:\phpStudy\ PHPTutorial\WWW\phpinfo.php1file: //[文件的相对路径和文件名]
http://127.0.0.1/include.php?file=./phpinfo.php1file: //[http://网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.php1
# http://&https://协议
条件
allow_url_fopen:onallow_url_include:on
作用
- 作用:常规
URL形式,允许通过HTTP 1.0的GET方法,以只读访问文件或资源。 CTF中通常用于远程包含。
用法
- http: //example.com
- http: //example.com/file.php?var1=var1&var2=var2
- http: //user:password@exampLe.com
- https: //example.com
- https: //example.com/file.php?var1=var1&var2=var2
- https: //user:password@example.com
示例
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.php
# php://协议
条件
allow_url_fopen:on/offallow_url_include:仅php://inputphp://stdinphp://memoryphp://temp需要on
作用
php://访问各个输入/输出流I/O streams- 在
CTF中经常使用的是php://filter和php://input php://filter用于读取源码,php://input用于执行php代码。
说明
PHP提供了一些杂项输入/输出IO流,允许访问PHP的输入输出流、标准输入输出和错误描述符、内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
| 协议 | 作用 |
|---|---|
php://input | 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data"的时候php://input是无效的。 |
php://output | 只写的数据流,允许以print和echo—样的方式写入到输出缓冲区。 |
php://memory php://temp | (>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是php://memory总是把数据储存在内存中,而php://temp会在内存量达到预定义的限制后(默认是2MB)存入临时文件中。临时文件位置的决定和sys_get_temp_dir()的方式一致。 |
php://filter | (>=5.0.0)种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似readfile()、file()和file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。 |
# php://filter
说明
- 经常使用的一种伪协议,一般用于任意文件读取,有时也可以用于
getshell.在allow_url_fopen、allow_url_include都为OFF的情况下也可以使用.
参数
| 名称 | 描述 | 备注 |
|---|---|---|
| resource=<要过滤的数据流> | 指定了你要筛选过滤的数据流。 | 必选 |
| read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
| write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
| <;两个链的筛选列表> | 任何没有以read=或write= 作前缀的筛选器列表会视情况应用于读或写链。 |
例子
php://filter/[read/write]=string.[rot13/strip_tags/……]/resource=xxx
?file=php://filter/read=convert.base64-encode/resource=xxx.php
?file=php://filter/read=string.rot13/resource=xxx.php
# php://input
说明
用于执行POST数据中的PHP代码
注意
enctype= "multipart/form-data"的时候php://input是无效的
示例
POST数据:<?php phpinfo()?>
http://127.0.0.1/index.php?file=php://input
# data://
条件
allow_url_fopen:onallow_url_include:on
作用
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
用法
data://text/plain,<?php%20phpinfo()?>data://text/plain;base64,<?php%20phpinfo()?>
示例
data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>1data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b1
# zip://&bzip2://&zlib://
条件
allow_url_fopen:on/offallow_url_include:on/off
作用
zip://&bzip2://&zlib://均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx等等。
示例
zip://[压缩文件绝对路径]%23[压缩文件内的子文件名]压缩
phpinfo.txt为phpinfo.zip,压缩包重命名为phpinfo.jpg,并上传http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt1compress.bzip2: //file.bz2
压缩phpinfo.txt为 phpinfo.bz2并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz21compress.zlib://file.gz
压缩phpinfo.txt为phpinfo.gz并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz1
# phar://
作用
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
示例
http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
# dict://
条件
allow_url_fopen:onallow_url_include:on
说明
与gopher协议一般都出现在ssrf协议中,用来探测端口的指纹信息。同时也可以用它来代替gopher协议进行ssrf攻击。
用法
探测端口指纹
http://127.0.0.1/?url=dict://192.168.0.0:6379