☰
ISCTF2021参赛复盘:新手CTF入门从懵圈到摸门道
2026/10/2 9:20:27 网站建设 项目流程

ISCTF2021 参赛复盘:从开场懵圈到勉强会做,三天里我踩过的坑和摸到的门道

说来有点不好意思,我开始系统学 CTF 的时间并不长。2021 年那阵子,我刚好把 Web 方向的注入、XSS、文件包含这些基础点挨个过了一遍,又在各种练习网站上刷了些题,自我感觉挺良好,就想着找场比赛试试水。ISCTF2021 就是这么来的。那几天正好有空,比赛周期也不算长,我抱着"反正打不完也能学到东西"的心态报了名,结果一进去就被现实教育了:知道思路和能在有限时间内把思路变成 flag,中间隔着的不是一条街,是一整片工地。

这篇文章不打算写成标准题解手册,更多是从一个普通参赛者的角度,把 ISCTF2021 里我实际碰到的题目类型、解题时踩过的坑、以及赛后复盘出来的一套学习路径整理出来。如果你正准备打第一场 CTF 正赛,或者打过一两场但总觉得"会做的题太少、不会做的没头绪",这篇应该能给你一点有用的参考。

1. 参加 ISCTF2021 之前,我对"比赛"这件事的误解

1.1 以为会做题就能拿分,其实"比赛节奏"才是第一道坎

在此之前,我在练习平台上的节奏是:打开一道题,慢慢翻资料,实在不行就原地坐下查几个小时的文档,没人催我。但到了 ISCTF2021 这种正式赛制里,排名是按解题时间和题目分值动态算的,心态完全不一样。我第一个晚上就吃了这个亏:别人开局先扫一遍所有题目的类型分布,挑软柿子捏,我却在签到题上磨磨蹭蹭,非要自己手动把每一步都搞清楚,结果一道签到题花了快四十分钟。

那之后我总结出一个血泪教训:正式比赛的第一原则不是"把题做对",而是"在最短的时间内把能拿的分拿到手"。签到题、简单 Web、简单杂项,这些东西考的往往不是智力,而是你对手头工具和常见套路的熟练程度。我后来看到身边有人五分钟交掉三道签到题,再去慢慢啃难题,这就是比赛节奏的差别。ISCTF2021的题目梯度其实做得挺友好,前面几道基本是给选手热手的,真正区分差距的是你从"热手"切换到"攻坚"的速度。

1.2 队友分工和独立作战的取舍

ISCTF2021 允许组队,我和两个朋友组了个三人小队。一开始我们没什么配合策略,三个人同时扎进同一道题里,浪费了不少人力。后来我们把方向拆开:一个人主攻 Web,一个人主攻杂项和密码学,我负责签到、流量分析之类的边角料,以及给队友查资料、当外援。拆开之后效率立刻上来了,而且每个人的心理压力也小很多。

这里想多说一句:如果是第一次组队打比赛,别急着追求"全栈",先把队友各自擅长的方向摸清楚,让每类题目都有一个明确的负责人。哪怕某个方向大家都不会,也要指定一个人去临时抱佛脚,另外的人继续推进自己手上的题。CTF 比赛的时间窗口很宝贵,最忌讳的就是三个人排成一排,在同一道题上集体卡死。

2. 赛前准备清单:工具、环境、练习平台,一样都不能临时抓瞎

2.1 比赛机的环境搭建思路

ISCTF2021 多数题目是给你一个靶机地址或附件,用浏览器就能开始打,本地环境压力不算大。但我还是花了半天时间把比赛环境重新梳理了一遍,事实证明这个动作非常值。我用的是一台装了 Kali 的虚拟机,赛前把下面这些东西全部装好、更新好:

  • Burp Suite Community,用来抓包改包,Web 题基本离不开它;
  • Python 3 环境,加上 requests、pycryptodome、Pillow 这些常用库,处理脚本题和密码题用;
  • CyberChef,做编码转换和简单密码分析的神器;
  • 随波逐流工具箱,这个对新手尤其友好,编码、进制、古典密码一键试;
  • 010 Editor,处理文件结构、看 PNG 头部和二进制细节用;
  • StegSolve 和 zsteg,杂项隐写题的老搭档。

