☰
CTF入门:Web技能树与杂项交叉刷题路线实战经验
2026/10/15 6:14:57 网站建设 项目流程

刚接触CTF那会儿,我其实是不太敢碰Web和杂项的。Web题目看起来各种绕过规则,杂项题目则经常给人“毫无头绪”的感觉。但刷了一阶段之后,我反而觉得这两个方向是入门CTF最值得先啃的组合:一个练逻辑和漏洞思维,一个练脑洞和信息还原能力,而且两者都能用很短的时间拿到正反馈。如果你现在也在某个在线CTF平台的技能树Web方向上一道道地点亮节点,又在另一个题库站上刷着奇奇怪怪的杂项题,这篇文章应该能帮你把刷题路线理得更顺。

技能树的好处是题目已经被按考点切碎,比如信息泄露、文件包含、SQL注入、XSS都会单独列出来。你不需要像做综合赛题那样先花半小时判断这题到底考什么,只需要把当前这个考点的常见姿势吃透就行。杂项就不一样了,它更像一个“没有考纲的考纲”,同一张图片可能有十种藏法,同一个文件名可能有三种编码方式。把这两个方向放在一起刷,恰好形成一种互补:Web题逼着你严谨,杂项题逼着你发散。今天我就把自己刷这两个方向的经验、踩过的坑、以及整理的做题顺序完整写出来,希望能给正在这条路上摸索的人一点参考。

1. Web和杂项一起刷,到底图什么

1.1 技能树题目和综合赛题的差别

我看到不少人上来就啃综合赛题,结果一道题卡两个钟头,最后发现是多个考点串在一起,中间还藏着一步信息搜集。不是说综合赛题不能碰,而是对刚入门的人来说,先按考点分块的技能树更容易建立“题型→解法”的映射。技能树里的Web题通常只围绕一个核心漏洞,比如题目给了一个可以修改请求头的点,那八成就是考Header注入或者逻辑绕过;再比如给了备份文件下载,那就直接是源码泄露类。

这种单一考点的设计其实很适合做“最小闭环”:你知道这题考SQL注入,就专门练习判断闭合、构造union、读取表名,整套动作做完,你对这个知识点的记忆会扎实很多。综合赛题更像把这些最小闭环串起来,一旦遇到卡点,你很难判断是哪个环节出了问题。所以我的建议是,前期至少把技能树的Web方向刷掉大半,再回头去做往年的简单综合题,这时候你会发现自己的思路清晰了很多。

杂项就比较特别,它没有清晰的技能树边界。我刷杂项的时候经常要同时调动编码知识、文件结构分析和流量分析能力。也正因如此,杂项非常适合用来锻炼“耐性”——很多时候你面前就是一张看起来完全正常的图片,唯一的线索是文件大小有一点点异常。耐着性子用工具逐层拆、逐字节看,才是杂项的常态。

1.2 杂项为什么能锻炼“耐性”

我说得直白一点:杂项题不会像Web题那样给你一个URL让你打,它经常只给一个附件,剩下的全凭自己挖。比如一个非常普通的压缩包,文件名全是数字,打开需要密码,注释里有一串看不出含义的字符。第一次碰到这种题,脑袋是空的,但刷多了你会发现,密码不是藏在文件名里,就是在注释里,再不然就是伪加密,直接改标志位就能解。这个过程本质上是在训练你“遇到未知信息时该如何下手”。

动手之前先做一次简单的“上下文检查”也很重要:看一下文件格式是否与扩展名一致,用file命令确认真实类型,用strings抽一下字符串,再查看文件尾部有没有附加数据。这一串动作成了我刷杂项的条件反射,很多题在第一步就暴露了关键信息。我经常跟朋友说,Web考的是“你能不能想到这层”,杂项考的是“你愿不愿意把每一层都翻一遍”。

