第一次打开攻防世界XCTF的Web新手区时我刚学完HTML和PHP基础满脑子想的都是“会有一个flag等着我”。真正刷下来才发现新手区不是让你直接拿flag的而是在一个又一个“简单”题目里把最基础的Web攻击手法训练成肌肉记忆。这篇文章我挑了几道有代表性的新手题从解题思路到工具操作完整拆开来讲不少细节是当年刷题时踩过坑才悟出来的。不管你以后走蓝队还是红队这套流程都值得收着。1. 新手区刷题前的准备平台、工具与心态1.1 攻防世界免费题库的特点攻防世界XCTF的在线题库大概是国内CTF入门最友好的平台之一题目分类清晰Web、Pwn、Reverse等方向都有而且完全免费。新手区Web题目的难度曲线相对平缓不会一上来就甩给你一个魔改的加密算法大部分题考察的是“你知不知道这个点”而不是“你能不能发明这个点”。平台上每道题都有动态分值也有WriteUp区但我的建议是先别急着看WriteUp哪怕卡一整天也比直接看答案强。新手区很多题只要掌握思路五分钟就能解出来但独立想出来的那五分钟才是真正值钱的。1.2 必备工具浏览器开发者工具、Burp Suite、脚本环境刷Web题之前先把工具有齐。我平时最常用的是下面这几样全是免费或社区版就够用工具用途备注Chrome / Edge DevTools查看源码、修改HTML属性、观察网络请求、编辑Cookie快捷键F12或CtrlShiftIBurp Suite Community抓包、改包、重放请求、爆破需要配置代理配合SwitchyOmega更顺手Firefox HackBar插件快速构造GET/POST请求、编码转换老版本HackBar很经典新版可用NoHackBar替代Python 3 requests库写脚本自动化解题很多题需要脚本与服务器交互Dirsearch / 目录扫描器发现备份文件、隐藏目录新手期可以先用平台提示判断不急着扫这里特别提醒新手Burp Suite社区版的Intruder爆破功能虽然慢但用来打新手区弱口令完全够用。别一上来就去找破解版正经免费工具已经能覆盖70%的题目场景。1.3 刷题的正确方式不只求flag新手最容易犯的错误是拿到flag就下一题根本不理解为什么。我见过很多人把题解背得滚瓜烂熟但换个马甲就不会了。正确的做法是每做完一道题问自己三个问题这个漏洞的根因是什么是代码写错还是配置失误如果我是开发者该怎么修复至少把修复代码写出来。这个漏洞在真实业务里会出现在什么地方带着这三个问题去刷题你会发现新手区不是“过家家”而是整个Web安全的基础模型。下面进入正题。2. view_source到robots静态审计与信息泄露题新手区开头几题基本是“送分题”但送分不代表没有技巧。它们考察的是同一个核心能力你能否发现并利用Web应用中暴露出来的信息。2.1 view_source右键被禁用时的绕过第一题通常叫view_source场景是“X老师让小宁同学查看网页的源代码但右键菜单无法使用”。目标自然是拿到藏在源码HTML注释里的flag。右键被禁用时至少有三种方式看源代码浏览器地址栏直接输入view-source:目标URLChrome/Firefox都支持。按 F12 打开开发者工具在Elements面板看DOM结构。用快捷键CtrlU直接查看源代码。我用的是最简单的一种在地址栏前面加view-source:。这题我大概10秒就过了但真正该学的是“查看源代码”的思路——前端所有代码都在用户手里想要通过禁用右键来隐藏信息是自欺欺人。类似的还有隐藏表单字段、注释里留密码等都是同一个道理。2.2 robots.txt与备份文件泄露第二题robots更直接在网站根目录下有一个robots.txt通常用来告诉搜索引擎哪些目录不能爬。思路就是访问/robots.txt看到类似Disallow: /flag.txt的条目直接访问网站/flag.txt拿flag。这题让我意识到一个关键点robots.txt不是安全机制它只是爬虫礼仪。真正想保护的东西不会放在robots.txt里。但很多粗心的开发者却把敏感路径写在里面这就成了信息泄露的入口。还有一道backup题也类似提示“备份文件”解法是直接访问/index.php.bak把PHP源码下载下来在备份文件里找密码。这些题都在训练一个意识Web应用中的每一个公开文件都可能是攻击面。2.3 cookie与disabled_button的另类思路cookie题很有意思页面提示“请用cookie登录”一看就是让用户改Cookie。我习惯先按F12在Application面板找到Cookie的值改成管理员身份。比如原Cookie是login0改成login1再刷新flag就出来了。这里考的是开发者的“信任用户输入”的坏习惯。还有一道disabled_button题页面有一个按钮被设置了disabled属性点击无效。解法是用开发者工具把input disabled里的disabled属性删掉再点击按钮。这题更深层的意义是前端一切限制都不能作为后端安全的依靠。你可以在前端禁用一个按钮但用户依然可以手动构造请求绕过。做完这组题你会发现新手区前几题其实在给你建立“Web安全的第一性原理”所有可以修改的东西都能被修改所有可以在客户端看到的信息都会泄露。3. weak_auth与simple_php弱口令与PHP代码审计过了信息泄露关卡就来到真正需要“攻击”的题目。weak_auth是一道弱口令爆破题simple_php是一道PHP弱类型比较题两者都很有代表性。3.1 weak_auth爆破字典的威力weak_auth是一个登录页面源码注释里提示“maybe: password”。我一开始手动试了admin/admin不行再试admin/123456就成功了。但为了体验爆破我还是用Burp Suite跑了一遍打开Burp配置浏览器代理为127.0.0.1:8080确保能拦截登录请求。随便输入一个账号密码点登录拦截到POST数据包内容是usernameadminpasswordtest。把数据包发送到Intruder设置payload位置在password参数上。加载一份常见弱密码字典比如rockyou的精简版开始攻击。这里有个小坑如果用免费版Burp的Intruder速度很慢而且线程不能开太高否则会卡死。但新手区密码是123456这种级别的跑几十个就能出来。观察响应长度长度不同的那个响应就是成功登录。弱口令题的教训是很多系统不是被高级漏洞打穿的而是被弱密码撞开的。给自己测试的账号设个复杂密码比啥都强。3.2 simple_phpPHP弱类型比较的陷阱simple_php这一题给了部分PHP源码show_source(__FILE__); include(flag.php); $a $_GET[a]; $b $_GET[b]; if ($a ! $b md5($a) md5($b)) { // 输出flag }不同版本的题目可能有差异我遇到的是要求$a ! $b且md5($a) md5($b)即两个值不相等但MD5值弱相等。初学者看到“两个不同的值MD5相同”会想到哈希碰撞但实际上这里考的是PHP弱类型比较不会严格比较类型如果两个MD5值都以“0e”开头后边全是数字PHP会把他们当作科学计数法表示的0来比较因此两个完全不同的字符串只要MD5值都是0e...就会相等。经典payload是?aQNKCDZObs878926199a这两个字符串的MD5值分别是0e830400451993494058024219903391和0e545993274517709034328855841020都以0e开头所以比较结果为true。利用这个绕过就能拿到flag。这题的关键不是背两个字符串而是要理解PHP弱类型的底层逻辑当一个字符串被用于数字比较时会尝试转换为数字0e开头的字符串会被视为0。后来我刷别的题还遇到过json_decode后的比较、in_array默认松散比较等都是这个套路的变体。3.3 从题目中学到的代码审计核心思想做完这两题我总结出一个审计PHP代码的核心原则永远不要把用户的输入当成“干净”的数据。$_GET、$_POST、$_COOKIE里的值都可能包含你意想不到的类型而PHP的松散比较会把这些类型差异放大成漏洞。真实开发中如果必须做比较建议使用和hash_equals()如果必须处理上传文件文件名用随机字符串扩展名用白名单。新手区的代码审计题虽然简单但这些思想能直接迁移到真实漏洞挖掘上。4. get_post与xff_referer请求改写的实战新手区有一类题目非常“直白”要求你用指定的方法请求服务器比如get_post、xff_referer。表面上看是基本功实则是训练你理解HTTP请求结构以及如何用工具去控制请求的每一部分。4.1 GET和POST传参的基础get_post那题页面提示“请使用GET方式发送a1POST方式发送b2”。这里要理解GET参数和POST参数是放在HTTP请求不同位置的GET参数在URL的?后面POST参数在请求体里。可以用最原始的方式在浏览器地址栏构造GET参数?a1但POST参数浏览器地址栏没法直接传。很多人卡在这。两种常见的解用Burp抓包在数据包中把请求行改成GET /?a1 HTTP/1.1并在请求体里加b2。实际上当请求方法为POST时请求体会带参数但Burp里可以手动修改方法为POST然后在Body区写b2。用Python脚本import requests url http://目标地址/ data {b: 2} resp requests.get(url, params{a: 1}, datadata) print(resp.text)我用的是requests方案一发成功。这题的考点本质是GET参数和POST参数不冲突服务器会分别接收。而真实网站经常同时使用GET和POST参数如果过滤不严就可能出现逻辑绕过。4.2 X-Forwarded-For与Referer的伪造xff_referer那道题更贴近真实业务页面要求“请使用X-Forwarded-For: 123.123.123.123”并且“Referer: https://www.google.com”。原因是这类页面通常要做IP白名单和来源校验。解法是在请求头里加这两个字段。用Python请求头伪造非常方便import requests url http://目标地址/ headers { X-Forwarded-For: 123.123.123.123, Referer: https://www.google.com } resp requests.get(url, headersheaders) print(resp.text)如果是Burp就在拦截到的数据包中手动添加这两行。这里我想强调一个知识点HTTP头是可以任意构造的服务器如果只检查头里的IP或Referer却不验证真实通信链路就很容易被绕过。真实业务里X-Forwarded-For是代理服务器添加的客户端也可以自己伪造所以绝对不能拿它当唯一信任依据。4.3 用Burp Suite和Python脚本两种方式解题很多人觉得这类题“有手就行”但我觉得它们最大的价值是逼你学会用工具。Burp和Python脚本各有优劣方式优势适用场景Burp Suite可视化改headers和参数直观适合单次测试快速验证、交互式调试Python requests可重复执行适合批量测试、编写自动化exp需要多次发送不同参数或写脚本时我在刷这些题时会刻意要求自己先用Burp手工做一遍再用Python脚本做一遍。这样既能明白HTTP报文长什么样又能锻炼写exp的能力。以后遇到WAF绕过、批量扫描脚本能力会直接决定你的效率。5. command_execution与webshell从命令注入到getshell新手区的高潮部分是命令执行和webshell相关题目。这三道题让我第一次感受到“原来真的能通过输入控制服务器”也是很多人觉得“酷炫”的开始。5.1 command_execution命令拼接与过滤绕过command_execution那道题给了一个ping功能输入框让你输入IP地址后端大概是类似ping $ip的命令。如果输入框只允许IP那安全没问题但开发者没有过滤特殊字符于是可以输入127.0.0.1; ls或127.0.0.1 | cat flag.php在Linux shell中;是顺序执行|是把前一个命令的输出作为后一个命令的输入。所以目标IP直接被忽略后面的命令才是真正起作用的。很多新手不懂为什么| cat flag.php能把flag显示出来其实就是把ping的输出传给cat而cat会把flag文件内容打出来。后来这道题可能加强了过滤不让用空格于是绕法变成127.0.0.1|cat${IFS}flag.php${IFS}是Linux下默认分隔符即空格用它来代替空格绕过过滤。还有用$IFS$9的$9是空变量和IFS拼接后也能隔开命令。这些绕过手法在实战渗透中也很有用因为许多系统确实会在过滤空格、过滤;、过滤这些基本符号。5.2 webshell基础一句话木马的连接webshell那道题给了个PHP一句话木马现在基本上是用蚁剑等工具连接。核心木马代码长这样?php eval($_POST[shell]); ?或者?php system($_GET[cmd]); ?理解这题的思路比直接连接更重要eval函数会把字符串当作PHP代码执行所以你把任意PHP代码放进POST参数shell里服务器就会去执行它。蚁剑本质上就是帮你用HTTP请求和这个eval入口交互而符号是用来抑制错误输出的。新手看到webshell题目会觉得很遥远其实这就是很多真实漏洞的最终落地环节。一个上传点如果能传一句话木马就等于拿到了服务器的命令执行权限。所以Web安全里找到可控的代码执行点离getshell就只有一步之遥。5.3 新手最容易混淆的命令注入与代码执行这里必须帮大家理清两个概念命令注入Command Injection和代码执行Code Execution。它们经常被搞混但底层完全不同命令注入目标程序把用户输入直接拼接到系统命令里比如system(ping .$ip)攻击者通过特殊字符执行额外的系统命令。代码执行目标程序把用户输入交给代码执行函数比如eval($_POST[cmd])攻击者执行的是PHP本身的代码。建议新手用一道题分别练习两种场景command_execution侧重命令注入webshell侧重代码执行。两者修复方式也不同命令注入要使用escapeshellarg()或白名单校验代码执行则要尽量避免eval等危险函数。区分不了这两个后面做综合题目会非常吃力。6. 刷题后的复盘如何把WriteUp变成自己的技能把一道题的flag拿到手其实只完成了20%的工作。真正让刷题有意义的是刷完之后的复盘。我看到太多人刷了几百道题却连最基础的原理都说不上来原因就在于没有复盘。6.1 WriteUp的正确阅读姿势新手阶段建议“卡题三小时看题五分钟”先独立折腾实在没思路了再看WriteUp。看WriteUp的时候不是看对方用什么payload而是看他怎么想到这个payload的。比如看simple_php的题解重点不是记那几个字符串而是学习对方如何从PHP手册定位到弱类型比较的规则再思考为什么0e开头的字符串能绕过。建议拿个小本子把每一题的知识点、盲点、工具用法记下来过一星期再回头看如果还能独立做出来才算真掌握。6.2 将题目抽象成知识点我刷完新手区后习惯把题目归纳成知识图谱而不是孤立记忆题目核心知识点可迁移方向view_source / robots / backup信息收集与源码泄露渗透测试前期踩点cookie / disabled_button前端限制不可信修改客户端数据绕过weak_auth弱口令爆破渗透测试、内网横向simple_phpPHP弱类型比较代码审计、CTF综合题get_post / xff_refererHTTP请求构造一切业务逻辑绕过command_execution命令注入与绕过实战漏洞利用webshell一句话木马连接后渗透入门这样整理下来你会发现新手区的每一道题都不是孤立的它们串联起来就是一条完整的“Web攻击链路”信息收集 → 客户端控制 → 认证绕过 → 请求伪造 → 命令执行。掌握了这条链路再去看中高级题目思路会清晰很多。6.3 下一步进阶方向如果你顺利刷完整个Web新手区可以考虑按下面顺序进阶深入理解OWASP Top 10把SQL注入、XSS、CSRF、SSRF等漏洞的原理和防御都过一遍。继续刷攻防世界进阶区那里的题目开始有真实业务场景难度逐步拉高。读PHP/Java/Node.js安全手册至少知道每种语言有哪些危险函数和非预期行为。练习日常渗透测试在自己搭的靶场DVWA、Pikachu、sqli-labs里反复打。我个人的体会是Web安全入门最忌讳“好高骛远”。新手区题目虽然简单但它们把Web技术的各个角落都点了一遍。真正把这些基础打扎实了后面看任何漏洞都像看老朋友——你认得它的脸也知道它藏在哪道题里。最后分享一个小习惯每刷完一道题我都会在自己的笔记里补一句“如果我在真实代码里看到这个写法我会怎么改”。哪天你在公司代码里看到$_GET[id]直接拼进SQL脑海里能立刻浮现出新手区那道注入题的payload那这篇文章就没白写。