赛前一晚我把这些工具挨个打开跑了一遍,确保没有环境报错。这个习惯推荐给所有准备打比赛的人,尤其是新手——比赛开始后最难受的事情不是你解不出题,而是你要装依赖、配环境、找工具,时间就这么白白流走了。ISCTF2021 里有一道题我上来就通过 StegSolve 看到颜色通道不对劲,如果那时候还在装工具,估计心态直接就崩了。

2.2 练习平台的选择:刷题和打正式赛是两回事

ISCTF2021 之前,我大概花了一个月在练习平台上刷题。当时用得最多的是 CTFshow,界面友好,题型分类清楚,Web、杂项、密码学都有入门级的题可以刷,很适合新手建立手感。后来朋友推荐了 Polar CTF,上面有不少脑洞题,难度比纯入门稍微高一点,刚好能逼你跳出"照抄模板"的舒适区。

我的感受是:练习平台上的题,尤其是入门区的题,往往知识点指向性非常明确——题目告诉你这题考命令执行,你就往命令执行的方向想。但 ISCTF2021 这种正式比赛不是这样,它会把知识点藏起来。比如有一道题表面上是普通的查询功能,你想要继续推进,得先意识到注入点在参数里,然后还要绕过过滤,最后才能得到 flag。这个过程练习平台上的"标签提示"给不了你,只能在比赛里逼着自己养成分步猜想的习惯。

2.3 命令行基本功:小命令的关键时刻能救命

热搜词里有一条很扎眼:"ctf渗透题目会用到的kali命令"。说实话,我在打 ISCTF2021 之前也搜过这个。真正上场之后,我发现最常用的其实不是那些听起来很酷的"渗透命令",反而是最基础的东西:ls、cat、find、grep、curl、nc。尤其是遇到命令执行的题目时,能不能快速用一条命令把目录列出来、把文件内容打出来,直接决定了你在这道题上花十分钟还是一个小时。

我后来养成了一个习惯:把常用的命令执行绕过手法、读取文件的几种姿势、反弹 Shell 的模板,全部整理成一个小抄本放在手边。这不是作弊,而是把"工具化记忆"从大脑搬到纸上,节省比赛里的短时记忆负担。ISCTF2021 里那道命令执行的题目,我最后就是靠着小抄本上的空格绕过和passthru参数组合,一步一步把 flag 拼出来的。

3. 实战题解复盘:Web、密码学、杂项里的典型题目是怎么拆的

3.1 签到题与简单杂项:别小看"浪费时间"的题

ISCTF2021 的签到题大多是送分性质的,但送的姿势不太一样。有的直接在网页源码注释里藏着,有的在返回头里塞 flag,有的则要你把一张二维码翻过来看。我记得有一道题给了个二维码图片,扫出来是一段被倒序的字符串,再倒一次才是 flag。这种题放到平时做,三分钟搞定,但比赛时大家都在抢时间,反而容易看漏。

杂项方向里有一类高频题,考的是文件分离和隐写。比如给你一个压缩包,里面放着一张图片和一个加密的提示文件,图片用binwalk拆分之后又能抽出一段隐藏信息。ISCTF2021 的杂项题在这方面很典型,考的不是你懂不懂高深算法,而是你有没有养成"拿到附件先查文件类型、先strings、先binwalk"的习惯。

这里给个具体的操作顺序,是我打比赛时反复用的套路:

  1. 先把附件放到虚拟机里,file看一下真实类型,别被扩展名骗了;
  2. 用binwalk检查有没有隐藏文件,有可疑偏移就拆出来;
  3. strings扫一遍可见字符串,很多 flag 就躺在里面,只是你没看;
  4. 若是图片,打开 StegSolve,按颜色通道、LSB 逐层翻一遍;
  5. 若是压缩包,留意是否伪加密——把压缩包头部标志位改回去就能解开的情况很常见。

