[ACTF2020 新生赛]Include

链接: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。

posted @ 2024-11-01 21:43  imtaieee  阅读(33)  评论(0编辑  收藏  举报