目录
(1)convert.base64-encode(最关键的过滤器)
[(2)read= 和 write= 参数](#(2)read= 和 write= 参数)
(1)php://filter/read=convert.base64-encode/resource=../key.php
(2)php://filter/convert.base64-encode/resource=../key.php
本文详细讲解CISP-PTE靶场文件包含关卡的渗透实战全流程。重点讲解了convert.base64-encode过滤器的关键作用:通过Base64编码防止PHP代码被执行,从而获取文件源码。文章详细解析了两种常用payload格式,并演示了在CISP-PTE靶场中的实战应用:通过构造包含../key.php的过滤器路径,获取Base64编码结果后解码得到flag。该方法有效绕过文件直接执行限制,展现了php://filter在文件包含利用中的强大功能。
一、php://filter
php://filter 是 PHP 提供的一个非常强大且常用的元包装器 。它本身不是用来读取"文件内容"的,而是用来在读取文件时,对数据流进行过滤、转换、编码 的。核心思想是:在数据源(如一个文件)和目的地(如 include() 函数或 echo 语句)之间,建立一个可配置的"过滤管道"。
1、基本语法结构
php://filter 的 URL 遵循一个标准的路径结构:
php://filter/(过滤器链)/resource=(目标文件)
-
php://filter/: 声明使用过滤器流。 -
(过滤器链): 指定一个或多个过滤器,按顺序对数据进行处理。 -
/resource=: 指定要读取的原始资源(比如一个文件)。
2、关键过滤器讲解
php://filter 的强大之处在于其丰富的过滤器。
(1)convert.base64-encode(最关键的过滤器)
-
功能:将数据流进行 Base64 编码。
-
为什么它在安全领域如此重要:
-
绕过死亡 Exit :如果目标文件是 PHP 代码,直接
include它会执行其中的代码。如果代码末尾有exit();或die();函数,页面会提前结束,你看不到完整内容。但先进行 Base64 编码,PHP 引擎就不会执行它,而是将其当作纯文本处理。 -
查看源代码:对于 PHP 文件,直接读取会执行,看不到源代码。编码后,你得到的是源代码的 Base64 形式,解码后即可查看。
-
处理特殊字符:编码可以避免原始数据中的特殊字符(如引号、换行符)在特定上下文中引发问题。
-
示例 Payload: php://filter/read=convert.base64-encode/resource=index.php
这个 Payload 的意思是:读取 index.php 文件,并将其内容进行 Base64 编码后输出。
(2)read= 和 write= 参数
-
read=: 指定在读取资源时应用的过滤器链。 -
write=: 指定在写入资源时应用的过滤器链。(在文件包含中较少使用)
read= 常常可以省略,所以上面的 Payload 也可以简写为:
php://filter/convert.base64-encode/resource=index.php
(3)过滤器链
你可以将多个过滤器串联起来,用 |(管道符)分隔,数据会依次经过这些过滤器。
示例:php://filter/read=convert.base64-encode|convert.base64-decode/resource=index.php
这个例子中,数据会先被 Base64 编码,然后立即解码,最终输出原始内容(这个例子本身无意义,但展示了链式用法)。
(4)字符串过滤器
-
string.rot13: 对数据进行 ROT13 编码(字母移位 13 位)。 -
string.toupper/string.tolower: 将字符串转换为大写/小写。
示例:php://filter/read=string.rot13/resource=config.php
这会将 config.php 的内容用 ROT13 编码后输出。
二、渗透实战
1、打开靶场
打开靶场,页面提示"PHP文件包含风险的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。测试该网站可能存在的文件包含风险,尝试获取webshell,答案就在根目录下key.php文件中。"
http://03f29109.clsadp.com/

点击进入答题,如下所示进入文件包含的关卡页面,注意如下URL的参数为 file=view.html。
http://03f29109.clsadp.com/vulnerabilities/fu1.php?file=view.html

2、php://filter渗透
(1)php://filter/read=convert.base64-encode/resource=../key.php
http://03f29109.clsadp.com/vulnerabilities/fu1.php?file=php://filter/read=convert.base64-encode/resource=../key.php
-
php://filter/- 这是 PHP 内置的流包装器协议,用于对数据流进行过滤处理。
-
read=convert.base64-encode-
read=:指定在读取资源时应用的过滤器。 -
convert.base64-encode:具体的过滤器,功能是将数据流进行 Base64 编码。 -
这一部分是关键 :它的目的是避免文件被直接执行或渲染。通过 Base64 编码,PHP 代码会变成一堆无意义的文本字符,从而防止其被解释执行。
-
-
/resource=../key.php-
resource=:指定要读取的原始资源,即目标文件。 -
../key.php:文件路径,表示上一级目录下的key.php文件。
-

当攻击Payload 被传递给文件包含函数时,会执行如下流程:
-
定位资源 :PHP 首先定位到
../key.php这个文件。 -
创建过滤链 :系统建立一个数据流处理管道,并应用
convert.base64-encode过滤器。 -
读取并编码 :PHP 开始读取
../key.php文件的原始内容。但内容不会直接输出,而是会先通过 Base64 编码过滤器。 -
返回结果 :最终,你得到的不再是
key.php的原始代码,而是该代码经过 Base64 编码后的一长串字符串。
(2)php://filter/convert.base64-encode/resource=../key.php
这个 Payload 是上一个 Payload 的简写形式 ,它们的功能完全等效
-
php://filter/声明使用 PHP 的过滤器流。 -
convert.base64-encode这是核心的过滤器。它省略了read=参数。php://filter中,如果只指定过滤器而不标明read=或write=,默认就是应用于读取操作。 -
/resource=../key.php指定要读取的目标资源,即上一级目录下的key.php文件。
执行payload后,整个攻击流程如下所示:
-
文件识别 :PHP 引擎识别出你想要访问
../key.php文件。 -
过滤处理 :由于指定了
php://filter和convert.base64-encode,引擎不会直接返回文件的原始内容。它创建了一个"过滤管道",文件数据流会先通过这个管道。 -
编码输出 :
key.php的原始字节内容 (包括所有<?php ... ?>标签、变量定义、注释等)被送入 Base64 编码器。最终输出的不再是可执行的 PHP 代码,而是一长串由大小写字母、数字和+、/、=组成的 Base64 编码字符串。

3、base64解码
使用burpsuite的decoder模块进行base64解码,其base64编码后的值如下所示。R2V0IGl0IQ0KPD9waHANCg0KLy9rZXkzOiBlNnY5cjJwNA0KPz4NCg==
对其进行base64解码,如下所示成功获取到key值。
|-------------------------------------|
| Get it! <?php //key3: e6v9r2p4 ?> |