3.2 Web 方向:命令执行和参数注入是重头戏

之前搜过"ctf 命令执行 passthru",这正好对应 ISCTF2021 里让我印象很深的一道 Web 题。题目是这样的:页面给你一个输入框,看起来能执行系统命令,但你输入ls之后发现没反应。F12 看源码,发现后端把system、exec、shell_exec这些常见函数都禁用掉了,但有一行注释提示说passthru还能用。

问题在于,只允许一个函数还不够,输入里还过滤了空格。我当时试了很多姿势都不行,后来查资料才想起来,Linux 下可以用${IFS}代替空格。于是构造了类似这样的 Payload:

passthru('ls${IFS}./');

这是把ls和路径参数用${IFS}拼起来绕过了空格过滤。列出文件之后,发现根目录下有个flag_is_here.txt,再接一步读文件:

passthru('cat${IFS}flag_is_here.txt');

flag 到手。这道题本身不算难,但它提醒了我一个非常重要的点:命令执行类题目的本质,是把"代码逻辑漏洞"转化为"命令构造能力"。你不需要真的会渗透一个真实系统,但你必须熟悉 Linux 的 Shell 语法、特殊变量、通配符这些基本功。很多人卡在这里,不是不知道passthru可以做命令执行,而是不知道空格还能被${IFS}替代。

Web 方向另一类绕不开的是 SQL 注入。ISCTF2021 里有一道题,标题风格很像热搜里说的"小小查询系统"——你往输入框里输一个 id,页面会回显对应的用户名,但当你输入一个带单引号的 id 时,报错信息特别奇怪,不是经典的"SQL syntax error",而是把一部分 SQL 执行结果显示出来了。这就非常典型:盲注或者报错注入的入口。

当时我试了1' and extractvalue(1, concat(0x7e, (select flag from flag), 0x7e))-- -这种经典 Payload,发现点没找对。后来仔细看报错信息,自己拼出真正的查询语句结构,才发现注入点在数字型参数里,加单引号反而会触发异常分支。于是调整思路,用1 and extractvalue(...),去掉引号,很快就拿到 flag 了。这个案例我会放在后面单独讲,因为它是我那场比赛里成长最大的一道题。

3.3 密码学:古典密码基础决定你上分的下限

密码学方向一直被很多人当成"数学题",但我打 ISCTF2021 的感受是:比赛里的密码题,尤其是入门难度,更多是"识别加密方式"的题。你不需要从零推导 RSA,但你需要一眼认出这是凯撒、栅栏、维吉尼亚,还是某种替换密码。

当时有一道题给了你一串字母和一句提示"我只记得这是单表替换",这种题用人力去猜会吐,直接打开 quipqiup(一个在线替换密码分析工具)把密文丢进去,几秒钟就跑出可读的明文。这个工具我赛前是完全不知道的,是卡了二十分钟之后搜出来的。现在回想起来,工具本身并不神秘,它靠的是英语字母频率统计和单词匹配。但要是你不知道有这种工具,自己手工去猜替换表,比赛时间就这么耗没了。

还有一类高频考点是"键盘坐标密码"。比如给你一串qwe...之类的字符,看上去毫无逻辑,但实际上是把键盘上的按键位置映射成坐标,再翻译成明文。这类题在几家平台上都出现过类似版本,要是你之前刷过,基本就是秒杀,没刷过可能得卡很久。所以对于密码学方向,我的建议很直接:多刷题、多见题,比死磕数论公式管用得多。

3.4 流量分析和其他边角料:基本功扎实才能不丢分

流量分析也是 CTF 里的常客。ISCTF2021 有一道题,给了一个 pcap 包,里面全是 HTTP 流量,我就一层层翻。刚开始我看每个请求都差不多,后来发现有一部分请求的参数里藏着 base64 编码的内容,全部解出来拼在一起,正好是一段完整的 flag 分段信息。这类题考的不是什么高端技巧,就是你有没有耐心把流量按时间线捋清楚,能不能在杂乱的报文里盯到异常值。

