1. 赛题背景与核心价值为什么2021年的题目依然值得深挖如果你是一名正在备战网络空间安全相关竞赛的中职学生或者是一位刚入行的网络安全爱好者看到“2021年国赛赛题解析”这个标题心里可能会犯嘀咕这都过去几年了技术日新月异老题目还有看的必要吗这正是我想在开头和你聊的第一个问题。我个人的看法是对于技能型竞赛尤其是像网络空间安全通常包含CTF夺旗赛、渗透测试、应急响应等这类比赛其核心价值并不在于题目本身用了多新的漏洞比如某个2024年爆出的0day而在于它系统性地考察了选手对安全基础原理、问题分析方法和实战流程的掌握程度。2021年的国赛题目恰恰是这样一个绝佳的“标本”。为什么这么说首先国家级赛事国赛的命题往往经过专家团队的精心打磨题目设计逻辑严谨知识点覆盖全面。一道好的赛题就像一份设计精巧的“综合试卷”它会把多个基础知识点比如Web安全中的SQL注入、文件上传、命令执行或者二进制安全中的栈溢出、格式化字符串有机地串联起来考察选手能否在复杂的场景下灵活运用。其次国赛题目通常代表了当时国内职业教育在网络安全教学上的重点和方向解析这些题目相当于直接拿到了官方的“考纲”和“参考答案”对于理解教学要求和提升应试能力至关重要。最后也是最重要的一点安全攻防的底层逻辑和思维方式是相对稳定的。今天你学会如何通过代码审计发现一个SQL注入点明天这个技能在分析新的CMS系统时依然有效今天你搞懂了如何利用栈溢出控制程序执行流明天面对新的保护机制如Canary, ASLR时你已有的知识就是理解新机制的基础。所以这篇解析的目的绝不是简单地“炒冷饭”或给出一个flag。我希望通过拆解一道或一类典型的2021年国赛题目带你走一遍完整的解题思路从题目描述的信息提取到可能涉及知识点的联想再到一步步的实操验证最后到flag的获取与提交。在这个过程中我会重点分享那些在官方Writeup里可能不会写但在真实比赛和工作中一定会遇到的“坑”和“技巧”。无论你是想查漏补缺的备赛选手还是希望系统入门CTF的新手相信都能从中获得一些实实在在的收获。2. 典型赛题场景还原与初步分析由于原“项目正文”部分为空我们无法得知具体是哪一道“网络安全试题10”。但结合“2021年中职网络空间安全国赛”的常见题型和“网络安全试题”这个描述我们可以构建一个非常典型的赛题场景。这类题目通常以Web安全或杂项Misc为主偶尔涉及简单的逆向或密码学。中职阶段的题目难度会控制在基础到中等侧重于对经典漏洞的理解和利用以及对常见工具如Burp Suite, Nmap, 浏览器开发者工具的基本操作。我们不妨假设一个具体的题目场景这有助于展开后续的解析。假设赛题描述如下这是一个符合中职国赛难度的典型Web题题目名称EzGallery题目描述小Z搭建了一个简单的图片画廊网站但他好像忘记了一些重要的安全措施。你能找到隐藏的flag吗 访问地址http://target_ip:port看到这样的描述第一步不是急着打开浏览器乱点而是启动你的“侦察兵”思维。一个成熟的解题流程始于信息收集。2.1 信息收集打开黑盒的第一步拿到目标地址我习惯先用最轻量的方式快速摸个底。打开浏览器访问目标地址。首先映入眼帘的是一个简单的图片展示页面有几张风景图页面底部有“Powered by EzGallery v1.0”的字样。这里已经获得了第一个关键信息网站系统名称和版本EzGallery v1.0。这立刻让我联想到关键词中的“ezgallery ctf”这很可能是一个在CTF中多次出现的、存在已知漏洞的“靶场系统”或仿制应用。接下来使用浏览器自带的开发者工具F12快速查看一下网络请求和前端代码。查看页面源码右键查看网页源代码搜索可能的注释、隐藏表单、JS文件中的敏感信息。有时出题人会把提示甚至半段flag写在注释里。查看网络请求关注加载了哪些资源JS、CSS、图片特别是是否有像admin.php,upload.php,flag.php这样看起来就很“敏感”的文件。目录扫描这是关键一步。虽然手动猜测可行但效率太低。我会使用工具如dirsearch或gobuster进行目录爆破。一个基本的命令可能是python3 dirsearch.py -u http://target_ip:port -e php,html,js,txt,zip,bak这里-e参数指定了常见的扩展名特别是bak,zip等备份文件扩展名是CTF中的常客。在实战中这一步可能会发现/admin/、/upload/、/backup/、/www.zip网站源码备份等目录或文件。2.2 基于已知信息的漏洞联想假设通过目录扫描我们发现了/admin/login.php和一个/upload.php。结合“图片画廊”这个功能一个非常经典的漏洞链就开始浮现在脑海弱口令或SQL注入攻破后台/admin/login.php是后台登录入口。可以尝试常见弱口令admin/admin, admin/123456或者对其进行SQL注入测试。文件上传漏洞获取Webshell进入后台后很可能存在图片上传功能。如果上传功能未对文件类型、内容进行严格校验就可能上传一个伪装成图片的PHP木马从而获得服务器命令执行权限。目录穿越或文件包含读取flag获得Webshell后通常需要寻找flag文件。flag可能位于网站根目录、/var/www/html、/tmp或者一个随机命名的文件中。有时题目本身可能存在文件包含漏洞比如index.php?filexxx可以直接用来读取系统文件如/etc/passwd或 flag 文件。对于中职国赛题漏洞点往往比较直接但需要选手将多个知识点串联起来。我们的初步分析形成了这样一个假设性的攻击路径信息收集 - 发现后台 - 破解登录 - 利用上传 - 获取flag。接下来我们就沿着这个路径深入每一个环节的细节和可能遇到的坑。3. 漏洞利用链深度拆解从登录到GetShell沿着我们假设的攻击路径我们进入实战环节。这里每一个步骤都可能有多种情况和陷阱。3.1 突破入口Admin登录的多种可能性访问http://target_ip:port/admin/login.php我们看到一个简单的登录表单。首先尝试万能密码或简单SQL注入 payload用户名admin or 11密码随意。用户名admin密码admin或123456。如果运气好弱口令直接进去了那当然省事。但国赛题通常不会这么简单。如果失败我们需要更系统地测试。注意在CTF比赛中频繁尝试登录可能导致IP被临时封锁或者触发一些延迟机制。建议使用 Burp Suite 的 Intruder 模块进行自动化、低速的爆破并设置好间隔时间。如果SQL注入存在它可能是什么类型基于简单的表单最可能是基于错误的联合查询注入。我们可以用 Burp Suite 抓包将登录的POST请求发送到 Repeater 模块然后修改username参数进行测试。先加一个单引号admin观察返回错误。如果报出数据库错误如MySQL错误则确认存在注入点。通过order by子句猜测查询的列数admin order by 5--。不断递增数字直到页面返回异常从而确定列数。使用联合查询union select来获取数据。例如假设有3列admin union select 1, database(), version()--。这里就能爆出当前数据库名和版本。对于中职赛题登录环节的SQL注入通常不会设置太复杂的过滤但可能会要求选手手动写出完整的注入语句来获取管理员密码密码可能是MD5哈希需要破解。这里的一个实操心得是不要只满足于登录进去。通过SQL注入尽可能多地收集信息比如数据库名、表名、列名。有时flag就直接存放在某张数据库表里。常用的查询语句模板需要牢记union select 1, group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- union select 1, group_concat(column_name),3 from information_schema.columns where table_nameusers-- union select 1, username, password from users--3.2 关键一跃文件上传漏洞的利用与绕过假设我们通过SQL注入拿到了管理员账号密码成功登录后台。后台有一个“上传图片”的功能。这是整个链条中最关键的一环。一个毫无防护的上传功能是罕见的。常见的防护措施也是考点包括前端JS校验只允许选择.jpg,.png,.gif后缀的文件。绕过方法极其简单用 Burp Suite 抓包将文件名shell.jpg.php修改为shell.php即可绕过前端校验。服务端MIME类型校验检查HTTP请求头中的Content-Type如image/jpeg。绕过方法抓包修改Content-Type为image/jpeg即可。服务端后缀名黑名单/白名单黑名单禁止上传.php,.asp,.jsp等。绕过思路尝试其他可执行后缀如.php5,.phtml,.phps,.php7取决于服务器配置或者在后缀中加空格、点、::$DATAWindows特性等。白名单只允许.jpg,.png,.gif。这是更严格的防护。绕过思路通常需要结合文件包含漏洞或解析漏洞。例如上传一个内容为PHP代码的.jpg文件然后利用服务器的文件包含功能比如?fileupload/shell.jpg来执行其中的代码。或者利用服务器解析漏洞如Apache的shell.jpg.php旧版本、IIS的shell.jpg;.php等。服务端文件内容校验检查文件头魔术字节如FF D8 FF E0对应JPEG。绕过方法在PHP木马内容前添加真实的图片文件头。可以使用copy命令Windows或cat命令Linux制作图片马cat real.jpg shell.php shell.jpg。对于这道假设的“EzGallery”题结合其简单性很可能只做了前端校验和简单的后缀黑名单。我们的攻击payload可以这样设计准备一个一句话木马文件shell.php内容为?php eval($_POST[cmd]);?。上传时用Burp抓包将文件名改为shell.jpg.php或shell.php.jpg进行测试。如果上传成功访问上传后的文件路径如http://target_ip:port/uploads/shell.php.jpg。如果直接返回了空白页或错误可能后缀不被解析。尝试用中国菜刀或蚁剑等Webshell管理工具连接连接地址就是上传后的文件路径密码是cmd。这里有一个非常重要的坑即使上传成功并能连接你的Webshell也可能无法执行系统命令。这是因为服务器可能禁用了eval()、system()、exec()等危险函数或者将Web服务运行在严格的open_basedir限制下。这时你需要尝试其他PHP代码来读取文件比如?php echo file_get_contents(/flag); ? ?php print_r(scandir(.)); ? ?php highlight_file(__FILE__); ?使用file_get_contents直接读取文件内容往往是获取flag最直接的方式。4. 权限提升与Flag定位最后的临门一脚通过文件上传拿到Webshell哪怕是一个受限的我们相当于在服务器上有了一个“落脚点”。但flag在哪里这又是一个经典的CTF考点。4.1 常见的Flag存放位置在CTF比赛中flag的存放有一定规律但也可能出人意料。常见的搜索路径包括Web目录下/var/www/html/flag,/var/www/html/flag.txt,/flag,/home/ctf/flag。用户目录下/home/用户名/flag,/root/flag需要root权限。临时或特定目录/tmp/flag,/opt/flag。环境变量中有时flag会设置在进程的环境变量里可以用echo $FLAG或env命令查看前提是能执行命令。数据库里我们之前通过SQL注入可能已经看到了。源代码注释中这就是为什么一开始要查看网页源码。在我们的Webshell里可以尝试执行命令来寻找。如果system()等函数被禁用可以尝试用scandir()列出目录用file_get_contents()读取文件。?php // 列出根目录 print_r(scandir(/)); // 列出当前目录 print_r(scandir(.)); // 尝试读取常见位置的flag echo file_get_contents(/flag); echo file_get_contents(/flag.txt); echo file_get_contents(/home/ctf/flag); ?4.2 信息收集与权限提升如果简单的文件读取找不到flag或者我们发现当前Webshell权限很低通常是www-data用户无法读取某些文件就需要进行更深入的信息收集甚至尝试提权。查看系统信息虽然不能直接执行uname -a但可以尝试读取/proc/version或/etc/issue来了解操作系统和内核版本。查看当前用户和权限尝试读取/etc/passwd查看有哪些用户。尝试执行whoami如果函数可用或通过?php system(id);?来查看当前用户UID和所属组。寻找SUID特权文件在Linux中SUID权限的文件执行时会以文件所有者的身份运行。如果找到root所有的、并且我们有权执行的SUID文件就可能利用它提权。经典的如/bin/bash特定版本有漏洞、/usr/bin/find、/usr/bin/vim等。在Webshell中我们可以尝试用PHP执行find / -perm -us -type f 2/dev/null来查找需要system()函数可用。对于中职国赛题目通常不会设置复杂的提权场景flag往往放在Web用户有权读取的路径下。但考察选手是否有“横向移动”和“深入探索”的意识是可能的。例如flag可能在另一个用户的目录下需要你利用服务器上的某些信息如数据库密码配置文件来切换到那个用户。4.3 实战中的“柳暗花明”在实际解题中经常会出现预设路径走不通的情况。这时回归题目描述和已发现的信息至关重要。题目说“小Z搭建了一个简单的图片画廊网站但他好像忘记了一些重要的安全措施。”“忘记了一些重要的安全措施”可能暗示漏洞不止一个。我们只用了上传会不会有别的重新审视信息收集阶段的结果有没有漏掉的目录/backup/里有没有网站源码www.zip下载下来进行代码审计可能是更快的捷径。审计源码可能会发现硬编码的密码或密钥。隐藏的管理员页面路径。存在文件包含漏洞的参数如?pageabout。数据库配置文件里面有连接密码也许能直接登录数据库拿到flag。假设我们通过目录扫描找到了www.zip下载并解压。在config.php中发现了数据库密码。直接连接数据库可能在某个非用户表里发现了flag。或者在index.php中发现了这样的代码$file $_GET[file]; include(/pages/ . $file . .php);这存在一个本地文件包含LFI漏洞。虽然限制了后缀.php但我们可以利用PHP的封装协议来绕过读取源码或执行代码读取源码?filephp://filter/convert.base64-encode/resourceconfig会以base64编码形式输出config.php的源码解码即可。如果allow_url_include开启甚至可以远程包含RFI我们的Webshell。这个例子说明解题思路不能僵化。当主要攻击链受阻时一定要回头审视所有信息尝试其他可能性。国赛题目的设计往往鼓励这种多角度思考。5. 总结反思与备赛建议通过以上对一个假设赛题的完整拆解我们实际上演练了一套标准的CTF Web题解题方法论信息收集 - 漏洞发现 - 漏洞利用 - 权限获取/提升 - 获取flag。这个过程里技术操作固然重要但更关键的是思维习惯。5.1 从这道题延伸出的核心能力细致的信息收集能力永远不要忽略任何细节。页面底部的一个版本号、JS文件里的一句注释、HTTP响应头里的一个特殊字段如X-Powered-By: PHP/5.6.40都可能是突破口。养成随手记录所有信息的习惯。漏洞关联与组合思维安全漏洞很少孤立存在。SQL注入可能帮你拿到后台密码文件上传让你传Webshell文件包含让你执行Webshell而一个配置不当的权限SUID让你最终拿到root flag。要训练自己把知识点串联成攻击链的能力。工具的有效使用与理解原理Dirsearch、Burp Suite、SQLMap、蚁剑都是好工具但必须明白它们在做什么。比如用SQLMap跑注入时要能看懂它使用的payload类型用Burp抓包改包时要理解HTTP协议的结构。切忌成为只会点按钮的“工具小子”。绕过与变通能力安全防护措施层出不穷你的绕过方法也要不断更新。遇到白名单过滤要想到文件包含遇到命令执行函数被禁用要想到用php://input配合file_get_contents来执行代码。这种能力来源于对漏洞原理的深刻理解和对PHP/系统特性的熟悉。5.2 给中职国赛备赛选手的具体建议结合“2021年国赛”这个背景给正在备赛的同学几点非常具体的建议夯实绝对基础把OWASP Top 102017/2021版里每一个漏洞的原理、利用方式、防御方法吃透。尤其是SQL注入、XSS、文件上传、命令执行、文件包含这几种必须能做到手动利用不依赖自动化工具。搭建本地靶场练习DVWA、bWAPP、Upload-Labs、SQLi-Labs 这些经典的漏洞练习平台一定要亲手搭起来从低级到高级一关一关过。在可控的环境里反复试错是进步最快的方式。精研历年赛题就像我们解析2021年题目一样去找2019、2020、2022年的国赛和省赛真题。先自己独立做卡住了再看Writeup。重点不是记住flag而是理解出题人的思路和考察点。尝试用多种方法解同一道题。组建团队分工协作CTF通常有Web、Pwn二进制、Reverse逆向、Crypto密码学、Misc杂项等方向。找到志同道合的同学每人主攻1-2个方向定期分享和交流。比赛中良好的分工和沟通能极大提升效率。熟悉比赛平台与规则提前了解国赛使用的平台比如可能使用的“蓝桥杯”竞赛系统或定制平台熟悉flag的格式通常是flag{xxx}或FLAG{xxx}、提交方式、得分规则。比赛时注意关注平台的公告有时会有提示或规则变更。最后我想说网络安全竞赛的魅力在于它像一场“数字世界的解谜游戏”。每一次成功的渗透都源于对细节的洞察、对知识的活学活用以及那么一点点不放弃的探索精神。2021年的赛题是一座桥梁连接着基础知识和实战应用。希望这篇基于假设场景的深度解析能为你走过这座桥梁提供一盏灯。真正的能力永远是在不断动手解决一个又一个具体问题的过程中积累起来的。现在就去找一道真实的题目开始你的挑战吧。