最近刷到《极客大挑战 2019》的 Web 赛题其中一题叫“Secret File1”。别看名字起得挺低调实际做起来还挺考验基本功。这道题的核心就俩字找文件。适合刚接触 CTF、想系统入门 Web 安全的同学拿来练手因为整个解题过程会覆盖信息收集、路径探测、源码审计、漏洞利用这几个常见环节做完之后你会对一台“看似没有漏洞”的 Web 应用如何被一点点啃下来产生特别直观的理解。我当时做这道题的时候屏幕前坐了一下午从一脸懵到最终拿到 flag整个过程特别值得复盘。这篇就算记录一下完整解法顺便把一些容易踩的坑和排查思路也捋一遍。如果你正卡在某个经典 Web 题上无从下手或者想把自己从“只会贴 payload”的状态里拽出来那这篇应该能给你点实在的帮助。1. 项目背景与核心需求解析1.1 题目核心需求“Secret File1”是一个典型的 PHP 环境下的 Web 安全题目目标只有一个找到那个被隐藏起来的文件然后从里面把 flag 揪出来。听起来很简单但它不会直接给你一个带 flag 的页面你需要经过一系列探测和利用才能把“秘密文件”从站点的某个角落里翻出来。从题目命名就能看出点端倪。“Secret File”暗示站点里存在不止一个文件其中必然有某个是“秘密”的。这类题在真实业务中特别常见比如开发者把配置文件、备份脚本、接口文档藏在某个不起眼的目录里甚至直接用乱码命名来防扫描。很多安全问题就是这么被发现的不是系统多复杂而是敏感文件被藏得太粗糙。做这道题需要的基础能力包括会看 HTML 源码和 HTTP 响应、懂一点 PHP 代码审计、知道什么是文件包含漏洞以及能熟练使用抓包工具。如果你这些技能点还没点亮也没关系下面我会手把手解释每一步背后的逻辑你跟着走一遍就能懂。1.2 同类题目与场景极客大挑战 2019 其他题目像“[极客大挑战 2019]havefun”“[极客大挑战 2019]buyflag”和这道“Secret File1”其实是一个系列的产品。它们都围绕“Web 漏洞利用”展开但侧重点不同“havefun”偏参数伪造“buyflag”偏逻辑漏洞“Secret File1”则集中展示“文件”这个维度上的安全问题。这类题目放到现实场景里就好比你去参与一次企业授权渗透测试。你面对的就是一个部署好的网站需要从外到内一层层剥开找到入口。这道题教会你的不只是“怎么拿 flag”更重要的是培养一种敏感当页面看起来很干净的时候不要急着下结论去翻源码、扫目录、看响应头答案往往就藏在这些细节里。2. 环境准备与工具选型2.1 环境搭建做 Web 题基本不挑机器一台能跑浏览器的电脑就够用。如果你在本地解这道题可能需要配置一个 PHP 环境比如用 phpstudy 建个 Apache PHP 的站点把题目源码放进去。但如果用的是在线 CTF 平台那就省事多了直接打开浏览器访问题目地址就行。我建议准备两个浏览器一个日常浏览看页面另一个专门用来做抓包分析比如 Firefox 配 Burp。这样可以把正常访问和调试分开避免来回切换。如果你习惯用 Chrome也可以但记得开发者工具多用起来有些隐藏信息在响应头和源代码里才能看到。2.2 工具选型解析这里我列一份我自己做这道题时实际用到的工具清单并说明为什么选它们而不选别的工具作用为什么选它Chrome 开发者工具查看网页源码、网络请求、响应头浏览器自带无需额外安装信息收集第一站Burp Suite 社区版抓包、改包、重放请求免费且功能够用Web 渗透的主流工具能确认参数和响应关系dirsearch目录扫描探测隐藏路径字典全、速度快比手动猜目录靠谱太多记事本 / 编辑器记录源码片段和构造的 payload有时候思路断了回头看看笔记就接上了有些人可能会用“御剑”“7kb 扫描器”这类图形化工具我试过但觉得在 CTF 场景下还是命令行工具更可控。dirsearch 可以直接配合字典精确输出 200、403、500 状态码省去很多无效信息。Burp 也是一样插件生态成熟社区版够用了。工具不在多关键是会用。就拿目录扫描来说很多人上来就暴力扫全库结果扫出来一堆无关紧要的东西反而把自己搞晕了。做题前先想想这个站点的技术栈可能是 PHP那就优先扫.php和备份文件别把时间浪费在扫描器默认字典的大海捞针上。3. 解题思路与核心环节实现3.1 信息收集达到事半功倍我开始做这道题时第一步永远是“打开首页看源码”。不要嫌这步骤简单很多题目的突破口就藏在 HTML 注释里。首页是一个正常的页面但从头翻到尾我发现源码里有一段注释写着secret_file.php之类的提示。这就是“秘密文件”的路标。这时候千万不要直接复制粘贴访问一下完事先想一下为什么作者要在这里写注释通常是为了提示选手“去看看这个文件”。但你直接访问secret_file.php看到的结果很可能是空白页面或者一段奇怪的内容。别急接下来要做的就是更细的探测。我试过用 dirsearch 扫了一遍发现还有几个隐藏文件比如flag.php、index.php这类常见的名字。但flag.php直接访问也是空白因为 flag 不是放在页面里的而是放在文件里面需要通过某种手段读取内容。这个阶段的关键是把站点的文件结构摸清楚而不是盯着一个点死磕。3.2 源码审计定位漏洞点找到文件之后下一步是读取它的源码。很多新手卡在这一步因为直接访问secret_file.php只是输出一段话或空白看不到 PHP 代码。这就需要用到“伪协议”来读取源码最常见的是php://filter。比如构造请求secret_file.php?filephp://filter/convert.base64-encode/resourceflag.php。这个操作的意思是用file参数去包含一个文件但是不直接执行而是把文件内容转成 base64 编码输出。然后你去源码里找到那串 base64 字符串解码一下就能看到flag.php的原始 PHP 代码。这里有个小细节为什么要先 base64 编码再输出因为如果直接包含 PHP 文件PHP 解析器会把它当作代码执行而不会泄露文本。base64 编码可以绕过这一层让你在响应里看到文件内容。这是文件包含题里最常用的技巧熟练掌握之后很多 PHP 题都能解开了。拿到源码后我看到了类似这样的关键代码if (isset($_GET[file])) { include($_GET[file]); }看到include这个函数基本就拿下了。它直接把我们传入的file参数当作路径去包含文件没有任何过滤所以可以通过构造路径读取任意文件。那 flag 到底在哪通常会在flag.php里但也可能藏在根目录的其他文件里比如/flag或path/to/flag.txt。3.3 利用文件包含漏洞获取 flag既然漏洞点确认了接下来就是构造 payload 读取 flag 文件。我在实验环境里测试了以下几种路径php://filter/convert.base64-encode/resourceflag读取无后缀文件php://filter/convert.base64-encode/resourceflag.php读取 PHP 源文件../../etc/passwd这种目录穿越看看能不能直接读取系统文件经过几次尝试我发现resourceflag.php解码出来的 base64 字符串里藏着完整的 flag 内容前两位是flag{后面是一串字符。最终我把它解码出来顺利提交拿到了分数。这里必须强调一下所有测试都发生在 CTF 平台上属于授权环境。现实生产环境里的任意文件读取漏洞是极其危险的恶意攻击者可以读取数据库配置、密钥文件等等后果不堪设想。所以学习这类题目是为了更好地理解漏洞原理从而在开发时加强过滤和防护而不是拿来攻击真实站点。4. 常见问题与排查技巧实录4.1 经典翻车案例我自己做这道题的时候也踩过几个知名大坑。第一次扫描目录的时候我用了一个挺大的字典结果跑了几分钟扫出来一大堆 200 状态码的路径我一个个点过去全是图片和样式文件看都看不过来。后来我调整策略只扫常见文件名和php后缀问题立刻变得清晰了。还有一次我构造php://filter请求后页面直接回显 500 错误。排查下来发现是 URL 编码问题——参数里的:和/没有被正确识别。后来我把file参数的值做了一次 URL 编码或者用 Burp 直接发原始请求才正常拿到 base64 内容。最让人抓狂的一种情况是明明 payload 看着对但输出是一堆乱码。这时候别怀疑自己快速检查一下响应头里的Content-Type如果浏览器把它当文件下载或直接渲染了就改成view-source:或者用 Burp 的 hex 视图看。多数情况下乱码只是因为编码问题不是漏洞利用失败了。4.2 高效排查三板斧如果做题时卡住我一般会按这个顺序排查第一看响应包。用 Burp 重放请求仔细观察响应中的状态码和响应体。是不是 302 跳转了文件内容是不是被拦截了这些线索比盲猜有效得多。比如有时候平台会加个 WAF它会把php://filter这种字符串直接拦截那就需要用其他编码方式绕过。第二看目录扫描结果里的异常文件。有些文件虽然状态码是 200但内容为空这可能是被隐藏了真实内容有些文件是 .bak 或 .swp 后缀那是备份文件或编辑器残留文件里面经常会有源码或密码。细心一点就能发现突破口。第三对比不同参数下的响应。比如分别请求?fileindex.php和?fileflag.php看响应差异。如果某个参数报错了或者输出不同说明漏洞点在那顺藤摸瓜就能拿到结果。排查的时候要冷静别一口气试十几个 payload那样反而容易乱。每次只改一个变量确认影响再推进下一步。这样的节奏效率最高。5. 做完这道题之后这道题做完我最大的感触就是Web 安全的核心不是你会多少工具而是你有没有“怀疑一切”的心态。一个看似平平无奇的页面背后可能藏着无数敏感信息。以后再做渗透测试或者护网任务看到那种打了注释的代码、后台管理入口、备份文件我都会下意识多看一眼。最后分享一个小技巧如果你也卡在类似题目里别急着翻题解。先自己花四十分钟做信息收集把所有源码、响应头、目录结构都画成一张图然后再去想漏洞点在哪。这个习惯我保持到现在实际工作中帮了我大忙。希望这篇复盘能帮你把“Secret File1”这个系列搞通顺便把手感练起来。