再往后还有一类常见陷阱叫"Git 泄露"。有些题目把整个目录当成静态网站发布,但.git目录没关,导致你能通过git log、git show之类的方式把历史版本拉出来。ISCTF2021 里有一道题就是这种情况,flag 藏在某次提交的 diff 里。我当时用的是现成的工具扫描.git目录,具体命令是这样的:

git log --all --oneline git diff HEAD~1 HEAD

第一行看所有提交记录,第二行比较最近一次提交跟之前的差异,flag 就在里面躺着。说句实话,这类题只要你事先知道"Git 泄露"这个概念,就基本不可能失分;反过来,要是不知道,对着网站发半天的呆也找不到切入点。这就是为什么我会反复强调,入门阶段宁可多做杂题,也别急着啃硬核漏洞。

4. 卡了我两小时的那道题:一条完整的报错注入排查链路

4.1 起始状态:报错信息看起来非常"奇怪"

ISCTF2021 里有一道题让我印象极深。题目给了一个非常简陋的页面,就是一个输入框,旁边写着"输入用户 ID,查询其基本信息"。我输入1,页面回显一个用户名;输入2,又回显另一个。看起来就是最普通的数字型查询。但是当我输入1'的时候,页面没有报 SQL 语法错误,而是弹出了一段很奇怪的内容——它把我输入的单引号原样显示在回显里,像是被"吃掉"了,只在外层包了一层引号。

这种表现让我非常困惑。常规的注入点测试应该是,输入单引号引发数据库的语法错误,然后你根据错误信息判断拼 SQL 的方式。可这里没有报错,反而是正常回显,只不过回显的内容变成了"带引号的我输入的内容"。我第一反应是后端可能把输入做了转义,把单引号变成了两个单引号,或者套了一层格式化字符串。

4.2 逐步假设与验证:从"转义"到"参数拼接"

我静下来想了想,决定做几个简单的测试。先输入1 and 1=1,页面回显和输入1一样;再输入1 and 1=2,页面直接空白,什么都没有。这时候我就确定了:这里确实存在 SQL 注入,而且注入点是数字型的,整数参数直接拼接到查询里。前面输入1'之所以不报错,应该是后端在拼接之后加了额外的引号包裹,或者把单引号替换成了别的字符,导致“单引号注入”这条路被堵死。

于是我调整策略,抛弃单引号,改用纯数字和函数来测试报错注入。尝试了extractvalue这个 MySQL 报错函数,构造了这样一条测试语句:

1 and extractvalue(1, concat(0x7e, (select database()), 0x7e))

输入之后页面依然没有报错,还是正常回显用户名。这让我一度以为 MySQL 的报错注入被过滤了。到这里,我已经花了将近四十分钟,心态有点急躁。

4.3 重新读题,发现藏在"奇怪报错"里的真正线索

后来我去翻提示,题干里有一句不起眼的话:"小小查询系统,报错感觉好奇怪"。我又仔细看了看正常回显和异常回显的差别,终于意识到了一个被我忽略的细节:当我输入包含特殊符号的内容时,页面回显的不是查询结果,而是把我输入的内容经过某种处理后又展示了回来。这说明这道题的"报错"其实不是数据库的报错,而是应用层把输入值放到了错误的位置——很可能同时使用了"参数化查询的一部分"和"直接把输入拼到 HTML 中回显"两种逻辑。

沿着这个思路,我把注入语句改成直接在回显位置触发表达式计算。通过构造类似{${phpinfo()}}的形式来验证是否被模板引擎解析,结果页面直接输出了 PHP 的配置信息。这时候我才恍然大悟,这道题表面上考的是 SQL 注入,实际是在考"SSTI(服务端模板注入) + SQL 注入"的组合。真正的漏洞点在于,后端把输入值先交给了模板引擎渲染,再拿去拼接 SQL,结果模板引擎先执行了我的代码。

