0%

[SWPUCTF 2021 新生赛]include Russel的WriteUp

2023-09-09 13:24By
Russel
PHP伪协议PHP文件包含文件上传WEB

[SWPUCTF 2021 新生赛]include

Created: September 9, 2023 11:58 AM
URL: https://www.nssctf.cn/problem/427

解题

输入下面的代码,获取一个新的页面

http://node5.anna.nssctf.cn:28779/?file=1

Untitled

看到include_once($file);发现可以使用伪协议造一个url

?file=php://filter/convert.base64-encode/resource=flag.php

然后得到了我们想要的base64加密后的flag

Untitled

最后解密这个flag就行了


include_once($file)

返回值

  • 如果文件成功包含,include_once 将会返回 1
  • 如果文件没有被找到或者在尝试包含文件过程中有错误,include_once 不会返回任何值,但会产生一个警告(除非 error_reporting 被设置成忽略警告)。

各类文件类型的输出情况

include_once 的参数不是一个 PHP 文件,那么该文件的内容会被直接输出(或执行,如果有可执行的 PHP 代码)到输出流中。具体的行为取决于该文件的内容和类型。

  1. 纯文本文件(比如 .txt): 文件的内容会被直接输出。
  2. HTML 文件(比如 .html 或 .htm): HTML 代码会被直接输出,浏览器会按照 HTML 来渲染。
  3. XML 文件或其他标记语言文件: 文件的内容会被直接输出。
  4. 二进制文件(比如图片或者音频文件): 这样做通常不是个好主意,因为二进制数据可能会被错误地解释为文本,导致输出乱码或产生不可预测的结果。
  5. 包含 PHP 代码的非 PHP 文件: 如果文件中混合有 PHP 代码(即使文件扩展名不是 .php),那么那部分 PHP 代码仍然会被执行。

示例

假设有一个名为 file_to_include.php 的文件,其内容如下:

<?php
echo "This is the included file.";
?>

在主文件中,你可以这样使用 include_once

<?php
$result = include_once("file_to_include.php");
echo $result;  // 输出 1
?>

输出将会是:

This is the included file.1

注意,include_once 会执行文件的内容,并且返回 1 表示成功。

如果文件不存在:

<?php
$result = include_once("non_existent_file.php");
echo $result;  // 不会有输出,但会产生一个警告
?>

这里 $result 不会被赋值,也不会有输出,但会产生一个 PHP 警告(除非你设置了错误报告级别来忽略它)。

在这题中的运用

include_once 会执行 flag.php 中的 PHP 代码,并将任何 echoprint 等输出命令产生的输出嵌入到主页面中。其他 PHP 代码,如变量定义、函数定义、逻辑操作等,都会被执行但不会被直接输出到页面。

只有当你使用一些特殊方法(如在这个例子中的 php://filter/convert.base64-encode/resource=flag.php)来防止代码执行时,你才能看到文件的原始内容。否则,include_once 会直接执行文件中的代码。

php://filter

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

下面解释下这个代码什么意思

file=php://filter/read=convert.base64-encode/resource=./flag.php

read=convert.base64-encode是将resource指向的内容进行转化,将其变成base64编码,并输出结果.这样处理后的输出不再是一个可执行的 PHP 文件,而是一个 Base64 编码的字符串。因此,可以直接被include_once给输出来

resource=flag.php,告知了需要处理的文件是什么,这里是可以存在正常的层级结构的,也就是说./flag.php和/ajskdjk/djakdajs和flag.php都是合法的

类比

上面两个指令其实让我想起了bash的一个操作

bash -c "指令"
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有

加载中...

加载失败
广告
×
评论区
添加新评论

顶!

太帅了