文件包含漏洞-伪协议的学习

1
2
文件包含函数包含的文件参数没有经过过滤或者严格的定义,并且参数可以被用户控制,就可能包含非预期的文件,如果文件中存在恶意代码,无论文件时什么样的后缀类型,文件内的恶意代码都会被解析执行,就导致了文件包含漏洞的产生。
文件包含漏洞可能会造成服务器的网页篡改、网站挂马、远程控制服务器、安装后门等危害。

伪协议常用于文件包含泄露之中

在php种能够造成文件包含的函数有include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile

include函数

可以防在PHP脚本的任意位置,一般放在流程的处理部分中。当PHP脚本执行到include指定引入的文件时,才将它包含并尝试执行。这种方式可以把程序执行时的流程进行简单化。当第二次遇到相同文件时,PHP还是会重新就是一次,include相对于require的执行效率下降很多,同时在引入文件中包含用户自定义函数时,PHP在解释过程中会发生函数重复定义问题。include载入成功后,返回1,否则返回false。

require函数

require函数一般放在PHP脚本的最前面,PHP执行前就会读入require指定引入的文件,包含并尝试执行因为的脚本文件。require的工作方式是提高PHP的执行效率,当它在同一个网页解释过一次时便不会解释。但同样的,当PHP中使用循环或条件语句来引入文件时,需要用到include。require载入成功返回1,失败无返回值。

include_once和require_once函数

与require和include相同,不过它们会检查目标之前是否已经导入过,如果导入过了,那么便不会再次重复引入其同样的内容。

highlight_file函数

highlight_file() 函数对文件进行语法高亮显示。认为伪协议是文件

show_source函数

highlight_file() 函数对文件进行语法高亮显示。

file_get_contents函数

file_get_contents() 函数把整个文件读入一个字符串中。和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。

file函数

file() 函数把整个文件读入一个数组中。与 file_get_contents() 类似,不同的是 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败,则返回 false。

PHP伪协议的了解

PHP带有很多内置URL风格的内置协议,

php://filter(本地磁盘文件进行读取)

元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。

php://filter 参数

php://filter可以作为一个中间流来处理其他流。

1
2
3
4
5
名称	描述
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

只是读取,需要开启allow_url_fopen,不需要开启allow_url_include;

用法

1
2
3
4
5
6
//base64
?filename=php://filter/convert.base64-encode/resource=xxx.php
//多了一个read=效果一样
?filename=php://filter/read=convert.base64-encode/resource=flag.php
//过滤器
php://filter/convert.iconv.<input>.<output>/resource=flag.php

过滤器

1
2
convert.quoted
convert.quoted-printable-encode和convert.quoted-printable-decode使用此过滤器的decode版本等同于用 quoted_printable_decode()函数处理所有的流数据。没有和convert.quoted-printable-encode相对应的函数。convert.quoted-printable-encode支持以一个关联数组给出的参数。除了支持和convert.base64-encode一样的附加参数外,convert.quoted-printable-encode还支持布尔参数binary和 force-encode-first。convert.base64-decode只支持line-break-chars参数作为从编码载荷中剥离的类型提示。

压缩过滤器
虽然 压缩封装协议 提供了在本地文件系统中 创建 gzip 和 bz2 兼容文件的方法,但不代表可以在网络的流中提供通用压缩的意思,也不代表可以将一个非压缩的流转换成一个压缩流。对此,压缩过滤器可以在任何时候应用于任何流资源。

Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。

zlib.* 压缩过滤器自 PHP 版本 5.1.0起可用,在激活 zlib的前提下。也可以通过安装来自 » PECL的 » zlib_filter包作为一个后门在 5.0.x版中使用。此过滤器在 PHP 4 中 不可用。

1
2
3
4
5
Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 

zlib.* 压缩过滤器自 PHP 版本 5.1.0起可用,在激活 zlib的前提下。也可以通过安装来自 » PECL的 » zlib_filter包作为一个后门在 5.0.x版中使用。此过滤器在 PHP 4 中 不可用。

