这篇记录一道比较典型的 CTF Web 题思路,核心考点是参数控制与本地文件包含。
题目特征
拿到站点后,首页很简单,只有一个参数:
1 | /index.php?page=home |
页面切换完全依赖 page 参数,第一反应就是测试是否存在文件包含。
初步测试
先尝试一些常见值:
1 | /index.php?page=about |
页面都能正常加载,说明后端可能存在类似逻辑:
1 | include $_GET['page'] . '.php'; |
漏洞验证
接下来测试目录穿越:
1 | /index.php?page=../../../../etc/passwd |
如果没有额外过滤,有机会读取目标文件。
有些题目会拼接后缀,这时可以尝试:
- 空字节截断思路(旧环境)
- 日志包含
- Session 包含
- PHP 包装器
例如:
1 | /index.php?page=php://filter/convert.base64-encode/resource=index |
如果成功,就能读取源码。
进一步利用
在这道题里,通过读取源码发现后台还存在一个上传点,但只在管理员登录后可见。继续审计代码后发现:
- 登录逻辑写死了弱口令
- 上传点只校验前端后缀
- 服务端未正确限制脚本执行
最终上传一句话脚本获得权限,读取到 flag。
这类题的核心点
从入口参数判断后端逻辑
看到 ?page=、?file=、?lang= 这类参数时,要优先想到:
- 文件包含
- 目录遍历
- 本地文件读取
不要只停留在读文件
很多时候文件包含只是第一步,真正的利用链可能是:
- 读取源码
- 发现后台路径
- 拿到凭据
- 配合上传点 RCE
总结
CTF Web 题很多并不复杂,关键在于把“输入点”与“后端处理逻辑”联系起来。看到可控文件参数时,脑子里要立即联想到包含、读取、审计源码和后续利用链。
后面我还会继续补充 SQL 注入、反序列化和 SSRF 方向的 CTF 题解。