CTF 圈里有个说法,Web 方向是最容易让新手获得“第一次解题快感”的入口。不需要像逆向那样啃汇编,也不用像密码学那样先补数论,只要你会开浏览器、会看网页,就具备了打 CTF Web 题的最低配置。而新手区那几道看似不起眼的题目,恰恰是把“信息收集、源码审计、协议理解”这三个 Web 安全的基本功揉碎了喂给你。这篇东西我就拿攻防世界新手区里最经典的三道题来拆,分别是 view_source、robots 和 backup。它们难度不高,但背后的门道足够你完成从“只会打开网页”到“知道从哪儿找突破口”的蜕变。
1. 内容整体设计与思路拆解
1.1 CTF Web 到底是什么,新手该练什么
CTF(Capture The Flag)是夺旗赛,Flag 就是一串藏在题目里的特殊字符串,你拿到它并提交成功,就代表解出了这道题。Web 方向的题目本质上就是给你一个真实的网站环境,里面埋了一个漏洞或一个错误配置,你要做的就是通过浏览器、抓包工具、代码审计手段,把这些不该被看到的东西翻出来。
新手区这三道题没有复杂的漏洞利用,没有 SQL 注入、XSS、反序列化这些听起来就劝退的名词,它们考的全是最底层的东西:你知不知道网页源码里藏着东西、你知不知道服务器的目录里可能躺着不该存在的文件、你知不知道协议文件也是信息泄露的通道。
这三道题为什么“必做”?不是因为它们能让你学到多高深的技术,而是因为它们能帮你建立一套做题思维框架:面对一个陌生的网站,先看什么、后看什么、哪些地方习惯性藏着 Flag。这套框架一旦建立,后面打任何 Web 题都有了一条清晰的起手式。
1.2 三道题恰好覆盖 Web 渗透的信息收集三板斧
信息收集是 Web 渗透里占用时间最多、也最决定成败的环节。很多实战漏洞能被发现,不是因为攻击者技术多牛,而是因为目标网站的敏感信息藏得太明显。
三道题对应三种典型的信息泄露场景:
| 题目 | 泄露类型 | 核心考点 |
|---|---|---|
| view_source | 源码注释泄露 | 查看网页源代码,留意注释和隐藏内容 |
| robots | 协议文件泄露 | 访问 robots.txt,顺着 Disallow 规则找敏感路径 |
| backup | 备份文件泄露 | 猜解常见备份文件名,直接下载源码文件 |
这三类问题在真实网站里非常常见,尤其是开发习惯不好导致的注释残留、备份文件没清理、robots 文件配置失误,每一个都是实战中极其重要的检查点。所以把这三道题吃透,你不是在“刷题”,你是在预习真实世界的漏洞发现过程。
1.3 题目环境与工具准备清单
这类在线 CTF 平台通常会给你一个独立的题目环境,你打开题目后会进入一个目标网站,Flag 就藏在里面。工具方面,新手阶段不需要一上来就装 Burp Suite 这种重型抓包工具,一个 Chromium 内核浏览器加一只手就够了。
我的建议是准备以下三样,足以覆盖新手区全部题目:
- Chrome 或 Firefox 浏览器:自带开发者工具,F12 一键开启
- Notepad++ 或 VS Code:用来查看下载下来的源码文件,纯文本工具也行
- 一份常见的备份文件后缀字典:自己手写一个也行,后面讲 backup 题会给你列
新手最容易犯的毛病是工具焦虑,总觉得“我没装 XX 工具所以做不出来”。这三道题唯一的工具就是你日常上网用的浏览器,题目的重点在于“你有没有去看”和“你知不知道去看哪里”,而不是“你会不会用高级工具”。
2. 核心细节解析与实操要点
2.1 view_source:为什么一个“查看源代码”能成为经典题
这道题的页面非常简单,打开后往往只有一行文字,比如“请查看源代码”,然后就没有任何交互按钮了。很多第一次接触 CTF 的人会愣在原地,想不通这题到底要做啥。实际上题目名字已经把答案写在脸上了:view_source,去看源代码。
网页上你能看到的内容只是 HTML 渲染后的结果,而网页源代码里包含了完整的 HTML 标签、属性、注释、JS 代码。开发者有时候会在代码里写注释来标注 TODO、修改记录、功能说明,而不经意地把敏感信息也写了进去。这道题就是模拟了这种开发失误:Flag 被塞进 HTML 注释里,而且注释默认不会显示在网页上。
查看源代码有三种常用方式,新手至少掌握一种:
- 在页面空白处右键,选择“查看页面源代码”
- 按快捷键 Ctrl+U(Windows/Linux)或 Command+U(macOS)
- 按 F12 打开开发者工具,在 Elements 或 Inspector 面板里直接看渲染后的 DOM 结构
需要注意一个细节:F12 开发者工具里看到的 Elements 面板和 Ctrl+U 看到的源码有一定区别。Elements 面板显示的是经过浏览器解析后的 DOM 树,某些动态生成的元素会直接显示出来;而“查看源代码”看到的是服务器返回的原始 HTML 文本,没有被 JS 修改过。如果你要找注释里藏的东西,优先用 Ctrl+U,因为有些注释会被开发者工具折叠,或者你会在 Elements 面板里被大量 JS 动态生成的节点干扰视线。
实操流程非常短:进入题目环境,右键查看源代码,在新打开的代码页里按 Ctrl+F 搜索 flag 或 CTF 等关键字,找到注释中的字符串,复制提交。整个过程 30 秒就能完成,但它是你 Web 安全生涯里建立“源码意识”的第一课。
2.2 robots:一个给爬虫看的文件,怎么就成了信息泄露入口
robots.txt 全称是 Robots Exclusion Protocol,翻译过来叫“机器人排除协议”。它的本意是网站管理员告诉搜索引擎爬虫:哪些路径你可以抓,哪些路径你不能抓。比如站点根目录下的 /admin/ 目录不希望被搜索引擎收录,就可以在 robots.txt 里写一行 Disallow: /admin/。
问题在于,robots.txt 是一个任何人都能直接访问的公开文件。你可以在浏览器里输入 域名/robots.txt 直接下载它。而某些开发者会天真地以为“ Disallow 的路径就是隐藏的路径”,结果把后台地址、备份文件路径、敏感目录全写在 robots.txt 里,这就等于亲手把攻击地图递给了攻击者。
这道题的难点不在于访问 robots.txt 本身,而在于你第一次做题时压根想不到要去访问这个文件。你需要培养一个习惯:拿到一个目标网站,先尝试访问根目录下常见的敏感文件,robots.txt 就是第一个要试的。
robots.txt 的常见写法大致是这样的:
User-agent: * Disallow: /admin/ Disallow: /backup.zip Allow: /public/每一行都有意义:User-agent 指定规则适用的爬虫,* 表示所有爬虫;Disallow 表示禁止访问的路径;Allow 表示允许访问的路径。注意,Disallow 后面的路径是相对根目录的,/admin/ 就代表域名下的 admin 目录。
在本题中,你访问 /robots.txt 后,很可能会看到这样的内容:
User-agent: * Disallow: /flag.txt这时候顺着 Disallow 的路径去访问 /flag.txt,就能拿到 Flag。也有一种变体是 Disallow 里直接写了完整路径,你访问后发现页面直接返回了 Flag。无论是哪种情况,核心思路都是同一个:robots.txt 是公开的信息收集资源,它会告诉你哪些路径是网站管理员不想被搜索引擎收录的,而这些路径往往就是敏感信息的藏身处。
你可以在浏览器地址栏直接输入目标域名加 /robots.txt,也可以用 curl 命令:
curl http://目标地址/robots.txt用 curl 的好处是可以配合 grep 直接过滤关键字,后面题目变复杂了会省很多时间。
2.3 backup:为什么一个.bak文件能让整个网站裸奔
backup 这道题模拟的场景非常真实:开发者写了一个 index.php,在修改之前习惯性地复制了一份备份文件,命名为 index.php.bak,然后忘了删除它,更没有注意备份文件被放在了 Web 服务器的根目录下。
Web 服务器在处理请求时有一个约定:如果你直接访问 index.php,服务器会执行 PHP 代码,把执行结果返回给浏览器。但如果你访问的是 index.php.bak,服务器不知道这个后缀名对应什么处理器,于是它把这个文件当作普通文件直接返回给客户端。也就是说,你下载到的是一个没有经过服务器解析的原始 PHP 源码文件。
这就是备份文件泄露的本质:服务器把不该让你看的源码,当作静态文件原样返回给你了。源代码泄露的后果远比想象中严重,PHP 源码里往往写着数据库连接口令、加密密钥、后台账号、业务逻辑漏洞点,堪称“源代码裸奔”。
备份文件的命名有一定规律可循,常见的备份后缀包括:
| 备份后缀 | 示例 | 说明 |
|---|---|---|
| .bak | index.php.bak | 最常见的备份文件后缀 |
| .swp | index.php.swp | vim 编辑器崩溃时留下的交换文件 |
| ~ | index.php~ | 部分编辑器的临时备份文件 |
| .sav | index.php.sav | 手工保存的备份 |
| .old | index.php.old | 旧版本文件 |
| .temp | index.php.temp | 临时文件 |
| .zip / .tar.gz | index.php.zip / index.php.tar.gz | 打包压缩备份 |
如果你访问的主文件是 index.php,那么依次尝试 index.php.bak、index.php.swp、index.php~,是最基础的猜解顺序。题目里如果写明了是 backup,那么大概率就是 .bak 后缀。
实操流程:打开题目,看到页面提示你“要找到备份文件”,直接在地址栏输入 index.php.bak。浏览器会弹出下载框或直接显示文件内容,下载后用文本编辑器打开,在源码注释或代码逻辑里找到 Flag。这个过程中你要注意,拿到源码文件后先不要急着搜 flag,先把整个文件从头到尾看一遍,因为这道题想让你体验的不仅是在注释里找字符串,而是理解“源码是怎么泄露出来的”。
3. 实操过程与核心环节实现
3.1 实战记录:view_source 的完整解题流程
我以一次标准的解题过程来演示。打开题目后,浏览器进入目标页面,页面上只有一行提示文字,没有输入框、没有按钮,也没有跳转链接。
第一步,按 F12 打开开发者工具,先看 Network 面板有没有额外请求,再看 Elements 面板有没有隐藏的 div 或注释节点。不过这是“完整性操作”,这道题更快的方式是直接 Ctrl+U 查看源代码。
第二步,浏览器新打开一个标签页,里面是原始 HTML 文本,搜索关键字 flag。我习惯用 Ctrl+F,输入“flag”,如果没搜到就换“ctf”、“key”、“flag{”这些常见 Flag 前缀。
第三步,找到注释里的一串字符,通常是 flag{xxx} 的格式,复制它。回到题目页面,把 Flag 粘贴到提交框,点提交,分数到手。
这道题的价值在一个细节上:当你第一次看到注释里的 Flag 时,你会恍然大悟“原来注释真的会泄露信息”。这个顿悟时刻非常重要,它会在你脑子里刻下一个印记:以后看任何网站,第一件事就是看源码,尤其留意注释。
提一个实操小技巧:如果右键被禁用(有些题目页面会用 JS 屏蔽右键菜单),你可以用 F12 进入开发者工具后找到设置里的 Disable JavaScript 选项,或者直接按 Ctrl+U,因为 Ctrl+U 打开查看源代码功能一般无法被页面禁用。
3.2 实战记录:robots 的完整解题流程
进入题目页面,你看到的是一个正常页面,可能是一句欢迎语,也可能是某网站的模拟首页。观察地址栏,记住当前环境的域名或 IP 加端口,比如 http://xxx:8080。
第一步,在地址栏输入 http://xxx:8080/robots.txt 并回车。服务器会返回一个纯文本文件,内容就是爬虫规则。注意:这里是直接改域名后面的路径,不要点页面上的任何链接。
第二步,查看返回内容,找 Disallow 字段。如果你看到这样的内容:
User-agent: * Disallow: /ctrl/那就意味着根目录下有个 ctrl 目录,管理员明确禁止爬虫访问它。把路径记下来,第三步直接访问 http://xxx:8080/ctrl/,页面里就藏着你要的 Flag。
还有一种情况是 Disallow 直接指向一个文件名,例如:
User-agent: * Disallow: /flag_is_here.txt那么直接访问 /flag_is_here.txt 即可。
robots 这道题做完后你要形成的条件反射是:任何一个 Web 测试目标,根目录下的 robots.txt 必须第一时间访问。它不仅能告诉你敏感目录的路径,还能帮你了解网站的目录结构、用了什么框架(有些框架会默认生成 robots.txt,里面带有版本信息),这都属于信息收集的范畴。
3.3 实战记录:backup 的完整解题流程
这道题的入口页面通常会直接提示你,网站有一个备份文件,你需要找到它。核心操作就是猜路径,猜的方法是有规律的,不是瞎猜。
第一步,确认入口文件。页面地址栏显示的是 index.php,或者页面内容本身就提示了文件名,那主文件就是 index.php。
第二步,在地址栏输入 index.php.bak 回车。浏览器要么直接显示文件内容,要么自动触发下载,两种情况都是成功信号。如果返回 404,就依次尝试 index.php.swp、index.php~、index.php.old、index.php.txt 等后缀。
第三步,拿到备份文件后用文本编辑器打开。里面是完整的 PHP 源码,可能有这样的代码:
<?php // flag{backup_files_are_dangerous} $flag = 'flag{backup_files_are_dangerous}'; ?>Flag 要么在注释里,要么在一个变量赋值里,搜索 flag 就能定位。
如果你看到的是源代码里有个文件包含的写法,比如 include($_GET['page']),那这道题就是题中有题,不过新手区的 backup 一般不需要走到那一步,拿到备份文件里的 Flag 就已经通关了。
做这道题最需要注意的是后缀猜解顺序。我的经验是 .bak 优先,其次是 .swp 和 ~,因为这两类后缀对应开发者最常用的两个编辑器场景:手工备份和 vim 崩溃恢复。文件名也要灵活一点,题目入口如果是 index.php,那猜 index.php.bak;如果入口是 www.zip 或 1.php,那就顺着文件名去猜。
3.4 三题串联:从三道题看 Web 信息收集的完整路径
把三道题的解题过程连起来看,你会发现它们其实是一条连贯的信息收集流水线。
第一步看页面本身,通过 view_source 的思路检查源码里有没有注释残留、隐藏表单、硬编码凭据。这一步解决的是“看着网页能发现什么”。第二步看协议文件,通过 robots 的思路检查根目录下有没有暴露敏感路径的规则文件。这一步解决的是“服务器主动提供了什么”。第三步猜备份文件,通过 backup 的思路猜解常见敏感文件。这一步解决的是“服务器不小心暴露了什么”。
三句话串起来就是:看表面、看声明、看遗留。这个框架不只是这三道题能用,它适用于你之后遇到的绝大多数 Web 题目。你在目录扫描、JS 文件分析、接口探测时,本质上做的还是这三件事,只是信息源更多、手法更丰富了。
4. 常见问题与排查技巧实录
4.1 拿到 Flag 却提交失败是怎么回事
最常见的原因是复制的时候把前后空格、换行符一起复制进去了,提交框通常做了 trim 处理,但也有不做的。建议提交前检查一下有没有多余空格,或者直接手动输入一遍 Flag。
第二个原因是 Flag 格式不一致。有些题目会明确告诉你 Flag 格式,比如 flag{}、ctf{},有些则是任意字符串。你从注释里找到的不一定是完整 Flag,可能只找了一半,注意看页面提示说明。
第三个原因是环境失效。这类在线平台的题目环境是动态分配的,有时你打开题目后被分配到一个已经失效的容器,页面显示异常。解决方法是返回题目列表,重新开启环境,等状态变成运行中再进入。
4.2 题目页面被 JS 干扰,右键失灵怎么处理
有些题目为了增加难度,会在页面里屏蔽右键菜单,禁止你方便地查看源代码。这是 Web 题目里常见的小把戏,在新手区偶尔也会碰到。
处理方法优先级从高到低:
- 按 Ctrl+U,查看源代码功能是浏览器层面的,页面 JS 无法拦截
- F12 打开开发者工具,在 Elements 面板手动翻找
- 用 curl 命令拉取页面源码,这是最彻底的方案
curl http://目标地址/curl 会直接把服务器返回的原始 HTML 打出来,题目页面上的所有 JS 小聪明在这个操作面前都不起作用。你从原始 HTML 里找注释、找隐藏字段,一找一个准。
4.3 备份文件猜解时一直 404,是不是思路错了
新手在 backup 题上卡住,九成是后缀猜解顺序不对,或者文件名不对。记住几个原则:先试 .bak,再试 .swp,然后试 ~ 结尾。如果入口页面提示的是 “backup” 单词本身,那也可以试试 backup.zip、www.zip、web.zip 这类打包文件名。
还有一个容易忽略的点:有些题目入口不是 index.php,而是 index.html。这时候猜 index.html.bak 是正确答案,但如果你一直盯着 index.php.bak 猜,就会一直 404。做题时先看清地址栏里的文件名,再决定猜什么。
第四个可能的原因是路径嵌套。备份文件不一定在根目录,有可能藏在 admin 目录或 upload 目录下面,这时候多尝试几条路径,比如 /admin/index.php.bak、/upload/index.php.bak。新手区的题一般不搞这么深,但你得知道这种可能性存在。
4.4 常见问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| robots.txt 访问 404 | 题目没有配置该文件,或者地址输错 | 检查域名端口是否正确,尝试 https 和 http 两种协议 |
| 备份文件下载后打开乱码 | 后缀猜对了,但文件是二进制压缩包 | 尝试改成 .zip 或 .tar.gz 后用解压工具打开 |
| 页面提示 Flag 不是当前形式 | Flag 格式变化(如 flag、ctf、{} 变化) | 仔细读题,看有没有格式说明 |
| 提交 Flag 后显示错误 | 复制多了字符或字符串不完整 | 本地新建文本文件粘贴,目视检查首尾字符 |
| 题目环境加载特别慢 | 在线容器分配中 | 等待 10 到 30 秒刷新,不要反复重开环境 |
| 页面右键菜单被禁用 | 页面 JS 屏蔽了右键 | Ctrl+U 或 curl 拉取源码 |
5. 做完这三道题之后,怎么继续进阶
5.1 补全信息收集的工具链
三道题做完,你会发现自己已经掌握了一套纯手工信息收集流程。下一步就是把这些手工操作工具化、自动化,最基础的三个工具值得马上上手。
一个是目录扫描工具,作用是自动枚举网站的目录和文件,把 backup 题里的后缀猜解过程变成自动化爆破。你可以理解成“人工猜名字太慢,让工具把几万个常见文件名都试一遍”。另一个是抓包工具,作用是拦截浏览器和服务器之间的流量,让你能修改请求参数、重放请求,后面做 SQL 注入和越权题时它就是主力工具。再一个是浏览器开发者工具的高级用法,尤其是 Network 面板和 Sources 面板,前者能看到所有网络请求,后者能看到所有前端代码和静态资源文件。
工具不重要、思路重要的说法是有前提的,前提是思路已经有框架了。你已经有基础思路框架,这时候上工具就是如虎添翼,而不是本末倒置。
5.2 学习顺序建议
按照 CTF Web 的常规学习曲线,我的推荐顺序是:
信息泄露类题先做到能独立归纳出常见敏感路径清单,然后去学 SQL 注入的原理和手工注入流程,接着学 XSS 和 CSRF,再往后是文件上传、命令执行、反序列化。
每一类题型都要保持“先手动后工具”的练习节奏。比如 SQL 注入,先手工判断闭合方式、手工统计列数、手工联合查询,弄清楚了再上工具自动跑。这样你对漏洞原理的理解深度会完全不同。
做完三道题你可能会有一种“就这?”的感觉,觉得题目过于简单。但请务必记住,简单题是用来建立通道的,不是用来展示天花板的。你在这些题里掌握的查看源码、访问敏感文件、猜解备份名,看起来平平无奇,却是之后所有高级 Web 攻击的基石。没有这一步的肌肉记忆,后面做越权、做信息收集绕过时你会到处碰壁。
我自己实操中还有一个体会:遇到新题卡住了,不要急着看别人的 WriteUp,试试能不能从“这三道题教会我的框架”里找到答案。先看源码,再看 robots,再猜敏感文件,这一套组合拳打出去,能解决六七成入门题的查找难题。剩下的才轮到搜索、查资料、看题解。这个习惯养成之后,你不只是在刷题,你是在建立自己的解题操作系统。
这部分内容后续还可以扩展的方向是:把等保测评和渗透测试的甲方视角也纳入进来。你会惊讶地发现,CTF 里学的这些“找 Flag”技巧,放在真实系统里就是合规高低检查里最关注的信息泄露排查点。带着这个视角回去看这三道题,每一题都变得更有重量。