PHP 伪协议总结
概述
PHP 提供了伪协议,允许灵活的文件和数据处理。这些协议可以成为文件读取、代码执行和数据操作的强大工具。
file://
协议
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响
特性
-
• 兼容 allow_url_fopen
:开/关 -
• 兼容 allow_url_include
:开/关
作用
用于访问本地文件系统,通常用于读取本地文件。在CTF(夺旗)场景中尤其有用于文件检索。
关键特点
-
• PHP 默认的文件系统协议 -
• 支持绝对和相对路径 -
• 适用于本地和网络文件系统 -
• 相对路径基于当前工作目录
使用示例
/absolute/path/to/file.txtrelative/path/to/file.txtfile:///full/path/to/file.txtC:/windows/path/to/file.txt\networksharepathtofile.txt
实际应用场景
// 通过不同方法读取文件include('file:///path/to/file.txt');file_get_contents('file://./local_file.txt');
php://
协议
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://inputphp://filter用于读取源码。php://input用于执行php代码。php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。 例如有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开当前目录下的2.php
特性
-
• 需要 allow_url_fopen
:开/关 -
• allow_url_include
:取决于特定流
作用
提供对各种输入/输出流的访问,在CTF场景中对源代码读取和PHP代码执行至关重要。
可用流
php://input原始请求数据的只读流php://output用于输出缓冲的只写流php://fd直接文件描述符访问(PHP 5.3.6+)php://memory内存中的数据流php://temp临时文件流(超过2MB后切换到磁盘)php://filter用于流过滤的元包装器
php://filter
详细参数
参数描述resource指定要过滤的数据流(必填)read可选的读取链过滤器write可选的写入链过滤器
可用过滤器
字符串过滤器
-
• string.rot13
:ROT13转换 -
• string.toupper
:转换为大写 -
• string.tolower
:转换为小写 -
• string.strip_tags
:删除HTML和PHP标签
转换过滤器
-
• convert.base64-encode/decode
:Base64编码/解码 -
• convert.quoted-printable-encode/decode
:quoted-printable编码/解码
压缩过滤器
-
• zlib.deflate/inflate
:zlib压缩/解压 -
• bzip2.compress/decompress
:bzip2压缩/解压
加密过滤器
-
• mcrypt.*
:对称加密算法 -
• mdecrypt.*
:对称解密算法
zip://
、bzip2://
和 zlib://
协议
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。zip://中只能传入绝对路径。要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23(即下述POC中#要用%23替换)只需要是zip的压缩包即可,后缀名可以任意更改。相同的类型还有zlib://和bzip2://
特性
-
• allow_url_fopen
:开/关 -
• allow_url_include
:开/关
作用
这些压缩流协议可以访问压缩文件中的子文件,其独特之处在于无需指定后缀名,可以修改为任意后缀,如 jpg
、png
、gif
等。
data://
协议
data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行
特性
-
• allow_url_fopen
:开 -
• allow_url_include
:开
作用
自 PHP 5.2.0 起,可以使用 data://
数据流封装器传递特定格式的数据,通常用于执行PHP代码。
使用方法
data://ttxt/plain,data://ttxt/plain;base64,
http://
和 https://
协议
特性
-
• allow_url_fopen
:开 -
• allow_url_include
:开
作用
允许通过HTTP 1.0 GET方法只读访问文件或资源。在CTF中通常用于远程文件包含。
使用示例
http://example.comhttp://example.com/file.php?var1=val1&var2=val2http://user:[email protected]https://example.com
参考文章
https://segmentfault.com/a/1190000018991087https://link.segmentfault.com/?enc=DfOwlcBVY9wAvTWtmlWeUg%3D%3D.9CrheUpnAWIBHUs98fD5dl4Bq3gQA45Lv8h0kYLQ31T41sSrAI9ncpgfH4rcptpg
原文始发于微信公众号(无尽藏攻防实验室):PHP 伪协议总结
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论