于是后续的路线就比较清晰了,我通过模板注入的特性读取了环境变量和配置文件,最终找到一个存放 flag 的目录。整个排查过程前前后后花了两个小时,但给我带来的认知升级非常值:比赛里不能只看"像什么",得顺着报错信息的每一次异常往下挖,很多时候你以为的"过滤器"其实是另一个漏洞的入口。

5. 赛后复盘:如果把 ISCTF2021 当成一节入门课,我学到的是这几点

5.1 工具是拐杖,但思路才是腿

打完 ISCTF2021,我最大的感触就是:工具几乎决定了你的做题下限,而思路决定了你的做题上限。举个例子,密码学那道替换密码的题,没有 quipqiup 我可能永远靠人肉猜不出来;但反过来,如果我只是会点几下工具、看不懂报错信息背后的含义,那卡我两个小时的模板注入题就算把工具摆我面前,我也想不到往模板引擎的方向去试。

所以我给新手的一个建议是:不要沉迷于收集工具,但要给每个常用工具建立一张"使用场景卡片"。比如 StegSolve 什么时候用、CyberChef 哪个流程可以解什么编码、quipqiup 适合什么密文,这些卡片不需要背,整理一遍你自然就有印象了。真到了比赛里,你能更快地把"眼前的异常"和"记忆中的工具"对应起来。

5.2 题目做不出来时,主动切换"最小实验"模式

我发现自己做题效率最高的时候,不是闷头硬猜的时候,而是把问题拆成几个小实验逐个验证的时候。具体来说,就是遇到一个可疑输入点,我会先构造最简短的、目标单一的测试请求,看它触发的行为是什么,然后根据行为修改下一步的 Payload,而不是一上来就发一个很复杂的完整利用链。ISCTF2021 那两道题之所以能解出来,靠的都是这个"最小实验"的节奏。

比如测试 SQL 注入,先发1 and 1=1和1 and 1=2对比;测试模板注入,先发一个简单的${7*7}看回显是否变成49;测试命令执行,先发id和whoami对比。每一段测试尽量只改变一个变量,这样就能准确定位到底是什么环节出了问题。很多新手一上来就套完整攻击链,一旦失败根本不知道是哪一步断的,排查起来非常痛苦。

5.3 找一套自己的"赛后复盘模板"

比赛结束后的复盘,可能比比赛本身更重要。我会把每一道做出来和没做出来的题都记录成一个标准条目:题目名、题型、涉及的考点、我当时的思路、卡住的原因、最终的解法、以及我新学到的工具或语法。这个条目不用写得很长,关键是逼着自己把"不会"转化成"具体缺哪个知识模块"。

ISCTF2021 打完之后,我整理出了七条待补的知识点,比如${IFS}绕过空格的多种变体、报错注入函数的适用场景、模板引擎的常见探测变量、Git 泄露的利用工具、quipqiup 和 CyberChef 的组合用法等等。这些知识点后来就成了我下一个阶段刷题的路线图。现在回想起来,那场比赛的价值不在于我拿了多少分,而在于它让我看到了自己的知识边界到底画在哪里。

5.4 别被排名带走,稳住心态就是稳住输出

最后说点心态层面的事。ISCTF2021 中间有个阶段,我连续三道题都碰壁,排行榜上的分数被身边队伍一点一点拉开,那种压力真的会让人想直接关电脑。但后来我发现,排名靠前的队伍不是每道题都会做,他们只是更擅长把时间花在"有思路的题"上,并且把已经拿到的分稳固住。我开始刻意训练自己:一道题超过一定时间没进展,就标记一下,先换题或者去帮队友推进其他方向,过段时间再回来用新视角看。

这种"战略性放弃"在多人组队时特别好用。你卡住的时候队友可能已经把你需要的情报拿到了,你回来再看这道题,可能一下子就通了。总之,CTF 是一场心态和技术的双重博弈,ISCTF2021 让我真正认识到,稳住自己不崩盘,本身就是一种得分能力。

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

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

立即咨询