php伪协议-漏洞及其原理

220 阅读3分钟

🍀支持为协议的函数 🍁文件包含函数 include(); include_once(); require(); require_once(); 1 2 3 4 举个例子

include(文件名) ; 作用是如果文件名下的文件中有php代码,就会执行php代码,其他的部分直接输出

🍁 文件操作类函数 fopen(); file(); readfile(); file_get_contents(); ...... 1 2 3 4 5 举个例子

file_get_contents(文件名); 作用是直接读出文件名下文件的内容

🍀伪协议 🍁 file:// 作用是访问本地文件系统

不受allow_url_fopen和allow_url_include影响 用法:

/path/to/file.ext relative/path/to/file.ext fileInCwd.ext C:/path/to/winfile.ext C:\path\to\winfile.ext \smbserver\share\path\to\winfile.ext file:///path/to/file.ext 1 2 3 4 5 6 7 🍁 http://https:// 作用是访问http(s)网址

文件操作函数需开启allow_url_fopen,文件包含需同时开启allow_url_include和allow_url_fopen。 用法:

example.com/file.php?va… user:password@example.com

1 2 3 可以自己搭建一个网站然后利用漏洞

🍁ftp:// 作用:访问ftp(s)URLs

文件操作函数需开启allow_url_fopen,文件包含需同时开启allow_url_include和 allow_url_fopen。

用法:

ftp://user:password@example.com/pub/file.txt ftps://example.com/pub/file.txt 1 2 🍁 php:// 作用是访问各个输出输出流

🍁php://input 可以访问亲求的原始数据只读流 可以理解为这一串话整个是一个特殊的文件名,和include搭配的话,因为include可以读取文件名下的内容并且有php代码就执行,可是这个特殊的文件名是找不到的,所以我们就可以自己写文件内容

文件操作函数需开启allow_url_fopen,文件包含需同时开启allow_url_include和 allow_url_fopen。

🔥例题讲解:

做题首先要读懂代码

很明显,这个代码的意思就是说过滤flag,如果没有flag就可以包含文件

具体怎么做呢?

上文所说,我们利用php://input可以自己写文件并且执行,那么我们可以传参php://input然后在下面写php代码

🍁php://filter php://filter 是一种元封装器,设计用于数据流打开时的筛选过滤应用

本地文件无论allow_url_fopen,allow_url_include是否开启都可以使用,allow_url_fopen开启时文件操作函数里resource可以是远程的,allow_url_include也开启包含resource才可以是远程的。

用法:

php://filter/read=convert.base64-encode/resource=c:/windows/win.ini 1 讲解一下每个部分的作用

read是要执行的操作 convert.base64-encode的意思是读出的内容经过一次base64编码 resource后面跟的是读取内容的路径

参数(作为路径的一部分)

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

名称 描述 string.rot13 进行rot13转换 string.toupper 将字符全部大写 string.tolower 将字符全部小写 string.strip_tags 去除空字符、HTML 和 PHP 标记后的结果 编码过滤器

onvert.iconv.utf-8.utf-7 将utf-8编码转换为utf-7编码,这样再继续使用base64编码写文件时候,不会因为特殊符号无法新建文件(windows) convert.base64-encode/convert.base64-decode base64编码解码 onvert.quoted-printable-encode/convert.quoted-printable-decode quoted-printable 编码解码 🍁 data:// 数据流封装器,直接就是数据。

文件操作函数需开启allow_url_fopen,文件包含需同时开启allow_url_include和 allow_url_fopen。 用法

data://text/plain, data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= 1 2 第一个就直接执行后面的php代码,第二个的意思是将后面的一串经过base64解码后执行(用来绕过过滤)

🔥例题讲解

这里编码完最后其实有一个+,但是如果+不处理就无法执行,所以我们提前url编码一次,+的url编码是%2b

🍁 compress.zlib:// compress.bzip2:// zip:// 用法:

compress.zlib://file.gz compress.bzip2://file.bz2 zip://archive.zip#dir/file.txt