还有人会问,Web和杂项同时刷会不会分心?我的体验恰恰相反。Web刷累了去做两道杂项,反而像换脑子。而且杂项里的流量分析会用到很多HTTP协议的知识,对Web题也有帮助。比如有一次我做一道Web题,发现题目环境在响应头里塞了一个自定义字段,当时我立刻想起杂项里分析HTTP流量的经验,顺手就发现了这个隐藏点。这就是交叉学习的价值。

2. Web方向必刷的几类题目和我的解题思路

2.1 信息收集与备份文件泄露:别急着上扫描器

技能树里很多Web题起步都是信息收集。常见的有.git源码泄露、.svn泄露、www.zip备份文件、.DS_Store泄露、robots.txt里藏着后台路径,以及编辑器留下的index.php.bak这类临时文件。很多人一上来就挂目录扫描器,其实效率不高。我一般先手工看一眼页面源码,再试几个固定路径,比如/robots.txt、/.git/HEAD、/备份.zip、/www.zip,确认没有之后再用扫描器。

这里的关键是,你要理解泄露的本质:有些服务把不该暴露的目录或文件放在访问路径上。所以扫描器输出结果之后,不要只盯着200状态码,也要看看403、301可能暗示了什么。比如/backup/返回403说明目录存在但不可列,这时可以继续猜目录里的文件名,像我遇到过/backup/abc.zip这种弱命名。还有一个小技巧:看响应头里的Server和X-Powered-By,这些信息能帮你判断后端语言和中间件,后面构造payload的时候会省很多事。

2.2 SQL注入:从手工判断到绕过过滤

技能树上的SQL注入题基本覆盖了联合注入、布尔盲注、时间盲注、报错注入和堆叠注入。我建议你在用任何自动化工具之前,先手动完成一次完整注入流程,因为工具很容易因为过滤规则而失效,而且你看不懂工具报错时会无从下手。

手工的第一步是找闭合。假设一个URL是?id=1,你先试?id=1'、?id=1"、?id=1')、?id=1")),通过报错或页面差异判断闭合符号。第二步是确定列数,用order by N和union select 1,2,3...配合。如果union这里被过滤了,就得试大小写、注释符(/**/)、内联注释(/*!union*/)或者编码绕过。我还遇到过过滤掉空格的题目,这时候可以用%09、%0a、/**/替代空格,或者用括号把函数包起来。

盲注的场景更考验脚本能力。布尔盲注可以用ascii(substr(database(),1,1))>97这类条件构造,配合二分法写python脚本;时间盲注则用sleep()或benchmark()来制造延迟。我的经验是,把常用的payload模板保存起来,做题时只改表名和字段名,能节省大量时间。但更重要的是,你要理解每一步在查什么,这样即使题目换了过滤规则,你也能很快写出新的变体。

2.3 XSS与前端考点:重点在上下文和过滤

XSS题目在技能树里相对简单,但也在不断变化。常见的反射型XSS就是URL参数里的输入被直接塞进HTML,存储型则是输入被保存后在其他用户页面渲染。做这类题,先看输入点落在哪里:是在HTML标签内、属性内、script标签内,还是事件属性里。不同上下文要用不同的闭合和payload。

比如输入在<a href="你的输入">这里,如果过滤了javascript:,可以尝试大小写混写、HTML实体编码,或者用//注释符。如果输入在<script>var a = "输入"</script>里,你就需要先用";闭合字符串,再拼接恶意代码。技能树里有些题还会考CSP,这时候优先考虑是否存在unsafe-inline,或者能不能通过JSONP、跳转等绕过。我刷这类题的心得是:不要背payload,而是背“绕过的思路”。因为payload是固定的,而思路可以灵活变化。

2.4 文件上传、命令执行与反序列化:进阶分支的准备

