Loading

PHP伪协议漏洞利用笔记

一、简介

  本文列举了一些个人写CTF题时遇到的部分伪协议的使用方法(用于是学习CTF时遇到的,这里也仅列举了个人所知晓使用情况,并不代表全部功能),并简单演示一下使用效果。

  PHP伪协议是什么,按照个人粗糙的理解(并不是准确的定义,只是简单的类比方便个人理解)。PHP伪协议是一些用于对文件处理的语句,在一些如include()的处理文件的函数处理目标文件前对目标进行一些修改、转化。官方文档的描述如下:

  (可能这些描述还是不容易理解,所以用具体使用展示一下伪协议是如何发挥作用的)

二、具体协议

php://input  使用条件(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On

该协议获取数据包的消息正文的内容作为变量的值,官方定义如下:

 使用效果:

  include()函数的参数是GET数组中键为code的变量的值,这里用GET方式传入值,即传入一个值为php://input的code变量,而php://input的意思即获取请求数据包中的消息正文(也就是请求数据包的第三部分,这里11行空行后面的内容)传递的内容作为变量的值(因为伪协议是用来处理文件的,所以这里的code变量可以看作是个内容为<?php echo("hello");?>的文件),所以这里include()函数实际上就是包含了一个文件,文件的内容在消息正文中传入,这个文件符合PHP文件的结构便被当作PHP文件执行。

(实际上这里如果把请求消息中的GET方式改成POST方式仍然能够正常输出预想结果,也就是GET数组还是正常获得了传入code变量的值,猜测可能和PHP获取GET传入数值的设定有关,由于技术过于有限,这里仅列出说明这一现象)

data://  使用条件:(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On

该协议类似于php://input,区别在于data://获取的是协议固定结构后的内容,官方定义如下:

实际上除了data://text/plain;base64,这一用法之外还存在data://text/plain,这种用法,区别在于前者获取的是协议固定结构后所接内容的base64解密格式,而后者获取的是未被解密的格式。

使用效果:

(在使用data://text/plain;base64,时,如果是在URL中传入值使用,最好将base64加密后字符串中的+、=符号换为URL编码,以免有时无法获取完整的加密后字符串而导致解密失败,=URL编码是%3d而+是%2b)

php://filter  使用条件:(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On/Off(均可)

该协议多用来对文件处理,可以是读取时处理文件也可以是写入时处理文件,官方定义如下:

 resource=  通常是本地文件的路径,绝对路径和相对路径均可以使用。

read=  读取时选取的处理方式,一次可以选择多个处理方式,不同方式之间用|符号隔开。

 

write=  写入时选取的处理方式,一次可以选择多个处理方式,不同方式之间用|符号隔开。

;  (技术水平过于有限并没理解其用途,也不曾遇到使用案例,故此处除开不讲)

关于read和write参数,其具体数值有(两者通用):

  string.toupper 转换为大写

  string.tolower 转换为小写

  string.rot13 进行rot13加密

  string.strip_tags 去除目标中含有的HTML、XML和PHP的标签(等同于strip_tags()函数)

  convert.base64-encode 进行base64加密

  convert.base64-decode 进行base64解密

使用效果:

这里不使用read或write参数直接在协议中填入文件路径,也可能正因为这个原因,这里会出现报错(技术过于有限不懂产生原因),但够使用并最终得到预期的结果。

 

 

这里获取到了协议中填入路径对应文件的base64加密后结果,常用来查看页面的源代码。

 

 这里就成功的将base64加密后字符解密并写入了协议中所填路径对应的文件(如果文件在写入前不存在会先创建该文件,再写入时如果文件存在内容将会全部被写入内容覆盖掉)。

file://  使用条件:(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On/Off(均可)

该协议用来访问服务端的本地文件,但是文件的协议固定结构后面的路径得是绝对路径(用相对路径则就不需要带上协议了),官方定义如下:

使用效果:

http(s)://  使用条件:(这些设定在php.ini文件中设置):allow_url_fopen On allow_url_include On/Off(均可)

该协议类似于访问输入的网页(但实际上还是和直接访问有区别,比如访问百度就虽然能显示正常的页面,但是百度一下的功能是使用不了的,会显示报错),官方定义如下:

使用效果:

三、说明

  本文主要还是起个人学习笔记的作用,所以所写内容既不简洁明了也算不上字句严谨,在此后随学习知识增多若对伪协议有了进一步见解或知晓更多使用方法,会对本文加以改进。环境使用的为WIN7虚拟机,PHP版本为7.3.4,allow_url_fopen和allow_url_include均设置为On,因所用系统、PHP版本等其他因素不同可能会产生与本文描述不同的结果。欢迎各位师父斧正。

 

posted @ 2021-03-26 12:30  Article_kelp  阅读(454)  评论(0)    收藏  举报