php伪协议
1.php://协议
- 条件:
allow_url_fopen:off/on
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 的输入输出流、标准输入输出和错误描述符,
内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
2.php://filter伪协议
- 条件
allow_url_fopen=on/off
allow_url_include=on/off
只是读取
,需要开启 allow_url_fopen,不需要开启 allow_url_include - 说明:
元封装器,设计用于"数据流打开”时的"筛选过滤”应用,对本地磁盘文件进行读写
①输出进行base64
加密后的信息
?file=php://filter/convert.base64-encode/resource=xx.php
或
?file=php://filter/read=convert.base64-encode/resource=xx.php
②获得将base64加密后的信息后,再将其解密,得出原信息
3.php://input(读取POST数据)
- 条件
allow_url_fopen=on/off
allow_url_include=on
- 说明
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。enctype=”multipart/form-data”
的时候 php://input 是无效
的
注
:查看当前运行的是哪个php.ini
2,3需要将php可执行加入环境变量, 如果没有加,那么请使用php可执行文件所在位置的完整路径代替
- 打印出phpinfo();,找到Loaded Configuration File那一行
- 命令行输入
php -i |grep php.ini
(php -i
其实就是输出phpinfo();) php -r “phpinfo();” |grep php.ini
4.file://伪协议(读取文件内容)
- 条件
allow_url_fopen=on/off
allow_url_include=on/off
(均不受影响)
打ctf中常用于读取本地文件
?file=file://C:\Windows\System32\drivers\etc\hosts
5.phar://伪协议(读取压缩包文件内容)
- 条件
allow_url_fopen: off/on
allow_url_include: off/on (均不受影响)
注
:php 版本大于等于5.3.0
,压缩包需要是zip
协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。
- 格式
?file=phar://压缩包名/内部文件名
例:phar://x.zip/x.php
6.zip://伪协议
zip伪协议和phar协议类似,但是用法不一样(url不同)
- 条件
allow_url_fopen: off/on
allow_url_include: off/on (均不受影响) - 格式
?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
例: zip://D:\phpstudy\WWW\x.zip%23shell.php #->%23
7.data://伪协议(读取文件)
(可以直接达到执行php代码的效果)
和php://input很像,php://input
以post
提交数据那样提交数据,
data://
是以get方式
提交数据,也是可以执行提交的脚本
- 格式
?file=data://text/plain,<?php%20phpinfo()?>
如果对特殊字符进行了过滤,可以通过base64编码后再输入
data://text/plain;base64,base64加密的代码
可配合php命令执行漏洞,实现对一些数据的获取
如:<?php system("ls")?>