文件上传题考的是服务器如何校验文件。从扩展名黑名单、Content-Type校验,到文件头校验、图片马,再到解析漏洞和.htaccess重写,每一步都设计得有迹可循。我刷题时会先把常见的上传测试流程固定下来:先传一个最普通的shell.php看看反应,再改Content-Type,再试双写后缀,再试%00截断,最后试图片马配合文件包含。虽然很多姿势已经过时,但在技能树里依然能帮你理解校验逻辑的演化。

命令执行题则集中在各种拼接技巧上。比如过滤了空格就用$IFS或%09,过滤了cat就用tac或more,过滤了/就用$(dirname ...)或者变量拼接。还经常考用;、|、&&、||来连接多个命令。最重要的是先判断是命令注入还是代码执行,不同的输入点对应不同的利用方式。

反序列化属于进阶内容,通常在技能树的后置节点。这类题要求你读懂代码,找到入口类的魔法方法,然后构造一个满足条件的序列化字符串。很多题目不会直接给你源码,而是通过phpinfo或报错信息泄露类名。如果时间紧张,可以把这类题放到后面刷,优先把前面的基础类考点吃透。

3. Misc杂项的常见考点与工具链

3.1 从编码到古典密码:一眼认出来的本领

杂项里最基础也最常出现的,就是各类编码和古典密码。base64、base32、十六进制、URL编码、Unicode编码、HTML实体编码、ASCII码转字符,这些都是送分题,但前提是你要能认出来。比如一段字符串只有大写和小写字母,结尾没有=,大概率是base32;如果全是%开头,就是URL编码;如果看到一堆&#开头,那就是HTML实体编码。

认出来之后用什么工具都行,在线工具或命令行都方便。我一般更愿意用脚本处理,因为有些题目会嵌套编码,比如先base64再反转字符串,再十六进制解码。用python写几十行就能灵活完成。古典密码里凯撒、维吉尼亚、培根、栅栏、摩斯也比较常见。遇到维吉尼亚的时候,如果不知道密钥,可以先用重合指数判断语言,再用卡方检验爆破密钥长度,这一步很多线上工具直接能出。我的建议是不要死记工具名,而是理解底层逻辑,否则换个编码变体你又不会了。

3.2 图片隐写:从文件尾到像素通道

图片是杂项的重灾区。拿到一张照片,第一件事永远是看文件尾有没有附加数据。用十六进制编辑器打开,直接跳到末尾看有没有PK(zip文件头)或者IHDR后面的异常数据。很多简单的图片隐写题就是在图片后面直接追加一个压缩包或txt,你把文件尾复制出来另存就能解。

如果文件尾没有东西,就检查宽高。PNG的IHDR里保存了宽高值,修改高度后图片会显示不全,下面可能藏着另一张图或flag。怎么判断原本的高度?可以通过CRC校验值爆破宽高组合。这一步我在技能树里刷到过好几次,技巧就是先用pngcheck看报错,再根据CRC值反推真实高度,改完二进制里对应的字段后图片就完整了。

再进阶一点就是LSB隐写。图片每个像素的最低有效位可以用来藏信息,常见工具可以把RGB各通道的LSB提取成黑白图或字符串。拿到题后可以用图像分析工具逐通道看,如果发现某个颜色通道有明显规律,那十有八九是LSB隐写。这类题有时候还会配合Steghide这类工具,输入密码后才能提取,密码一般会在文件名或描述里提示。我的流程是:文件尾→PNG宽高→通道分析→隐写工具,这样基本能覆盖大部分图片题。

3.3 流量包分析:养成“先统计后看流”的习惯

流量分析题一般给一个pcap文件,让你从网络通信里找flag。很多人下载后直接打开一顿翻,效率很低。我习惯先用工具看统计信息,比如协议分级、端点列表,快速了解这个流量包里有什么协议占大头。如果是HTTP类,直接筛选http,然后看请求路径和响应;如果有DNS,就注意看有没有奇怪的子域名;如果是USB或蓝牙流量,那就是另一套玩法,但技能树里相对少。

