[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

看到include_once($file);发现可以使用伪协议造一个url
?file=php://filter/convert.base64-encode/resource=flag.php
然后得到了我们想要的base64加密后的flag

最后解密这个flag就行了
include_once($file)
返回值
- 如果文件成功包含,
include_once将会返回1。 - 如果文件没有被找到或者在尝试包含文件过程中有错误,
include_once不会返回任何值,但会产生一个警告(除非error_reporting被设置成忽略警告)。
各类文件类型的输出情况
include_once 的参数不是一个 PHP 文件,那么该文件的内容会被直接输出(或执行,如果有可执行的 PHP 代码)到输出流中。具体的行为取决于该文件的内容和类型。
- 纯文本文件(比如 .txt): 文件的内容会被直接输出。
- HTML 文件(比如 .html 或 .htm): HTML 代码会被直接输出,浏览器会按照 HTML 来渲染。
- XML 文件或其他标记语言文件: 文件的内容会被直接输出。
- 二进制文件(比如图片或者音频文件): 这样做通常不是个好主意,因为二进制数据可能会被错误地解释为文本,导致输出乱码或产生不可预测的结果。
- 包含 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 代码,并将任何 echo 或 print 等输出命令产生的输出嵌入到主页面中。其他 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 "指令"

强
顶!
太帅了
牛