1. 从“3分题”说起这类Web进阶挑战到底在考什么很多人第一次接触攻防世界Web高手进阶区的3分题都会有一种“被标题骗了”的感觉。题目名字看起来平平无奇分值也不高但真正上手之后才发现它考察的往往不是单一知识点而是对Web安全基础链条的综合理解。我自己在带新人的时候经常拿这类3分题当“试金石”——能独立做出来说明基础打得还算扎实做不出来往往不是某个工具不会用而是对HTTP协议、前端源码、后端逻辑之间的联动关系缺乏整体认知。这类题目的核心特征可以归纳为几个关键词源码泄露、前端绕过、编码解码、请求伪造、逻辑漏洞。它们不会一上来就让你去打复杂的反序列化或者内存马而是把考点藏在一个看似普通的页面里等你用正确的姿势去“翻”出来。比如一个登录框可能真正的突破口不在密码爆破而在页面注释里一个文件上传点可能真正的限制不在前端JS而在后端对文件名的处理方式。我个人的经验是做3分题最忌讳的就是“上来就扫”。很多人习惯性地打开扫描器一顿跑结果扫出来一堆无关紧要的信息反而把真正关键的线索淹没了。正确的做法应该是先手动浏览页面看URL结构、看表单字段、看Cookie、看返回头把整个交互流程在脑子里过一遍然后再决定用什么工具去验证猜想。提示3分题的“3分”通常对应的是知识点数量或难度层级而不是说它简单。很多3分题的设计思路是“单点深入”即只考一个核心漏洞但这个漏洞的触发条件需要你精确构造。从知识体系上看这类题目覆盖的范围大致包括HTTP请求与响应结构、常见Web漏洞原理如SQL注入、XSS、文件包含、目录遍历、编码与加密基础Base64、URL编码、MD5、以及简单的逻辑绕过技巧。如果你对这些概念还停留在“听说过”的阶段建议先补一补基础否则做3分题会非常痛苦——因为你看得懂每个字但连不起来。2. 信息收集阶段别急着扫先把页面“读”一遍2.1 手动浏览时到底该看什么我见过太多人做Web题时打开页面第一件事就是右键查看源代码然后CtrlF搜“flag”。这当然没错但远远不够。手动浏览的核心目的是建立对目标应用的完整认知包括它的功能点、输入点、输出点以及可能的隐藏路径。具体来说我会按以下顺序过一遍URL结构看路径是/index.php?id1还是/page?filehome参数名往往暗示了后端逻辑。比如file参数大概率对应文件包含或文件读取url参数可能对应SSRF。页面源码重点看注释、隐藏字段、被注释掉的表单、以及引用的JS文件。很多题目的第一步线索就藏在!-- hint: ... --里。HTTP响应头Server、X-Powered-By、Set-Cookie这些字段能告诉你后端语言和框架的大致范围。有时候Set-Cookie里会直接给出一个Base64编码的提示。Cookie内容很多逻辑漏洞题会把用户身份、权限等级直接放在Cookie里比如roleuser改成roleadmin就完事了。robots.txt和常见备份文件www.zip、index.php.bak、.git泄露这些在3分题里出现频率极高。2.2 目录扫描的正确打开方式手动看完之后如果还没有头绪再上目录扫描。但这里有个关键点字典的选择比扫描器本身更重要。3分题通常不会用太偏的路径常见的有/admin、/backup、/source、/flag、/api。我一般会先用小字典快速过一遍如果没结果再考虑用中等字典。扫描的时候要注意状态码。200当然最理想但403和302同样值得关注。403说明路径存在但被禁止访问可能通过绕过手段访问302说明有跳转跳转的目标往往就是真正的入口。注意有些题目会故意设置“扫描器陷阱”比如对频繁请求的IP返回假页面。所以扫描速度不要太快线程数控制在10以内比较稳妥。2.3 前端源码里的“送分题”与“陷阱题”前端源码是3分题最常出线索的地方但也是最容易让人误入歧途的地方。我总结了几种常见情况线索类型典型表现应对方式注释提示!-- flag in /secret.php --直接访问提示路径隐藏表单字段input typehidden nameis_admin value0修改值为1后提交JS验证逻辑if(password 123456)直接查看JS文件或绕过前端验证编码字符串一串Base64或十六进制解码后查看内容被注释的代码!-- a href/admin.phpadmin/a --访问被注释的链接但要注意有些题目会故意在前端放“假线索”比如注释里写一个不存在的路径真正的入口在别处。这时候就需要结合其他信息综合判断不要一条路走到黑。3. 常见漏洞类型的识别与利用思路3.1 文件包含与目录遍历路径参数是重点怀疑对象文件包含类题目在3分题里非常常见典型特征是URL里出现?file、?page、?path这类参数。识别方法很简单把参数值改成../../../../etc/passwd如果页面返回了系统文件内容基本可以确定存在目录遍历或文件包含。但3分题通常不会这么直白。常见的限制和绕过方式包括过滤了../尝试....//、..%2f、%2e%2e%2f等编码绕过。强制添加后缀比如?filehome实际读取的是home.php这时候可以用%00截断PHP 5.3以下或者利用伪协议php://filter。只允许特定目录尝试用绝对路径或者多次跳转。我个人的习惯是遇到文件包含先测php://filter/convert.base64-encode/resourceindex.php把源码读出来再说。源码里往往藏着下一步的线索比如数据库配置、过滤规则、或者flag的位置。3.2 SQL注入从“有没有”到“怎么用”SQL注入在3分题里通常不会考太复杂的盲注或时间盲注更多是联合查询和报错注入。判断注入点的方法很基础单引号、and 11、and 12看页面返回是否变化。但这里有个坑很多题目会过滤关键字比如select、union、where。这时候就需要用到绕过技巧大小写混合SeLeCt、UnIoN。内联注释/*!select*/、/*!union*/。等价替换and换成or换成||空格换成/**/或%09。编码绕过URL编码、十六进制编码。提示如果页面没有回显但你有报错信息优先用报错注入updatexml、extractvalue。如果连报错都没有再考虑盲注。3分题一般不会让你盲注到天荒地老。3.3 文件上传前端验证和后端验证的博弈文件上传题的乐趣在于“绕过”。3分题的上传点通常只做了一层验证要么是前端JS验证要么是后端MIME类型验证要么是后缀名黑名单。我的测试流程是这样的先传一个正常图片确认上传功能可用观察返回路径。传一个.php文件看是否被拦截。如果被拦截看拦截发生在哪一层。如果是前端JS拦截禁用JS、抓包改后缀、或者直接构造请求。如果是后端MIME验证修改Content-Type为image/jpeg。如果是后缀黑名单尝试phtml、php5、php7、pHp、php.、php空格、php::$DATAWindows等。如果还不行考虑.htaccess文件上传或者图片马文件包含组合利用。这里有个经验很多3分题的上传点其实是个“幌子”真正的漏洞在文件上传后的文件包含或者路径穿越。比如上传一个图片马然后通过文件包含去解析它。3.4 逻辑漏洞Cookie、越权与条件竞争逻辑漏洞是3分题里最“讲道理”的一类——你不需要懂太多底层原理只需要理解业务逻辑然后找到那个“不合理”的地方。常见的逻辑漏洞包括Cookie伪造Cookie里直接存了admin0改成admin1就提权。越权访问修改URL里的用户ID比如/user?id1改成/user?id2能看到别人的信息。条件竞争比如上传文件后先允许访问再删除在删除前快速访问。支付逻辑修改价格参数、数量为负数、或者重复使用优惠券。这类题目的关键是多观察、多尝试。看到一个功能先问自己如果我是开发者我会怎么实现然后想如果我要偷懒我会在哪里留下漏洞4. 编码与加密那些让你“看不懂”的字符串4.1 常见编码的识别与快速解码3分题里经常出现各种编码后的字符串识别它们是一项基本功。我整理了一个快速对照表编码类型特征解码方式Base64以结尾字符集为A-Za-z0-9/在线工具或base64 -dURL编码%XX形式浏览器自动解码或urldecodeHex编码纯十六进制字符xxd -r或在线工具Unicode\uXXXX形式JS的unescape或Python的decodeHTML实体#XX;或lt;浏览器自动解析JWT三段式以.分隔解码前两段查看内容遇到编码不要慌先看长度和字符集基本能猜个八九不离十。如果实在看不出来可以试试用CyberChef的“Magic”功能它能自动识别多种编码。4.2 弱比较与哈希绕过PHP的弱比较是3分题的经典考点。比如if($a $b)如果两个字符串都是0e开头的数字格式它们会被当作科学计数法比较结果相等。常见的0e开头的MD5值有240610708-0e462097431906509019562988736854QNKCDZO-0e830400451993494058024219903391aabg7XSs-0e087386482136013740957780965295如果题目要求md5($a) md5($b)但$a ! $b就可以用这些值来绕过。还有一种情况是md5($a) 0e...这时候需要找一个MD5值以0e开头的字符串。除了上面这些还可以用数组绕过md5([])返回nullnull null为真。注意PHP 8.0之后弱比较的行为有所变化0e开头的字符串不再被当作数字。所以做老题的时候要注意环境版本。4.3 代码审计中的“魔术方法”与“变量覆盖”如果题目给了源码那就进入了代码审计的范畴。3分题的源码通常不长重点看几个地方extract()变量覆盖可能覆盖掉关键变量。parse_str()同样可能导致变量覆盖。$$可变变量可能被利用来修改任意变量。preg_replace()的/e修饰符命令执行PHP 7以下。unserialize()反序列化漏洞但3分题一般不会考太深。我一般会先通读一遍源码把用户可控的输入点标出来然后跟踪这些输入在代码中的流向看有没有经过过滤、有没有被拼接进SQL、有没有被包含进文件。5. 工具链与实操环境用什么、怎么用5.1 浏览器插件不只是“看源码”做Web题浏览器是主战场。除了开发者工具F12我还会装几个插件HackBar快速修改请求头、POST数据、编码解码。Wappalyzer识别网站使用的技术栈。Cookie Editor方便地修改Cookie。Proxy SwitchyOmega配合抓包工具使用。开发者工具里我重点关注Network面板。每次提交表单、点击链接都看看发了什么请求、返回了什么。很多时候前端页面没变化但Network里已经暴露了关键信息。5.2 抓包工具Burp Suite的“最小必要配置”Burp Suite是Web题必备但很多人一上来就开全量扫描结果又慢又乱。我的建议是只开Proxy和RepeaterProxy用来拦截请求Repeater用来手动修改和重放。关闭Scanner3分题不需要自动扫描手动测试更精准。设置好拦截规则只拦截目标域名的请求避免干扰。善用Repeater的“Follow redirect”有些题目需要跟随跳转才能看到最终结果。一个实用技巧在Repeater里把请求发给Intruder之前先用Repeater手动测几遍确认参数位置和返回特征再决定要不要爆破。5.3 命令行工具curl与python脚本有些题目需要批量测试或者精确控制请求这时候命令行工具就派上用场了。比如用curl快速测试curl -X POST http://target.com/login -d usernameadminpassword123 -v或者用Python写个小脚本import requests url http://target.com/api for i in range(1, 100): r requests.get(f{url}?id{i}) if flag in r.text: print(fFound at {i}: {r.text}) break提示写脚本的时候记得加time.sleep()避免请求过快被ban。3分题的服务器通常比较脆弱别把人家打挂了。6. 踩坑实录那些让我卡了半天的“小问题”6.1 编码问题导致的“明明对了却不对”有一次做一道文件包含题我构造了?filephp://filter/convert.base64-encode/resourceindex.php浏览器返回了一串Base64。我解码后看到了源码但源码里没有flag。我又试了flag.php、config.php都没有。后来才发现题目对php://做了过滤但过滤是在URL解码之后进行的。也就是说我如果把php://写成%70%68%70%3a%2f%2f就能绕过过滤。这个坑让我意识到过滤器的位置和顺序比过滤规则本身更重要。6.2 请求方法不对怎么测都没反应还有一次一个登录框我用POST提交了半天页面始终返回“用户名或密码错误”。我以为是注入测了半天没反应。后来随手用GET试了一下居然直接返回了“登录成功”。原来题目只接受GET请求POST请求被后端忽略了。这个坑告诉我不要假设请求方法GET、POST、PUT、DELETE都试一遍有时候会有意外收获。6.3 路径穿越的“深度”问题目录遍历题里../的数量很关键。有时候你写../../../../etc/passwd能读到有时候写../../../../../etc/passwd反而读不到。这是因为后端可能对路径做了规范化处理或者当前脚本的目录深度不同。我的经验是从少到多试先试../再试../../逐步增加。同时注意观察返回的错误信息有时候会提示“路径不存在”或者“权限不足”这些都能帮你判断当前目录的位置。6.4 弱比较的“版本陷阱”前面提到过0e开头的MD5弱比较但我在一道题里用240610708死活绕不过去。后来查了PHP版本发现是PHP 8.0弱比较规则变了。最后用数组绕过才成功。这个坑提醒我做题前先确认环境版本。可以通过phpinfo页面、响应头里的X-Powered-By、或者报错信息来判断。如果题目没有明确说明就多准备几套绕过方案。7. 从3分题到更高难度能力迁移与进阶方向做完几道3分题之后你会发现它们其实是在帮你建立一套标准化的Web安全测试思维先信息收集再漏洞识别然后构造利用最后验证结果。这套思维在更高难度的题目里同样适用只是每个环节的复杂度会提升。比如3分题里的文件包含可能只是简单的?file../../etc/passwd而高分题里可能涉及phar://反序列化、session文件包含、或者日志文件包含。3分题里的SQL注入可能只是联合查询高分题里可能是堆叠注入、二次注入、或者NoSQL注入。但无论难度怎么变核心逻辑是不变的找到用户可控的输入跟踪它的流向看它在哪个环节没有被正确处理。3分题的价值就在于它用最小的场景帮你把这个逻辑跑通了一遍。我个人的建议是做完每道3分题后不要急着看Writeup先自己复盘一遍我是怎么找到突破口的中间走了哪些弯路如果换一种过滤方式我还能不能绕过这种复盘比多做十道题都有用。另外3分题里积累的编码解码能力和工具使用熟练度是后续做更难题目的基础。比如Base64解码、URL编码绕过、Burp Suite的Repeater使用这些技能在CTF里是通用的。你不需要成为工具大师但至少要能做到“想到什么就能快速验证什么”。最后分享一个我自己的习惯我会把每道题的关键请求和利用Payload保存下来按漏洞类型分类整理。时间长了就形成了一套自己的“武器库”。下次遇到类似的题目直接翻出来改改参数就能用。这个习惯让我在做3分题时速度提升了很多也让我对各类漏洞的利用方式有了更直观的理解。