链接:https://buuoj.cn/challenges#[ACTF2020 新生赛]Include。
打开环境后如下,只有一个 "tips" 的超链接。
访问 tips,留意传入了 "file" 参数。
接下来,可以尝试下路径穿越:?file=flag.php../../../../../etc/passwd
。
可以看到,存在路径穿越漏洞,但是通过路径穿越漏洞并没有读取到根目录下的 flag 文件。
这时候,回过头去再看访问 tips 时的情况。
可以看到,file 参数被设置为了 "flag.php",因此,有可能 flag 是藏在了 flag.php 文件内,以注释的方式存放着,因此就需要考虑如何能够成功的读取到 flag.php 文件的源码。
下面直接给出 Payload:?file=php://filter/read=convert.base64-encode/resource=flag.php
。
知其然,知其所以然。
在 PHP 中, 存在着 "伪协议" 这一特性。
即,PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen、copy、file_exists、filesize 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register 函数来注册自定义的封装协议。
总而言之,PHP 伪协议就是用于处理文件的一种协议,比如说在 include 一些文件时,使用各种伪协议就可以特定化的处理该文件或决定如何访问文件、解析文件。
在 PHP 中,支持伪协议的函数有如下:
- include。
- include_once。
- require。
- require_once。
- fopen。
- file。
- readfile。
- file_get_contents。
- ...。
而伪协议的分类有如下:
- file://。
- php://。
- zip://。
- ...。
其中,"php://" 伪协议用于访问各个输入/输出流。
"php://" 伪协议的条件:
- allow_url_fopen:off/on。
- allow_url_include:off/on(php://input、php://stdin、php://memory、php://temp 伪协议需要 on)。
这里着重介绍以下 "php://" 伪协议中的 "php://filter"伪协议。
php://filter 是 PHP 中的一种特殊的伪协议,它允许对数据进行过滤处理。它可以通过输入流或输出流来操作数据,常用于对文件、数据流等进行编码、解码、压缩等处理。
主要用途:
- 对文件内容进行转换,如 base64 编码、ROT13 加密、字符串大小写转换等。
- 对 HTTP 请求的输入或输出流进行过滤。
基本的语法:php://filter/read=<过滤器列表>/resource=<操作目标>
。
因此,本题可以使用 PHP 伪协议读取 "flag.php" 文件源码。
最后,将得到的 Base64 字符串解码后即可得到 flag。
标签:协议,ACTF2020,php,文件,新生,flag,PHP,file,Include From: https://www.cnblogs.com/imtaieee/p/18521327