?file=compress.zlib://flag.php

php://input

可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。(不进行编码)

用法

1
2
?file=php://input
[POST data]

file://伪协议

通过file伪协议可以访问本地文件系统,读取到文件的内容

不受allow_url_fopen与allow_url_include的影响

1
2
3
file://[文件的绝对路径和文件名]
linux系统环境下
?file=file:///etc/passwd

phar://

是php解压缩的一个函数,不管后缀是什么,都会当做压缩包来解压,

用法:

1
2
?file=phar://压缩包/内部文件
?file=phar://xxx.png/shell.php

注意 PHP>=5.3.0压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。

步骤:写一个一句话木马shell.php,然后用zip协议解压缩为shell.zip。然后将后缀改为png等其他格式

data://伪协议

两种形式

URL编码()

1
data://text/plain,<?php phpinfo();?>

其他编码

1
2
data://text/plain;[编码类型],<?php phpinfo();?>
[对应的编码]

注意浏览器不能识别+

解决办法

  1. 不写后面的?> 因为PHP里面其实不需要写后面的 前面的;号就已经说明结束了。如果没有;号就必须写?>作为结束。
  2. 添加空格改变base64编码。
  3. 将+号换成%2b

script

1
<script language="php">eval($_POST[1])</script>

过滤器

1
2
convert.quoted
convert.quoted-printable-encode和convert.quoted-printable-decode使用此过滤器的decode版本等同于用 quoted_printable_decode()函数处理所有的流数据。没有和convert.quoted-printable-encode相对应的函数。convert.quoted-printable-encode支持以一个关联数组给出的参数。除了支持和convert.base64-encode一样的附加参数外,convert.quoted-printable-encode还支持布尔参数binary和 force-encode-first。convert.base64-decode只支持line-break-chars参数作为从编码载荷中剥离的类型提示。

主要是convert.iconv

1
php://filter/convert.iconv.<input>.<output>/resource=flag.php

支持一下几种字符编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

压缩过滤器

虽然 压缩封装协议 提供了在本地文件系统中 创建 gzip 和 bz2 兼容文件的方法,但不代表可以在网络的流中提供通用压缩的意思,也不代表可以将一个非压缩的流转换成一个压缩流。对此,压缩过滤器可以在任何时候应用于任何流资源。

Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。

zlib.* 压缩过滤器自 PHP 版本 5.1.0起可用,在激活 zlib的前提下。也可以通过安装来自 » PECL的 » zlib_filter包作为一个后门在 5.0.x版中使用。此过滤器在 PHP 4 中 不可用。

1
2
3
4
5
Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 

zlib.* 压缩过滤器自 PHP 版本 5.1.0起可用,在激活 zlib的前提下。也可以通过安装来自 » PECL的 » zlib_filter包作为一个后门在 5.0.x版中使用。此过滤器在 PHP 4 中 不可用。

?file=compress.zlib://flag.php

在这里插入图片描述

dict://

介绍:

dict 协议是一个在线网络字典协议,这个协议是用来架设一个字典服务的。不过貌似用的比较少,所以网上基本没啥资料(包括谷歌上)。可以看到用这个协议架设的服务可以用 telnet 来登陆,说明这个协议应该是基于 tcp 协议开发的。像 mysql 的服务,因为也是基于 tcp 协议开发,所以用 dict 协议的方式打开也能强行读取一些 mysql 服务的返回内容

注意:该协议往往与ssrf漏洞像结合,用来探测内网端口

dict协议功能:

1、探测内网主机
2、探测端口的开放情况和指纹信息
3、执行命令

端口探测案例

以ctfhub的ssrf漏洞–端口扫描为例在这里插入图片描述

先输入下面的payload,然后抓包进行端口探测

1
/?url=dict://127.0.0.1:8000

在这里插入图片描述

在这里插入图片描述

参考文章:

1
https://blog.csdn.net/woshilnp/article/details/117266628