伪协议
文件包含漏洞-伪协议的学习
1 | 文件包含函数包含的文件参数没有经过过滤或者严格的定义,并且参数可以被用户控制,就可能包含非预期的文件,如果文件中存在恶意代码,无论文件时什么样的后缀类型,文件内的恶意代码都会被解析执行,就导致了文件包含漏洞的产生。 |
伪协议常用于文件包含泄露之中
在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 | 名称 描述 |
只是读取,需要开启allow_url_fopen,不需要开启allow_url_include;
用法
1 | //base64 |
过滤器
1 | convert.quoted |
压缩过滤器
虽然 压缩封装协议 提供了在本地文件系统中 创建 gzip 和 bz2 兼容文件的方法,但不代表可以在网络的流中提供通用压缩的意思,也不代表可以将一个非压缩的流转换成一个压缩流。对此,压缩过滤器可以在任何时候应用于任何流资源。
Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。
zlib.* 压缩过滤器自 PHP 版本 5.1.0起可用,在激活 zlib的前提下。也可以通过安装来自 » PECL的 » zlib_filter包作为一个后门在 5.0.x版中使用。此过滤器在 PHP 4 中 不可用。
1 | Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 |
php://input
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。(不进行编码)
用法
1 | ?file=php://input |
file://伪协议
通过file伪协议可以访问本地文件系统,读取到文件的内容
不受allow_url_fopen与allow_url_include的影响
1 | file://[文件的绝对路径和文件名] |
phar://
是php解压缩的一个函数,不管后缀是什么,都会当做压缩包来解压,
用法:
1 | ?file=phar://压缩包/内部文件 |
注意 PHP>=5.3.0压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。
步骤:写一个一句话木马shell.php,然后用zip协议解压缩为shell.zip。然后将后缀改为png等其他格式
data://伪协议
两种形式
URL编码()
1 | data://text/plain,<?php phpinfo();?> |
其他编码
1 | data://text/plain;[编码类型],<?php phpinfo();?> |
注意浏览器不能识别+
解决办法
- 不写后面的?> 因为PHP里面其实不需要写后面的 前面的;号就已经说明结束了。如果没有;号就必须写?>作为结束。
- 添加空格改变base64编码。
- 将+号换成%2b
script
1 | <script language="php">eval($_POST[1])</script> |
过滤器
1 | convert.quoted |
主要是convert.iconv
1 | php://filter/convert.iconv.<input>.<output>/resource=flag.php |
支持一下几种字符编码
1 | UCS-4* |
压缩过滤器
虽然 压缩封装协议 提供了在本地文件系统中 创建 gzip 和 bz2 兼容文件的方法,但不代表可以在网络的流中提供通用压缩的意思,也不代表可以将一个非压缩的流转换成一个压缩流。对此,压缩过滤器可以在任何时候应用于任何流资源。
Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。
zlib.* 压缩过滤器自 PHP 版本 5.1.0起可用,在激活 zlib的前提下。也可以通过安装来自 » PECL的 » zlib_filter包作为一个后门在 5.0.x版中使用。此过滤器在 PHP 4 中 不可用。
1 | Note: 压缩过滤器 不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 |
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 |