网安入门15-文件包含(伪协议总结)
php://[输入输出流]
跟**http://**一样,这是php的一个特定的协议格式,统称为伪协议,这是所有伪协议的父类
php:// 可用于以下目的:
- 读取来自用户输入的数据
- 写入数据到客户端浏览器
- 记录错误信息
php://filter
条件
- allow_url_fopen:off/on
- allow_url_include:off/on
作用
设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。
说明
php://filter可获取指定文件源码,如果再利用包含函数漏洞,php://filter流会被当作php文件执行,一般对其进行编码,使其不被执行,获取到编码后解码,从而达到任意文件的读取
用法
两个用法本质一样
- ?filename=php://filter/read=convert.base64-encode/resource=[文件名]
例http://127.0.0.1/include.php?filename=php://filter/read=convert.base64-encode/resource=phpinfo.php
- ?filename=php://filter/convert.base64-encode/resource=[文件名]
例http://127.0.0.1/include.php?filename=php://filter/convert.base64-encode/resource=phpinfo.php
php://input
条件
- allow_url_fopen:off/on
- allow_url_include:on
作用
可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分
说明
- POST提交PHP代码,造成任意代码执行,如写入文件(木马)。php://input可以访问请求的原始数据的只读流,即可以直接读取到POST上没有经过解析的原始数据。
- enctype=”multipart/form-data”的时候php://input是无效的。
用法
php://input + [POST DATA]执行在post体中的php代码
1 | http://127.0.0.1/include.php?file=php://input |
若有写入的权限,可以写入一句话木马
1 | http://127.0.0.1/include.php?file=php://input |
zip://
条件
- allow_url_fopen:off/on
- allow_url_include:off/on
作用
属于压缩流,php解压缩包的一个函数,不管后缀是什么,可修改为任意后缀像是jpg png gif,都会当做压缩包来解压。
说明
- PHP>=5.3.0,注意在windows”下测试要5.3.0<PHP<5.4才可以
#
在浏览器中要编码为%23
,否则浏览器默认不会传输特殊字符。
用法
?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名](#编码为%23)
压缩shell.php为shell.zip,压缩包重命名为shell.jpg,并上传到目标服务器(zip)http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\shell.jpg%23shell.php
phar://
条件
- allow_url_fopen:off/on
- allow_url_include:off/on
作用
与zip://类似,同样可以访问zip格式压缩包内容
说明
- PHP>=5.3.0;压缩包需要是zip协议压缩,rar不行
另外在 Black Hat 2018 大会上,研究人员公布了一款针对PHP应用程序的全新攻击技术:phar://协议对象注入技术,因为该利用点需要满足一定的条件才能利用,可以参考下面这篇文章,里面的demo也非常详细,留作以后专门研究一下。
利用 phar 拓展 php 反序列化漏洞攻击面
用法
?file=phar://[压缩文件路径]/[压缩文件内的子文件名]
压缩shell.php为shell.zip,压缩包重命名为shell.png,并上传到目标服务器(zip)http://127.0.0.1/include.php?file=phar://E:\phpStudy\PHPTutorial\WWW\shell.png/shell.php
data://
条件
- allow_url_fopen:on
- allow_url_include:on
作用
数据流封装器,和php:/相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;
说明
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
用法
- data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
- data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b