看HTTP流的时候,优先找包含flag、key、password、token字符串的包,可以直接用ctrl+F搜索。有些题会把flag拆成几段放在不同包,比如一段在响应头里,一段在POST数据里,这时需要按TCP流跟踪来看。我还遇到过把flag进行base64编码后放在Cookie里的题,如果不看请求头根本发现不了。所以习惯不要只看body,响应头、请求头、Cookie都要扫一遍。

3.4 压缩包考点:伪加密、爆破与明文攻击

压缩包是杂项另一种高频题型。拿到一个加密的zip,先别急着爆破。第一步看压缩包里的文件列表,如果文件名、注释、大小都正常,再尝试伪加密。ZIP的伪加密标志位在文件头里,一般把加密标志位从01改成00就能正常解压。这个操作用十六进制编辑器直接改,或者用现成的修复工具都行。

如果真是加密的,并且文件很小,可以尝试CRC32碰撞。当压缩包内的文件只有几个字节时,暴力枚举文件内容再比对CRC32比爆破密码更高效。再弱一点的口令可以直接拿字典跑,很多题密码就是123456、password、flag这类弱口令。更进阶的是已知明文攻击:如果你知道压缩包内某个文件的部分内容,可以用明文攻击还原密钥,不过技能树里遇到的不多。我的建议是,不管什么压缩包,先看注释和文件名,很多密码就写在你看得见的地方。

4. 我的刷题节奏、笔记方法和目标管理

4.1 刷题顺序和每日安排

见过不少人一天狂刷二十题,刷完就忘,过一周看到同一道题还是想不起来。我现在的节奏是一天最多认真刷五题,重点不是数量,而是每道题都能讲清楚“为什么这样解”。我会把Web和杂项穿插起来,比如晚上一小时,前半小时做Web技能树上的两三道题,后半小时做一道杂项。如果Web卡壳了,就停下去做杂项,让潜意识消化一下,再回来往往会有新思路。

刚开始刷的时候要允许自己看题解,但不建议直接看完就过。我会在题解里标出“这是我没想到的关键点”,然后把关键点记到笔记里。比如某道SQL注入题过滤了关键字select,但用/**/分隔一下就绕过了。这个点就是值得记的。如果你能坚持两周,笔记里就会积累出一张“绕过姿势地图”,之后做题会越来越快。

4.2 怎么整理错题才不白刷

我的笔记体系很简单:每个题目一行,包含题目类型、考点、我的卡点、解法核心。比如“文件包含-日志注入-没找到日志路径-用phpinfo泄露路径”。这样以后复习时,扫一眼就能想起整道题的脉路。我还喜欢给常见考点打标签,比如SQL注入、伪加密、LSB,方便临时找同类题。

定期复习也很重要。我每周会花半小时把本周做错的题重新过一遍,不重新做,只看考点和解法,然后默想一下如果再做一次会从哪里下手。这个动作看起来简单,但对加深记忆特别有效。实际上,很多人在刷题时反复踩同一个坑,就是因为没有把卡点沉淀下来。

4.3 从技能树走向综合赛题

等你把技能树刷得差不多,或者某个方向的小类都刷通了,就可以去尝试一些往年的小型比赛题。综合赛题和技能树的区别在于,它不会告诉你考点。我一般会在拿到题后先做一次“考点预判”,观察页面功能,尝试输入点,再决定从哪个方向入手。如果题目是文件上传,但一直传不上去,可能前面的信息收集就没找到真正的后台。这些经验只能靠多打多练积累。

我个人的建议是:在技能树刷到一半时,就可以每周参加一次短时赛,只挑Web和杂项做,不求拿奖,就用来检验自己能不能独立分析一道陌生题。赛后再对照题解看自己漏在哪,这才是综合能力增长最快的方式。

5. 踩坑记录:这些错误想必你也遇到过

5.1 flag格式和提交姿势

