CTF圈子里有个常见现象:新人拿到一套题目,打开一看全是英文界面,不知道先点哪儿、再看哪儿,最后只能对着源码发呆。如果有个系列能把Web方向最典型的几种漏洞按难度排好队,一题一题带你过一遍,那入门成本会低很多。CTF-SHOW-WEB(1-9)就是一套很适合干这件事的题目,它不烧脑,也不搞偏门,就是把信息泄露、SQL注入、文件包含、命令执行这些Web方向最常见的考点挨个串了一遍。
这篇内容我会按自己做题时的思路顺序,把这九道题的考察点、解题思路、常用工具和踩坑经验完整拆开讲。不管你是刚接触CTF,还是已经刷过一些题但思路还比较散,这篇内容都能帮你把Web方向的知识点串成一条线。
1. 整体设计思路:为什么这套题适合用来搭Web入门的骨架
先说结论:这套题最有价值的不是某道题的答案,而是它覆盖考点的排列顺序。从第1题到第9题,难度不是随机跳的,而是按“信息收集 → 简单利用 → 组合利用”这条路径在走。理解这个顺序,比背会某个payload更重要。
1.1 从信息收集开始是CTF Web最合理的起点
很多新人拿到Web题第一反应是找漏洞、测注入,但其实CTF Web的第一道关往往是信息收集。我用这套题的前三题实际测下来的感受就是:它把你往查看源码、检查响应头、目录探测这些方向上去引导,这些能力在后面的题目里会反复用到。
比如第1题的做法,核心就是看页面源码。很多人觉得这不算技术含量,但真正做题时你会发现,不少人第一反应是去扫目录、跑字典,而不是先按下F12。我见过太多人把简单题做复杂,就因为在信息收集这一步跳过了最基础的源码审计。
这套题的高明之处就在这里:前几题用最基础的手段就能解,逼着你养成先把已知信息看全的习惯。工具用多了之后,人会本能地依赖自动化扫描器,但实际上CTF题目里大量提示就放在响应头、注释、备份文件这类地方。
1.2 题号顺序对应着Web漏洞的典型利用链路
从第4题开始,题目从前三题的“信息获取型”转向了“漏洞利用型”。SQL注入、文件包含、命令执行,这些才是CTF Web里真正高频出题的方向。做这套题时的体验是:它不会直接丢一个复杂的过滤绕过给你,而是先把最朴素的利用方式呈现出来,让你先搞清楚漏洞长什么样,再考虑怎么绕过。
第7题到第9题则开始叠加思路,比如正则绕过、空字节截断、编码问题,这些不再只是“找到漏洞就能解”,而是要在利用过程中处理各种限制条件。这其实就是在模拟真实渗透测试的思考模式:找到入口只是第一步,能不能在限制条件下完成利用,才是拉开差距的地方。
1.3 这套题适合谁,怎么用效率最高
如果你是刚接触CTF的Web方向,我建议的打开方式是:不要直接搜答案,而是每题至少自己折腾20分钟。前三题可以练信息收集的手感,中间三题练对参数和漏洞点的敏感度,后三题练绕过思路。
如果已经有一定基础,但做题总是“知道知识点却不知道从哪里下手”,这套题的价值在于帮你找回从零推导的耐心。因为它的题目设计不会故意卡你,大部分题目的考点只要认真看源码和请求,都能找到明确线索。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析:前1-3题的信息收集节奏
很多新人容易忽略一个事实:CTF赛题的源码、注释、响应头、Cookie、JS文件,这些东西每一样都可能是考点。我来逐个拆一下这套题里前三题的具体细节。
2.1 源码里的注释是最常见的送分点
第1题把flag直接放在HTML注释里,这题本质上考的是“你会不会看源码”。具体操作是:打开页面 → 按F12 → 在Elements面板里翻一遍HTML结构。注释内容在CTF里太常见了,很多题目的提示就藏在<!-- -->里。
我遇到不少新手会卡在这一步,原因很简单:他们拿到题目后就去扫描目录,或者试各种注入payload,完全没想过先做最基础的检查。这种思维习惯特别需要纠正,因为在真实的CTF比赛中,每道题的时间都很宝贵,先花两分钟看完源码和响应头,往往能直接跳过一个小时的无效扫描。
2.2 响应头里的信息往往比源码更隐蔽
第2题考察的是响应头,这个方向很多新人不会主动去看。操作方式是:用浏览器开发者工具的Network面板刷新页面,查看响应头字段。这里的考点是自定义响应头字段,flag会被放在某个不常见的位置。
做这题时我自己有个习惯:刷新页面前先把开发者工具的Network面板清空,这样每次请求的响应头变化都能看得清清楚楚。另外要注意的是,即使没有自定义字段,服务端版本号、框架特征这类信息也会出现在响应头里,这些都是后续利用环节的重要线索。
2.3 隐藏文件与目录探测的区别和联系
第3题考察的是备份文件泄露,这里需要用目录扫描工具去寻找带后缀的备份文件。常见工具就是dirsearch或者御剑,但实际用下来dirsearch的字典更全一些,覆盖面广。
需要注意的细节是:这类的思路和传统目录爆破有所不同,因为目标不是找管理后台入口,而是找像.bak、.swp、.txt这类备份文件。字典的选择很重要,如果字典里根本没有.bak这个后缀,工具跑多久都白搭。我自己常用的做法是直接用dirsearch的默认字典,然后手动把常见备份后缀补充进去。
这里还有个经验可以分享:不要只扫当前目录,备份文件也可能放在上级目录或者/backup、/temp这类路径下。虽然这套题里用基础扫描就能解,但这个习惯在真实环境的渗透测试里很有用。
3. 实操过程与核心环节实现:SQL注入题的思路演进
从第4题开始进入SQL注入,这是CTF Web中出镜率最高的漏洞类型之一。我把它拆成“发现注入点”到“构造payload”的完整链路来讲。
3.1 判断注入点:单引号报错法是基础
判断某个参数是否存在SQL注入,最基础的方法就是在参数值后面加一个单引号,观察页面是否报错或返回异常。第4题的注入点在一个登录框或者一个查询参数上,具体形式是直接在URL参数后面拼单引号。
这个判断方法虽然老套,但我见过太多人跳过这一步直接上sqlmap。sqlmap确实好用,但前提是你得先确认注入类型和注入点位置。很多情况下,手工判断反而比跑工具快,尤其是当题目存在过滤时,sqlmap的默认payload很可能被直接拦掉。
3.2 联合注入和布尔盲注的选择逻辑
拿到注入点之后,下一步是确定注入类型。如果是联合注入(UNION based),直接用order by判断列数,然后union select出库名表名。如果是盲注,就需要用substr和ascii这种逐字符判断的方式。
第4题到第6题的深入方向就是联合注入和盲注的配合。我个人的建议是:不管题目能不能用联合注入,都要把盲注的payload写法练熟,因为它在真实比赛中的出场率远高于联合注入。
判断列数的payload长这样:
sql复制1' order by 1--+
1' order by 2--+
1' order by 3--+
当order by的数字超过实际列数时页面会报错,用二分法或逐个尝试就能确定列数。得到列数后,接下来就可以试联合注入了。
3.3 从MySQL到各种绕过姿势的迁移
第5题和第6题开始引入一些简单过滤,目标是不让你直接用空格、select、union这些关键词。到这里就需要掌握MySQL特有的绕过姿势了。
我用过几种比较稳的方式:
- 用
+替代空格,比如1'+union+select+1,2,3--+ - 用注释符
/**/替代空格 - 大小写混写绕过(不过现在直接大小写通过的可能性越来越低)
- 内联注释
/*!50000select*/绕过
这里要特别提示一个新手容易踩的坑:很多过滤规则只过滤了空格,没过滤制表符和换行符。也就是说%09(Tab)、%0a-(换行符)这类URL编码字符可以被用来替代空格。我在实际做题中发现这个技巧的存活率相当高。
4. 从文件包含到命令执行:难度跳变的经典路径
第7题开始,这套题目进入文件包含(File Inclusion)和命令执行(RCE)的范畴,这两种漏洞的本质都是“代码或文件被以你预期之外的方式解析了”。
4.1 文件包含的几种利用思路
文件包含分为本地文件包含(LFI)和远程文件包含(RFI)。第7题的典型考法是本地文件包含,利用点是让页面直接读文件,读取目标通常是/flag或flag.php这类路径。
我最常用的是伪协议,比如:
text复制?file=php://filter/read=convert.base64-encode/resource=flag.php
这个payload的作用是把目标文件的内容以base64编码的方式输出,避免直接解析PHP代码导致看不到内容。为什么用base64?因为如果直接包含PHP文件,服务端会执行里面的代码,源码就看不到了。经过base64编码后,源码以编码形式输出,解码就能拿到完整内容。
这套题里有一个细节值得注意:第7题直接包含了flag.php,但如果不加php://filter伪协议,页面不会显示任何内容,因为你看到的是PHP执行后的结果。这个思路放到实战里也很关键,很多框架的模板文件、配置文件都需要用这种方式读取。
4.2 正则过滤和空字节截断的实际操作
第8题引入了正则表达式过滤,它们会过滤掉一些危险字符,但同时也会漏掉一些组合。遇到这种题先不要急着看答案,而是把过滤规则Studying一遍,想想哪些字符不在规则里。
我曾经卡在这道题上有一段时间,原因是自己只想着构造完整的system('cat flag.php'),没考虑到可以先用通配符绕过。比如cat f*这种写法,不用完整写文件路径,只要匹配到目标文件就行。正则过滤的题核心思路就一句话:过滤规则只拦精确匹配,它就拦不住通配和拼接。
空字节截断也是一个经典技巧,虽然在新版本PHP里已经失效,但老版本环境下依然能用。它的利用原理是:%00会让某些C语言风格的字符串处理函数认为字符串到此结束,从而截断后续文件名。
4.3 命令执行的参数拼接与绕过
第9题涉及命令执行,通常是代码里直接拼接了用户输入,比如system("ping " . $ip)这样。这里的实际操作思路是:在参数后拼接命令分隔符,比如|、||、;、&&、%0a换行符,然后跟上要执行的命令。
拿这道题来说,如果您传入的参数可以在命令行里执行,就可以用|管道符把前后命令串起来。这里最关键的操作是先确认哪些特殊字符没有被过滤,如果同时过滤了分号和管道符,就需要换用%0a这类换行符拼接。CTF的考点往往在于查漏补缺,而不是暴力绕过。
5. 常见问题与工具链的实测心得
做题过程中一定会踩坑,我把这套题里最高频的问题和解决思路整理成一张速查表,方便边做边查。
5.1 高频问题速查
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
| 目录扫描跑完没有结果 | 字典里没包含目标文件类型 | 手动补充.bak、.swp、/.git等路径再跑一次 |
| 单引号加在参数后页面无变化 | 可能不存在注入,或者参数为数值型 | 尝试去掉单引号直接试1 and 1=1 |
| union注入返回列数不匹配报错 | order by列数判断错 | 换更大的数字用二分法重试 |
| 文件包含后页面空白 | 目标文件为PHP格式被解析 | 改用php://filter伪协议读取源码 |
| 命令执行分隔符被过滤 | 过滤规则限制死部分符号 | 试%0a、%09等URL编码字符替代 |
5.2 工具链的组合使用心得
做这套题我用到的工具组合是:浏览器开发者工具 + dirsearch + HackBar插件 + Burp Suite。实际使用感受如下:
- 浏览器开发者工具主要用来看响应头、Cookie、源码结构和网络请求,这套题里前两题基本用它就能搞定。
- dirsearch用于目录扫描,字典选择很关键。跑完后要仔细看返回状态码200或302的目录,不要忽略任何一条结果。
- HackBar用于快速构造和修改请求,尤其是SQL注入和命令执行payload时,比手动改URL高效得多。
- Burp Suite主要用于抓包分析和重放攻击。遇到需要修改Cookie、伪造请求头,或者直接看服务端响应情况的题目,它是首选。
5.3 做CTF题最容易丢分的三个习惯
第一,不看响应头。很多人只看页面渲染结果,却忽略了响应头里的大量信息。第二,过度依赖工具。sqlmap不是万能的,当目标站有防护时,sqlmap默认跑不出结果,这时候手工注入能力就特别重要。第三,不做笔记。做一题忘一题,同一类型的payload下次还得重新百度。我的建议是,专门用一个笔记工具记录每次解题的payload和思路。这套题虽然不难,但九道题做完后如果能整理出一份自己的笔记,收获会有明显提升。
6. 实操过程中的其他体验
关键词、工具、思路都讲完了,后面说一点偏个人向的经验。
我刷这套题的整体进度比较快,前几题基本是看完源码就出flag,后几题反复试了几次绕过方式也顺利通过。整套题做下来的体感是:它的难点不在单点知识,而在你能不能快速定位到考点所在的位置。
有一个体会值得分享:做题时如果你在一个地方卡了超过半小时,大概率不是题目太难,而是思路走偏了。 CTF题目的设计原则之一是“考点必须能在合理时间内被选手发现”,如果长时间卡住,回头看看是不是漏了响应头、源码注释、请求方法这类基础信息,往往会有收获。
我也把每个题当天的实测记录做了个简单的复盘表,方便自己后续复习时快速浏览:
| 题号 | 核心考点 | 最快路径 |
|---|---|---|
| 1 | 源码注释 | F12查看HTML |
| 2 | 响应头信息 | Network面板看Headers |
| 3 | 备份文件泄露 | 目录扫描+手动补字典 |
| 4 | SQL注入判断 | 单引号判断+联合注入 |
| 5 | 过滤绕过 | 空格替换与注释符利用 |
| 6 | 盲注判断 | 布尔盲注逐字符提取 |
| 7 | 文件包含 | php://filter伪协议 |
| 8 | 正则绕过 | 通配符与编码绕过滤 |
| 9 | 命令执行 | 分隔符拼接与命令组合 |
这套题真正让人受益的地方在于,它让我意识到Web方向的题目不管外壳怎么变化,核心思路都是围绕“输入 → 处理 → 输出”这条链路在转。你能控制哪个环节,就能在哪个环节做文章。希望这篇拆解能帮你在刷这套题时少走一些弯路。
