
1. 从“看WP”到“写WP”一次CTF竞赛的复盘与成长最近整理硬盘翻到了几年前参加CISCN全国大学生信息安全竞赛时写的一些笔记和解题记录也就是我们常说的“WP”Writeup。看着那些当时觉得惊为天人的解题思路现在回看很多其实都有迹可循。我发现一个很有意思的现象很多刚接触CTFCapture The Flag的朋友包括当年的我自己都热衷于四处搜罗“WP”尤其是国赛、省赛这种大型赛事的仿佛拿到一份详尽的WP就掌握了通关秘籍。但事实是看十篇别人的WP不如自己动手写一篇。今天我就想以一个过来人的身份聊聊“WP”这件事——它到底是什么我们该如何正确地“食用”它以及更重要的是如何通过撰写自己的WP实现从“解题者”到“出题者”思维的跨越。这不仅仅是关于某一道题的解而是一种通用的、能让你在CTF乃至实际安全研究中走得更远的方法论。2. WP的核心价值不止是答案更是思维路径很多人把WP简单地理解为“答案”或“解题步骤”。这其实是一种误解也大大低估了它的价值。一份高质量的WP其核心价值在于完整还原了作者的思维路径和决策过程。2.1 信息收集与线索拼图拿到一道CTF题目尤其是Web类第一步永远不是盲目的测试。一份好的WP会告诉你作者是如何进行信息收集的。比如源代码审计他首先看了哪里是首页的HTML注释还是引用的JavaScript文件他有没有注意到那些看似无关的/robots.txt、/.git/目录或/www.zip备份文件网络请求分析他打开了浏览器的开发者工具具体关注了哪些请求是Cookie、HTTP头如X-Forwarded-For、User-Agent还是某个不起眼的API接口响应目录扫描他用了什么工具如dirsearch、gobuster字典是如何选择的面对一个返回403的目录他是如何进一步试探的这些步骤往往被新手忽略他们更关心“最后一步的payload是什么”。但事实上90%的解题时间都花在了这里。WP的价值就在于它展示了如何从一片混沌的信息中筛选出有价值的线索并将其拼凑成一张通往“Flag”的地图。2.2 漏洞原理的深度理解与串联CTF题目往往是多个知识点串联的结果。一个简单的“命令执行”漏洞背后可能涉及代码审计发现危险函数如eval(),system()。发现存在文件上传功能但限制了后缀。通过MIME类型绕过或.htaccess文件上传获得Webshell。在Webshell中发现system等函数被禁用进而需要无字母数字的命令执行技巧。最终通过管道符、反引号或编码转换成功执行命令读取Flag。一份仅仅给出最终payload的WP是苍白的。而一份优秀的WP会拆解每一步为什么这里会上传点为什么常规的上传绕过不行那个奇怪的过滤规则是怎么被发现的它会把每个技术点如文件上传绕过、命令执行绕过的原理讲清楚并解释它们是如何在本题的特定环境下被串联起来的。这才是学习的精髓——举一反三而不是死记硬背一个payload。2.3 工具的高效与创造性使用WP也是学习工具使用的最佳场景。它不止告诉你用了什么工具更会说明为什么用这个工具以及用了它的哪些特性。Burp Suite不仅仅是抓包改包。WP可能会展示如何利用Intruder模块进行模糊测试Fuzzing如何用Decoder模块进行多种编码的快速转换如何配置Match Rules来高亮关键响应。Python脚本当现成工具不奏效时自定义脚本是关键。WP里的脚本往往包含了针对本题特定过滤规则的逻辑比如自定义的异或生成、特定位置的替换等。学习这些脚本的编写思路比自己写十道算法题还有用。浏览器插件如Hack-Tools、Cookie-Editor等WP会提及它们在快速修改、测试中带来的便利。看WP时要重点关注作者在工具使用上的“小巧思”这些往往是提升实战效率的关键。3. 如何高效“食用”一份WP四步学习法盲目地阅读和复制粘贴是无效的。我推荐以下四个步骤来最大化WP的学习价值3.1 第一步尝试独立解题记录“卡点”在打开任何WP之前请务必自己动手尝试。给自己设定一个合理的时间比如1-2小时。在这个过程中详细记录你的每一步操作和思考你首先做了什么你发现了哪些线索你在哪个环节完全卡住了是毫无头绪还是有一个模糊的方向但无法实现你尝试了哪些方法它们为什么失败了这份“失败记录”极其宝贵。它精准定位了你的知识盲区和思维瓶颈。3.2 第二步对比阅读聚焦差异现在打开WP。不要从头到尾通读而是直接找到你“卡住”的那个环节看作者是如何做的。信息差异作者发现了哪个你没有注意到的文件、注释或HTTP头工具差异作者使用了哪个你没有用到的工具参数或功能思维差异面对同一个过滤条件你的思路是“硬刚”而作者是“绕行”还是“利用”例如面对preg_match(/[a-z]/i, $cmd)这样的过滤你可能在想怎么不用字母而作者可能直接考虑用${IFS}代替空格用$0或$代替命令甚至用八进制/十六进制表示法来构造字符。知识差异作者用到了一个你完全不知道的漏洞原理或PHP特性比如PHP的字符串解析特性、php://filter的妙用。将这个对比过程详细记录下来这个差异点就是你本次学习的核心收获。3.3 第三步环境复现与拓展练习“看懂”和“做到”是两回事。务必在本地或靶场环境如Docker容器中完全复现作者的解题步骤。精确复现确保你能用同样的方法拿到Flag。参数微调尝试修改payload中的一些参数观察结果有何不同。理解每个参数的确切作用。方法变种如果作者用了方法A思考是否还有方法B、C也能达到同样目的例如作者用system(‘cat flag’)你可以试试cat flag或passthru(‘cat flag’)吗为什么可以或不可以防御绕过如果题目增加一层过滤你的payload还能工作吗如何调整这个过程能将被动接收的知识转化为主动掌握的技能。3.4 第四步抽象归纳形成模式这是从“一道题”上升到“一类题”的关键。完成复现后问自己几个问题这道题考察的核心知识点是什么例如PHP反序列化链构造、SSTI服务端模板注入的沙盒逃逸、XXEXML外部实体注入读取内部文件这类漏洞的通用利用步骤或模式是什么例如XXE利用的通用步骤1. 检测XML解析2. 尝试引用外部实体3. 利用file、php等协议读取文件或执行代码题目设置了哪些“障碍”过滤、禁用函数、编码而对应的“绕过姿势”有哪些如果让我来出一道类似的题我会怎么设计将这些思考总结成简短的笔记归档到你的知识库中比如用Notion、Obsidian。久而久之你会形成自己的“漏洞利用模式识别库”。4. 从解题到出题撰写高质量WP的自我修炼当你能够稳定地复现并理解中等难度的WP后下一个质的飞跃就是开始撰写自己的WP。写WP是最高效的学习方式之一它强迫你进行深度思考与系统化表达。4.1 撰写WP的黄金结构一份对自己和他人都有价值的WP建议包含以下部分1. 题目信息与链接赛事名称、题目名称、分类Web、Pwn、Crypto等、分值。如果可能提供题目源码或环境搭建方式Dockerfile。2. 解题思路总览用一两句话概括整个攻击链条给读者一个全景图。例如“本题通过前端JS混淆隐藏了关键API接口访问该接口发现存在SQL注入利用时间盲注获取管理员密码后登录后台在后台文件上传功能处利用.htaccess文件上传绕过最终结合PHP的php://filter协议进行文件包含读取Flag。”3. 详细解题步骤这是核心必须步步清晰配上截图和关键代码。步骤一信息收集截图浏览器首页、网页源代码关键部分、网络请求中特殊的Header或Cookie。操作使用了什么命令进行目录扫描用了哪个字典发现了什么。思考为什么从这里入手这个发现暗示了什么步骤二漏洞发现与分析代码片段给出存在漏洞的源代码如果是给源码的题并高亮危险函数或逻辑缺陷。测试过程如何构造最初的测试payload服务器的反应是什么正常回显、错误信息、延迟判断依据根据什么判断这里存在XXE/SQLi/命令执行等漏洞例如输入单引号报错说明可能存在SQL注入步骤三利用与绕过难点突破详细描述遇到的过滤或限制。例如“发现system、exec等函数被禁用但shell_exec和反引号可用。”绕过技巧如何一步步构造最终的payload如果涉及编码如Base64、Hex、字符串拼接、特殊符号替换需要解释每一步转换的原因和结果。最好能给出一个从“理想payload”到“可用payload”的演变过程。工具脚本如果编写了自动化脚本请贴出代码并解释关键逻辑。步骤四获取Flag最终命令或操作。Flag内容通常打码。4. 关键知识点总结罗列本题涉及的所有安全知识点如JS前端混淆、目录遍历、SQL时间盲注、.htaccess文件上传、PHP文件包含。对每个知识点进行简要的原理回顾和利用方式说明。5. 延伸思考与参考资料如果题目条件变化过滤加强还有什么其他方法在真实世界中这类漏洞通常如何出现如何防御提供一些学习相关知识的优质链接如OWASP Wiki、特定CVE分析文章。4.2 撰写过程中的常见“坑”与技巧避免“上帝视角”不要一开始就写“这里有个明显的XX漏洞”。要还原你最初看到它时的状态——“这里有一个输入框尝试提交单引号后页面返回了数据库错误因此怀疑存在SQL注入”。截图要清晰且有重点在关键步骤配上终端输出或浏览器截图并在图片上用箭头或方框标出重点。一张好的截图胜过千言万语。代码和命令格式化使用Markdown的代码块并标明语言类型方便阅读和复制。解释“为什么”这是区分新手和老手WP的关键。不仅要写“我输入了{{7*7}}”还要写“因为输入{{7*7}}返回了49说明服务端执行了乘法运算证实了SSTI漏洞的存在”。保持更新如果后来发现了更优雅的解法可以更新到WP中并注明“更新另一种解法”。5. 以“CISCN国赛”级题目为例的思维训练虽然没有具体的题目内容但我们可以模拟一个CISCN国赛Web题目中可能出现的复合型场景来训练上述思维。假设一个虚构的题目背景一个简单的“网络笔记”应用。初始状态只有一个登录页面和注册页面。独立探索阶段你的任务你会注册一个账号登录进去看看有哪些功能增删改查笔记。尝试所有输入点笔记标题、内容、搜索框、个人信息修改等。检查Cookie、LocalStorage查看前端JS代码有无隐藏信息。用dirsearch扫描目录或许会发现/admin、/backup、/upload等路径。发现/admin需要管理员权限但普通用户无法访问。假设你卡在了如何成为管理员这一步。阅读WP对比阶段 WP作者发现在注册用户时请求包中有一个隐藏的JSON字段role:user将其修改为role:admin后成功注册为管理员账户。你忽略了请求包的深度审计。复现与拓展阶段你成功复现进入/admin后台。发现后台有“系统配置”功能可以上传网站Logo。你尝试上传PHP Webshell但后端校验了文件头和内容失败了。回看WP作者发现上传处存在“竞争条件”漏洞上传时文件会先被保存到一个临时目录路径可预测然后才进行安全检查并移动到正式目录。作者通过编写脚本在文件被上传到临时目录但还未被移动/删除的极短时间内快速访问该临时文件从而执行了代码。抽象归纳阶段知识点1接口参数篡改。不要相信前端传来的任何参数后端必须对用户角色、权限等关键参数进行二次校验。知识点2竞争条件漏洞。在“检查-使用”或“上传-验证”之间存在时间窗口。防御手段包括使用原子操作、在临时文件名中加入不可预测的随机数、将文件先保存到不可访问的位置验证通过后再转移。解题模式对于Web题目在发现功能受限如/admin时思路应转向1. 寻找垂直越权点如修改参数2. 寻找获取更高权限用户凭证的方法如SQL注入出管理员密码3. 寻找无需权限的入口点如前台注入。通过这样的虚拟推演即使没有真实题目你也能锻炼“遇到问题-寻找线索-关联知识-尝试突破”的完整思维链条。当你在实际比赛中遇到似曾相识的场景时这种训练出来的直觉和系统性方法将至关重要。最终CTF竞赛和WP的意义远不止于找到那串Flag字符。它是一场持续的逻辑训练、知识整合与心态磨砺。把每一次“看WP”当作一次向高手学习思维的机会把每一次“写WP”当作一次对自身技术的深度梳理和表达。从这个角度看WP就不再是赛后的简单答案而是贯穿你学习之路的、最宝贵的成长日记。