ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

羊城杯CTF初赛复盘:Web安全、隐写与RSA攻击的实战思路

2026/9/24 19:25:32 拓冰建站 浏览量
羊城杯CTF初赛复盘:Web安全、隐写与RSA攻击的实战思路 从我个人的参赛复盘角度来写这篇羊城杯初赛解析。我是以蓝队/Web手视角参赛的连续打了近6个小时从Web到Misc再到Crypto、Reverse、PWN整体体验下来初赛题目梯度非常明显前面送分题给足信心中间卡壳题拉开差距最后几道压轴题基本就是筛选“真正动手调过东西”的人。这篇文章我从复盘角度把赛题设计思路、各方向核心考点、我自己踩过的坑、以及赛后整理出的一套备赛路线全部写清楚想打2026年同类比赛的朋友可以直接照着走。1. 赛题整体设计与思路拆解1.1 初赛定位不是招“理论家”是招“能干活的人”羊城杯初赛的定位很明确面向在校学生和刚入行1-3年的安全工程师考察的不是“你背了多少CVE编号”而是“给你一个不熟悉的系统你能不能在一个小时内找到入口、拿到权限、拿到Flag”。从题目分布能看得很清楚Web方向占了将近40%的分数Misc和Crypto各占20%左右Reverse和PWN加起来剩下的份额。这跟当前企业招聘安全工程师的考察逻辑完全一致——Web是所有安全方向的基础不管是搞渗透测试、应急响应还是安全开发Web漏洞的发现与利用能力都是第一道门槛。1.2 难度梯度设计送分题、拉分题、压轴题的分布逻辑整个初赛的题目难度可以用“三段式”概括送分题约30%看一眼题目描述扫个目录、翻个源码、解个低难度密码题就能出的。这类题主要考察基本功是否扎实比如有没有用过dirsearch、会不会看HTTP响应头、知不知道ZIP伪加密的标识位。拉分题约50%需要把2-3个知识点串起来才能解的题。比如一道Web题可能要先做信息收集发现源码备份文件从源码里找到反序列化入口再构造POP链才能拿Flag。这类题考察的是“链式思维”也是比赛中最能拉开差距的部分。压轴题约20%需要临时学习一个不熟悉的框架、协议或利用技巧。比如今年有一道Misc题考察了某种冷门协议的文件解析不熟悉就只能眼睁睁看着。1.3 考察方向权重为什么Web安全永远是主角从近三年羊城杯的题目统计来看Web安全方向的出题权重稳定在“最高”的位置。这背后是有行业逻辑的企业对外暴露的攻击面90%以上是Web应用不管是官网、后台管理系统还是API接口等保测评、渗透测试、红蓝对抗Web安全是最刚需的能力SRC漏洞挖掘平台上的高危漏洞大头也集中在Web层所以我建议备赛的朋友不管你的主攻方向是什么Web安全的基础一定要打牢。哪怕你是搞逆向的赛后跟Web手交流讨论最多的也是Web题。2. 核心解题细节与实操要点2.1 Web方向文件上传、条件竞争、日志注入的前世今生今年初赛Web方向有一道题非常典型一个文件上传点前端做了JS后缀校验后端用黑名单拦截了php、php5、phtml等常见后缀同时用了in_array()函数做MIME类型检查。绕过思路其实分三步先抓包改Content-Type为image/jpeg后缀改成phtml尝试绕过黑名单如果还不行就看.htaccess文件是否可用这道题实际考察了两个点一是前端校验和MIME校验都是“表面功夫”真正的安全要依赖服务端白名单二是文件名可控时能不能利用上传功能覆盖关键文件。这里有个非常重要的实操经验上传题目不要只盯着“传马拿Shell”还要看“上传功能本身能否造成其他危害”。比如文件名为../../tmp/test.txt时能否目录穿越、文件内容返回时是否存在XSS、文件名渲染时是否存在模板注入。2.2 Misc方向图片隐写、压缩包伪加密与流量分析三板斧Misc的送分题基本是老三样图片隐写、压缩包伪加密、简单流量分析。图片隐写有四个层级我按比赛出现频率排序最低级直接改文件后缀把txt改成png入门级在图片结尾附加字符串用strings命令直接能看到Flag进阶级Exif信息中隐藏内容用exiftool查看挑战级LSB隐写低有效位承载信息需要用zsteg或Python的PIL库逐位提取ZIP伪加密是考得最多的一种原理很简单ZIP文件的数据目录中有一个“加密标志位”位0设置为1时解压软件会认为文件加密。伪加密就是只置位了这个标志位但实际上数据内容根本没有加密。修复方法是用010 Editor把这一个字节改回来或者用binwalk自动识别修复。流量分析今年考了一道SMB协议内网横向移动的题。题目给了一个pcapng文件需要从SMB流量中提取文件传输记录还原攻击者横向移动的完整路径。我的建议是直接用Wireshark的Export Objects功能把流量中的所有文件先导出来然后逐个分析。做流量分析题一定要养成“先过滤、后分析”的习惯常用的过滤语法如下http.request.method POST # 只看HTTP POST请求 smb2.cmd 5 # 只看SMB2写文件操作 ftp-data contains flag # 找FTP传输中的Flag dns.qry.name contains flag # 看DNS隧道2.3 Crypto方向低加密指数攻击、共模攻击与格基约减Crypto今年的压轴题是一道RSA变种题考察的是低加密指数广播攻击。当同一个明文m被用不同的公钥加密发送给多个接收者且加密指数e较小时可以用中国剩余定理CRT直接恢复明文。核心原理是设e3有三个密文c1、c2、c3分别对应模数n1、n2、n3且m^3小于n1n2n3那么c1、c2、c3满足中国剩余定理的条件可以解出m^3的确切值直接开三次方根就能拿到m。实操代码片段如下from Crypto.Util.number import long_to_bytes from sympy.ntheory.modular import crt n_list [n1, n2, n3] c_list [c1, c2, c3] m_cubed crt(n_list, c_list)[0] m int(round(m_cubed ** (1/3))) flag long_to_bytes(m) print(flag)这里有个隐蔽的坑Python的浮点开三次方在数值较大时会丢失精度。我当时就是在这卡了半小时一直解出来乱码。后来改用gmpy2的iroot()函数import gmpy2 m, exact gmpy2.iroot(m_cubed, 3)iroot返回两个值第一个是整数根第二个是布尔值代表是否精确开尽。用这个函数就不会有精度问题。2.4 Reverse与PWN从UPX脱壳到栈溢出的标准化打法Reverse方向今年出了一道加了UPX壳的ELF文件。脱壳几乎是白送的upx -d一行命令搞定但脱完之后的要求是从汇编逻辑中还原加密算法并且还原的是一个自定义的乱序加密函数。我的标准打法是这样的先用file命令确认文件类型用upx -d脱壳拉进IDA Pro找到main函数入口用FindCrypt插件扫描加密常量定位加密函数从汇编恢复逻辑写Python脚本逆运算PWN方向的送分题是栈溢出程序开了NX但没有开PIE和Canary典型的ret2shellcode打法。写exp的要点是处理好偏移量和返回地址from pwn import * context.arch amd64 p process(./pwn1) shellcode asm(shellcraft.sh()) payload shellcode.ljust(24, bA) p64(0x601000) p.sendline(payload) p.interactive()栈溢出题最容易出问题的地方是获取偏移量我推荐直接用cyclic生成模式串跑到崩溃后用cyclic -l计算偏移比自己手数准确得多。3. 实操过程与核心环节实现3.1 一场完整比赛的时间分配策略羊城杯初赛赛时一般是200分钟我的时间分配策略是前30分钟把所有题目都过一遍把送分题全部清掉这一步目的是“保底分”中间120分钟死磕拉分题优先做Web和Misc因为这两类题目的“线索链”容易建立最后50分钟处理压轴题能拿第一层Flag就拿第一层Flag拿不到就回头检查已做题目这里有一个很多新手容易犯的错误死磕一道题不放手。一次比赛最大的误区不是不会做而是会做的题没有时间做。我的原则是一道题超过40分钟没有新进展立即标记换下一道最后有时间再回来。3.2 Web题实战记录从信息收集到命令执行的完整链路以今年Web方向的一道命令注入题为例完整还原我的思路过程。第一步信息收集。用dirsearch扫目录时发现存在/test.php.bak下载后看到源码关键代码如下$cmd $_GET[cmd]; system(ping -c 2 . $cmd);一眼看出是命令拼接注入。此时直接用分号拼接?cmd;cat /flag结果被WAF拦截了。这里的WAF过滤了cat、flag、空格等关键词。绕过思路按优先级排序先用ls确认当前目录有什么文件用ca\t、fla\g的形式绕过关键字匹配用${IFS}替换空格因为$IFS$IFS在bash中会被解析为分隔符最终Payload?cmd;ca\t${IFS}/fla\g.txt这道题考的是三个点源码审计能力、Linux命令基础、WAF绕过经验。三者缺一不可而且这种题在实际渗透中非常高频。3.3 Misc题实战记录压缩包伪加密的完整修复流程当时那道题是一个压缩包直接解压报错提示文件加密但文件的注释里写了“其实密码是六个零”。我当时第一反应是用zip2john跑一下哈希后来发现自己绕了远路正确解法是伪加密。判断伪加密的方法zipinfo -v file.zip如果在file encryption一栏看到的是only但没有实际加密数据那就是伪加密。修复方式是用010 Editor打开文件定位到中央目录的general purpose bit flag把第0位从01改成00保存后直接解压Flag就出来了。说实话这题如果不知道“伪加密”这个概念可能会去爆破密码或尝试各种字典白白浪费大量时间。3.4 Crypto题实战记录共模攻击的快速判断方法共模攻击的识别非常容易同一文件下有两个公钥文件但加密的是同一份密文且两个公钥的模数n相同而e互不相同。判断互质用数学方法import math print(math.gcd(e1, e2))如果结果是1就可以用扩展欧几里得算法解出s1和s2满足s1*e1 s2*e2 1然后明文m pow(c1, s1, n) * pow(c2, s2, n) % n完整代码如下from Crypto.Util.number import long_to_bytes import gmpy2 def extended_gcd(a, b): if b 0: return a, 1, 0 else: gcd, coeff_x, coeff_y extended_gcd(b, a % b) return gcd, coeff_y, coeff_x - (a // b) * coeff_y gcd_val, s1, s2 extended_gcd(e1, e2) if s1 0: c1 gmpy2.invert(c1, n) s1 -s1 if s2 0: c2 gmpy2.invert(c2, n) s2 -s2 m (pow(c1, s1, n) * pow(c2, s2, n)) % n print(long_to_bytes(m))密码题的核心不是写代码而是“识别”。认出共模攻击的瞬间后面就是程序员的体力活。3.5 日志分析和应急响应实战记录从时间线还原攻击路径今年新增的一道“应急响应”类型的题出一个日志文件和环境快照要求还原攻击者的完整攻击路径。这类题非常有实战价值几乎就是真实安全事件的迷你版。我的分析步骤检查系统用户列表找新增用户检查计划任务找持久化后门检查Web访问日志按时间线还原攻击路径检查系统日志定位恶意进程上传到在线分析平台如微步云沙箱确认样本行为其中最容易遗漏的是第三步。很多新手拿到日志直接搜关键字但我习惯先把时间范围框定再把IP去重最后才定位具体请求。因为应急响应的核心是还原“攻击者的作战地图”而不是找到单个恶意请求。4. 备赛路线、学习资源与工具选型4.1 零基础到入门网安学习路线图的正确打开方式很多读者私信问我零基础想学网络安全该从哪里开始我在赛后整理了一条相对高效的路线不敢说适合所有人但至少是经过多人验证的第一阶段计算机网络与Linux基础3-4周学TCP/IP协议栈重点是HTTP、DNS、HTTPS的请求响应细节熟悉Linux常用命令掌握文件权限、进程管理、网络配置推荐资料B站韩立刚的计算机网络课程、菜鸟教程Linux部分第二阶段Web安全基础6-8周把OWASP Top 10中每一类漏洞的原理搞懂能自己写简单的靶场复现掌握Burp Suite抓包改包、SQLMap、Nmap、dirsearch等工具推荐平台墨者学院、PHPStudy搭建DVWA靶场、Pikachu靶场第三阶段靶场实战持续国内推荐墨者学院在线靶场、攻防世界、CTFshow国外推荐HackTheBox、TryHackMe、PortSwigger Web Security Academy靶场的核心价值不是“打进去”而是“写报告”——把每一步操作记录下来最后形成完整分析报告第四阶段比赛驱动比赛前1-2个月每周找一套往届真题模拟真实比赛时间全程不暂停做题复盘时把每道题的知识点做知识图谱找薄弱环节参加平台周赛比如看雪CTF、CTFshow的周赛4.2 高频工具链每一位网安工程师的“吃饭家伙”我把自己日常高频使用的工具分为四个梯队梯队工具用途第一梯队必须熟练Burp Suite抓包、重放、爆破、插件扩展第一梯队必须熟练Nmap端口扫描、服务识别、脚本探测第一梯队必须熟练CyberChef编码解码、密文处理、格式转换第二梯队日常常用SQLMap、xray、dirsearch自动化漏洞探测、目录扫描第二梯队日常常用Wireshark、tcpdump流量分析、协议分析第三梯队专业进阶IDA Pro、Ghidra逆向分析、二进制审计第三梯队专业进阶pwntools、gdbPWN题利用、动态调试第四梯队综合辅助Python脚本自动化利用、密码学计算每位新手最应该先练熟的是CyberChef和Burp Suite。CyberChef几乎是Misc和Crypto题的“万能钥匙”各种进制转换、URL解码、Base64系列、RSA计算全都能做而且支持Magic模式自动识别编码方式。4.3 考证还是打比赛网安工程师的两条成长路径关于网络安全工程师考证和打比赛之间的选择我的建议取决于你的时间窗口如果是在校学生优先打比赛因为比赛能让你在短时间接触大量真实攻击场景构建完整的漏洞知识体系而且获奖经历在简历上的含金量不输一些基础证书如果已工作优先考CISP-PTE、CISP-PTS这类渗透测试方向的实操型认证因为它们直接对接岗位需求考试也包含真实的靶机操作如果是准备入行的职场新人用CISP作为敲门砖同时通过SRC漏洞挖掘平台积累真实漏洞复现经验说句实话我在面试安全工程师岗位时看简历最看重两个东西一是是否在知名赛事中拿过奖证明实战能力二是SRC平台上的漏洞提交记录证明持续产出能力。证书更多是“锦上添花”而不是“雪中送炭”。4.4 SRC漏洞挖掘与比赛的互补关系国内几个主流SRC漏洞挖掘平台漏洞盒子、补天、教育行业SRC跟CTF比赛有一个很大的不同CTF是“有答案的题目”SRC是“没有答案的开放式问题”。我个人的体会是比赛和SRC要交替进行。比赛给你“题感”让你知道一个漏洞的高发点在哪里SRC给你“真实感”让你知道生产环境中的业务逻辑有多复杂、WAF有多容易误报、权限校验有多容易遗漏。比如你在CTF里学会了文件上传绕过但在SRC遇到的可能是云存储场景下的对象存储策略配置错误你在CTF里学会了SQL注入但在SRC遇到的可能是PostgreSQL的jsonb查询导致的注入。这些差异只能通过真实项目补齐。5. 常见问题与独家避坑经验5.1 比赛中最容易翻车的问题速查根据我和队友历次参赛的复盘整理了以下高频翻车点全是真实踩过的坑Web方向现象原因解决方案扫目录扫到一堆路径但全是404没有识别出隐藏虚拟目录先访问robots.txt和网站根目录的JS文件文件上传始终提示类型错误前端JS校验还有后端二次校验先禁用JS再上传不行就改包SQLMap跑不出注入过滤了关键字且无回显手工拼接先测单引号再测布尔盲注命令注入有回显但命令不执行特殊字符被转义尝试管道符|、换行符%0a代替分号拿到后台却不知道下一步后台功能点没有逐一测试XSS弹Cookie优先于SQL注入Misc方向现象原因解决方案图片打开正常但看不到Flag隐写在元数据里exiftool、strings翻一遍压缩包提示有密码可能是伪加密先看zipinfo确认实际加密情况流量包体积巨大混入了大量背景流量过滤掉IP和端口后再分析音频文件无法播放文件头被修改010 Editor修复文件头Crypto方向现象原因解决方案RSA解出来是乱码参数识别错误确认p、q是否互质e是否为65537拿到公钥但无法分解n模数太大考虑共模攻击或低指数攻击多次尝试开方失败浮点运算精度问题改用gmpy2.iroot5.2 我踩过的“最坑”一题从3分到32分的心理博弈今年我踩的最大的坑是一道Misc题赛题提供了一张BMP图片我前前后后用strings、binwalk、zsteg扫了一遍完全没有任何发现。当时已经在这个题目上耗了25分钟正准备放弃时突然想到BMP图片的LSB提取是按像素的高低位分开处理的而且BMP格式的文件头是54字节不是PNG的8字节。于是改用Python脚本按像素位提取from PIL import Image img Image.open(flag.bmp) pixels img.load() bits for y in range(img.size[1]): for x in range(img.size[0]): r, g, b pixels[x, y] bits str(r 1) bytes_data [int(bits[i:i8], 2) for i in range(0, len(bits), 8)] flag .join(chr(b) for b in bytes_data if 32 b 127) print(flag)最终成功拿到Flag。这题的教训是工具扫不出来不代表没有隐写要注意位提取方向、字节序、通道顺序三种常见变体。5.3 时间管理是最大隐形考点4条实战经验最后分享几条我在比赛中反复验证的实战经验先做会做的再做能做的最后做要现学的。比赛拼的是总分不是单题时长。每道题设置40分钟上限。超过上限没有任何新进展就标记跳过后面做完全部会做的题再回头攻克。比赛过程要持续记录。不需要写详细笔记但每道题当前找到什么线索、尝试过什么方向一定要记下来否则回头再看时等于重新开始。赛前把一台备用的VPS准备好。有些题目需要外连回调如果本地环境NAT限制可能导致完全无法做题。5.4 赛后复盘的正确姿势比做题重要三倍的事每次比赛结束后我都会花比比赛时间多两倍的时间做复盘。复盘不是“对答案”而是建立知识索引每道题涉及的知识点是什么拿到题目时我的第一反应是什么正确解法差在哪里其他选手的WriteUp中用了哪些我没想过的工具或技巧这些知识点能否迁移到实战项目的漏洞挖掘中我每次复盘后会把这些内容整理成一张个人知识图谱下次遇到类似题型直接检索知识图谱定位解法而不是重新踩一遍坑。这也是我坚持参加CTF比赛的原因——比赛的最终目的不是拿奖是逼自己持续学习和总结。我个人在反复参赛和复盘之后最深的体会是网络安全的学习没有“毕业”这个说法每次比赛都是一面镜子照出来的永远是自己知识点上的盲区。如果你只记住了这篇解析里的某道题解法那价值有限如果你能从这些实战经验中提炼出“先信息收集、再明确瓶颈、最后定向突破”的思路那不管打什么比赛、做什么项目你都能走得更稳。