先提一个最让人哭笑不得的问题:明明解出了flag,提交却不通过。很多时候是格式问题。有些题flag是flag{...},有些是ctf{...},还有些可能是flag{ }中间带空格。提交前仔细看题目描述里的提示,再用记事本确认一下有没有复制到隐藏字符。还遇到过flag在页面源码注释里,但被HTML实体编码了,复制下来是乱码,需要解码再提交。

另一个容易忽略的是,有的Web题flag在响应头里,普通浏览器看不到,但你打开开发者工具就能找到。如果你用的是代理抓包工具,记得看原始响应,别只看渲染结果。这些小细节虽然简单,但在比赛里往往是最浪费时间的。

5.2 环境变化与浏览器缓存

技能树平台的题目环境经常是动态容器,有时候你第一次访问和第二次访问IP会不一样。如果一道题你改完payload突然打不到了,先看一下当前环境是不是又开了一个新实例。另外,浏览器缓存也可能干扰你的判断。比如你修改了POST数据,但因为缓存原因服务端收到的还是旧值,页面表现一直不变。这时候清一下缓存,或者在请求头加一个随机参数,往往就好了。

我还遇到过因为本地调试工具篡改了User-Agent导致服务端返回异常的情况。所以做题时如果结果非常奇怪,先确认工具设置是不是默认状态。脚本类题目就更要注意,比如使用requests库时带了旧Cookie,可能被服务端识别成之前的用户。

5.3 工具误判和版本差异

杂项工具很容易出现误报。比如strings在二进制里会抽出一堆乱码,从中找flag时得过滤长度:太短的字符串基本都是噪声。还有图片分析隐写工具,某些通道显示出来只是一些随机的彩点,不代表一定有隐写。判断依据要看像素分布是否有规律,而不是单纯凭颜色鲜艳程度。

另外,不同工具支持的文件格式不一样。有的工具对PNG支持得很好,对BMP就有些问题。遇到工具打不开或者报错,换个工具或者直接用脚本分析,不要在一棵树上吊死。我记得有一次用某个图片隐写工具跑一张BMP图,输出全是乱码,后来改成手动提取像素位,一下就出了flag。

6. 一点小技巧:细节决定做题速度

最后分享一些我实际刷题过程中总结出来的效率技巧。这些不算什么高深知识,但用好了真的能省不少时间。

  • Web题打开页面后,第一件事先看响应头。Server、Set-Cookie、X-Powered-By、自定义字段都可能暴露信息。我有一道题就是靠响应头里一个X-Flag-Path字段找到了后台路径。
  • 提交flag前用文本编辑器确认一下,避免复制到不可见字符。也可以把flag内容先做一次URL解码,防止是编码后的格式。
  • 杂项题遇到文件时,先识别文件类型,再改名成正确的扩展名。很多时候直接把没有扩展名的文件改成.zip或者.png就能打开,提前发现线索。
  • 用脚本处理重复操作时,记得把脚本保存下来并注释好用途,否则过几天你都不知道这个脚本是干嘛的。我的脚本文件夹现在已经有几十个按功能命名的小工具,遇到类似题目直接改参数就能用。
  • 流量分析题里,可以先搜索协议关键字,比如http、dns、smb,再用follow tcp stream看完整会话,比肉眼翻包高效很多。
  • 关于在线工具,不要依赖某一个网站,备一两个离线工具和本地脚本。有时候在线工具会限制输入长度或者不准确。

说实话,刷CTF这件事,耐心比天赋重要得多。我见过一开始上手极快、但遇到难题就浮躁的人,也见过刷得很慢、但每道题都吃透的人,后者往往几个月后反而领先。Web技能树和杂项这两个方向,恰好一个训练严谨的逻辑,一个训练开放的脑洞,搭配起来刷,会让你的思路更加立体。如果你现在刚起步,不用急着追进度,按自己的节奏把每道题吃透,把每个坑记下来,积累一段时间后回头看,你会发现自己已经能独立解出很多曾经想都不敢想的题了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询