相关
项目 | 内容 |
---|---|
难度 | 简单 |
类型 | WEB |
靶场 | BUUCTF |
坐标 | [ACTF2020 新生赛]Include |
题解
案发现场
打开题目链接,首页中只有一个超链接。
点击 tips 后,出现了如下提示(你能找到其他的 flag 吗):
仔细观察,可以发现:
点击超链接后,发送了一个 GET 请求
?file=flag.php
file 的值为 flag.php ,应该是一个 PHP 文件。
改造一下链接(访问 flag.php 页面):
http://f2c5e5cb-7a5b-4a4b-b41b-5d9c19f9ed68.node4.buuoj.cn:81/flag.php
可以发现,题目首页中的 tips 超链接指向的就是 flag.php 页面。
分析
- PHP 中若通过 require()、once_require() 或 include() 、once_include() 函数去包含另一个文件,该文件在网页中均是不可见的(即使你查看网页源代码)。
- 页面提示,Can you find out the flag?
综上,可以发现 flag.php 页面通过 get 方式中的参数 file 来包含网站当前目录下的其他文件(如 flag.php),再加上提示 “你能找到其他 flag 吗?” ,我们可以推断,要解答该题目需要获取 flag.php 的源代码。
攻克
我们可以通过将包含的文件进行转码,让浏览器无法识别这是 PHP 代码,其也就无法执行该 PHP 文件,于是将文件中的内容直接显示出来,我们将通过 PHP 伪协议来完成这一动作。
使用 PHP 伪协议将网页源代码转换为 base64 编码的格式:
php://filter/read=convert.base64-encode/resource=flag.php
其中的 read 可以省略,但 resource 不能。
将此部分作为 GET 参数的值即可获得 flag,因此,构造的链接为:
http://f2c5e5cb-7a5b-4a4b-b41b-5d9c19f9ed68.node4.buuoj.cn:81/?file=php://filter/read=convert.base64-encode/resource=flag.php
我们由此获得了一段使用 base64 编码的 PHP 代码:
在线解码 后,我们可以得到一段 PHP 代码,其中就包含了 flag。