文件包含支持的伪协议

文件包含支持的伪协议

  • 一、什么是伪协议?
  • 二、文件包含支持的伪协议用法
    • 1、php://
      • 1.1 php://input
      • 1.2 php://output
      • 1.3 php://filter
      • 1.4 其它php://伪协议
    • 2、file://
    • 3、data://
    • 4、phar://
    • 5、zip://
  • 三、总结


一、什么是伪协议?

PHP官方文档

  • 伪协议: 带有URL 风格的封装协议。
  • PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。
  • 封装:是php面向对象的其中一个特性,将多个可重复使用的函数封装到一个类里面,在使用时直接实例化该类的某一个方法,获得需要的数据。

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — 安全外壳协议 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

二、文件包含支持的伪协议用法

描述之前,我们先把php.ini的allow_url_fopen 和allow_url_include设置为On。以便对这些伪协议进行分析。

1、php://

php:// — 访问各个输入/输出流(I/O streams)

1.1 php://input

php://input:访问请求的原始数据的只读流。
注:当enctype=”multipart/form-data”时,php://input是无效的。

示例:

include会把参数’info’当作文件执行
文件包含支持的伪协议_第1张图片
正常情况下,除非输入的参数刚好是这个目录下的某个文件,
比如我有个名为alert.php的文件
文件包含支持的伪协议_第2张图片
否则就会报错
文件包含支持的伪协议_第3张图片
现在我们利用php://input协议
文件包含支持的伪协议_第4张图片
截取数据包
文件包含支持的伪协议_第5张图片
在最后面,我们加入要执行的代码
这里输入的实际上就是请求的数据,然后它被当作代码执行了。
文件包含支持的伪协议_第6张图片
放包
文件包含支持的伪协议_第7张图片
扩展

这里有道关于php://input的ctf题,我们提取部分代码进行分析。
链接
简单的代码示例:
file_get_contens($data):将文件内容以字符串形式输出
文件包含支持的伪协议_第8张图片

这里的data被当作文件读取,而实际上,后台并不能找到名为"a"的这个文件,所以会报错。

文件包含支持的伪协议_第9张图片
利用php://input绕过

现在我们输入的值为空,返回false

文件包含支持的伪协议_第10张图片

用burpsite进行抓包,在最后面输入我们要传进去的值“xxx”(因为根据源代码,只有data为xxx时,才会返回true)
文件包含支持的伪协议_第11张图片
放包
文件包含支持的伪协议_第12张图片
这个时候,后台得到的数据应该是这样子的
文件包含支持的伪协议_第13张图片
在这里插入图片描述
若是修改参数
文件包含支持的伪协议_第14张图片
则会发生和最初一样的报错,文件不存在
文件包含支持的伪协议_第15张图片
也就是说,file_get_contents("php://input")能够获取请求原始数据流。
按照函数的检测逻辑,"php://input"被当作了空的文件来读取,输出的自然也是空字符串。然后,当我们在burpsite上抓包,POST中输入data的时候,后台看见的代码应该是$a ="".$data
但是具体是否如此我也不太清楚,网上并没有找到准确的答案。
像这样的:
文件包含支持的伪协议_第16张图片

这样子也可以
文件包含支持的伪协议_第17张图片
文件包含支持的伪协议_第18张图片
文件包含支持的伪协议_第19张图片

经过测试,我发现还有其他一些php伪协议也可以被file_get_contents执行,例如:
php://stdout,php://stdin,php://stderr
php://output,php://memory,php://temp

1.2 php://output

  • php://output 只写的数据流
  • php://output允许你以 print 和 echo 一样的方式写入到输出缓冲区。

示例:
文件包含支持的伪协议_第20张图片
内容并没有被写入。因为php://input是只读流。
文件包含支持的伪协议_第21张图片
换成php://output,只写的数据流
文件包含支持的伪协议_第22张图片
文件包含支持的伪协议_第23张图片

所谓缓冲区就是,临时存放数据的地方。当我们重新访问时,它就会刷新;
当我们修改文件中的内容时,它也会刷新自己的内容。像这里的 $f 实际上并没有被创建到相对路径下,而是被放置在缓冲区。

1.3 php://filter

  • php://filter是一种元封装器,是PHP中特有的协议流,设计用于数据流打开时的筛选过滤应用,作用是作为一个“中间流”来处理其他流。

  • php://filter目标使用以下的参数作为它路径的一部分。复合过滤链能够在一个路径上指定。

名称 描述 备注
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符分隔 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符分隔。 可选
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
page=php://filter/read=convert.base64-encode/resource=../../../../../../phpstudy_pro\WWW\feng\php_output.php

在这里插入图片描述
得到:
PD9waHANCgkNCgkkZj1mb3BlbigicGhwOi8vb3V0cHV0IiwiYSIpOw0KCWZ3cml0ZSgkZiwidGhpcyBpcyBhIHNlbnRlbmNlIik7DQoJZmNsb3NlKCRmKTsNCj8+
进行base64解码
文件包含支持的伪协议_第24张图片
但是如果是有中文的文件,就不好读取了。base64对中文支持并不友好,需要对中文进行编码之后再转base64。这里我就不尝试了。读取的文件都是非中文的。

php://filter可用于读取包含有敏感信息的PHP等源⽂件,使用base64加密是了防止被浏览器当作XML语言解析,导致出错。

1.4 其它php://伪协议

文件包含支持的伪协议_第25张图片

2、file://

  • 常用于读取本地文件

示例:
在这里插入图片描述

文件包含支持的伪协议_第26张图片
在这里插入图片描述
文件包含支持的伪协议_第27张图片

3、data://

  • data://伪协议,是数据流封装器,和php://相似,都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过包含你输入的payload来实现目的。

格式:?file=data://text/plain,payload ?>
例1:
?page=data://text/plain,
文件包含支持的伪协议_第28张图片
例2:
?page=data://text/plain,
在这里插入图片描述例3:
文件包含支持的伪协议_第29张图片
如果对特殊字符进行了过滤,可以通过base64编码后再输入
?page=data://text/plain;base64,PD9waHAgZWNobyBwaHBpbmZvKCk7Pz4=
文件包含支持的伪协议_第30张图片

4、phar://

  • php解压缩包的一个函数,不管后缀是什么,都当作压缩包来解压。
  • 格式:
?file=phar://压缩包名/内部文件名
例:phar://x.zip/x.php
步骤:写一个一句话木马shell.php,然后用zip协议压缩为shell.zip,
再将后缀改为png等其他格式

文件包含支持的伪协议_第31张图片
文件包含支持的伪协议_第32张图片

注:php 版本大于等于5.3.0,压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。

5、zip://

文件包含支持的伪协议_第33张图片

源代码:
文件包含支持的伪协议_第34张图片
压缩(zip)
文件包含支持的伪协议_第35张图片
为了验证zip函数可以将任意文件当作压缩包来解压,我们修改后缀为bb.txt
文件包含支持的伪协议_第36张图片
访问(绝对路径)

文件包含支持的伪协议_第37张图片
这里貌似可以直接访问本地文件(但是phar不能)
文件包含支持的伪协议_第38张图片

更多的协议与相关测试,以后有时间再补充

三、总结

  • 文件包含的主要函数有:include()、require()、include_once()、require_once()等。
  • 文件包含支持的伪协议主要有:php://input、php://filter、data://、phar://、zip://等
  • 伪协议在文件包含漏洞上的使用能够帮助我们绕过一些检测机制(比如包含的文件必须是“file”开头之类的判别,又或者利用data伪协议写入一句话木马)。
  • 另外,这些协议的使用还有一些使用条件,我并没有写出来。
    大家可以自行去网上查找相关资料。

你可能感兴趣的:(Web漏洞,php,web安全)