CTF Web 方向大概是新手村人最多的地方了。原因很简单Web题贴近真实场景、上手门槛低、题型套路相对固定而且对客户端几乎没有要求一台能开浏览器的电脑就能入场。只要你愿意花时间跟几道基础题走一遍真的能在很短的时间内拿下第一个flag也就是圈里常说的“首血”。这篇文章我挑了Web方向比较有代表性的3道基础题——信息泄露、SQL注入、命令执行手把手把解题过程拆开讲。需要先说明一点这些题目全部来自公开的CTF练习靶场属于专门搭建的模拟环境里面一切“漏洞”都是刻意设计出的题目内容不含任何真实业务系统。这样的练习方式是安全圈公认的合法入门路径。如果你是第一次接触CTF完全可以跟着我的操作一步步复现如果你已经有些基础建议重点看后面关于Flag提交和常见坑的部分那里有几个我踩过很多次才总结出来的关键细节。1. 开打之前靶场、Flag和工具链1.1 什么是CTF Web方向Flag长什么样CTF全称Capture The Flag中文叫夺旗赛。比赛会准备若干台脆弱的服务器或者虚拟环境参赛者通过分析代码、利用漏洞、猜测逻辑从中找到一个特定格式的字符串这个字符串就是Flag。找到它把它提交到题目对应的计分系统里就能得分。Web方向在CTF里特指与网站、浏览器、HTTP协议相关的题目。题目会给你一个网址通常是线上地址你在浏览器里访问它像用普通网站一样操作但其中藏着几道“关卡”。比如源码里多了一行注释、登录框能注入SQL、上传接口没有校验、搜索功能把用户输入直接拼进了命令里。这些问题放到真实系统里就是安全漏洞放到CTF里就成了题目。Flag的常见格式一般是flag{...}、ctf{...}也可能直接是一串有规律的字符串。提交的时候必须严格区分大小写和花括号多一个空格、少一个下划线都会判错。有些比赛平台在首页会写明本场赛事的Flag格式做题前先看一眼总没错。1.2 你需要准备哪些工具不要一听CTF就觉得要装一堆重型软件。基础题阶段真正用得上的工具非常朴素浏览器开发者工具。按F12就能打开主要看三个面板元素面板看网页源码和样式网络面板看请求和响应控制台看JavaScript报错。这三样能帮你完成一半的信息收集工作。一个能改请求的工具。浏览器自带开发者工具里也可以编辑并重发请求但对新人来说不够直观。你可以用常见的HTTP抓包代理工具利用它的拦截功能修改请求参数并重新发送。如果不想一开始就接触复杂界面先用浏览器控制台或终端里的curl命令也行。终端。Linux系统自带终端Windows用户建议用系统自带的PowerShell或者安装WSL。跑几个简单命令、看网络响应、用curl发包都会用到它。一个本地记录文件。把每一题的题目地址、请求参数、报错信息、Flag都记录下来。别小看这个习惯你在复盘的时候会感谢当初记笔记的自己。我个人不建议第一步就背一堆工具快捷键。工具只是加速解题的核心是理解漏洞原理。先把浏览器用熟等遇到了“需要频繁改包”的场景再上抓包工具也不迟。2. 第一道题跟着robots.txt走Flag藏得并不深2.1 题目场景一个只写了“上线公告”的网站假设你打开题目链接看到一个非常普通的公司官网页面标题写着“某某科技官网”页面正文只有一行字“网站建设完成更多内容即将上线。”除此之外没有登录框、没有搜索框、没有可点击的链接。普通用户看到这个页面可能就直接关了但作为CTF选手我们的任务才刚刚开始。遇到这种“空壳”页面第一反应不是访问功能而是做信息收集。信息收集是Web题永恒的第一步甚至可以说做得好的信息收集等于题目解开了一半。第一件事是查看源码。在页面空白处右键选择“查看网页源代码”或者直接按CtrlU。我会快速搜索源码里的关键词flag、key、secret、admin、password、TODO、hidden、backup。很多时候出题人懒得隐藏直接把提示写在注释里面。假设在这道题里源码并没什么可疑内容只有一个正常页面结构。那么接下来就要考虑另一个方向网站有没有隐藏的目录或文件导致这个页面之外的资源也被暴露出来了。这就轮到robots.txt登场了。2.2 三个动作找到隐藏文件在浏览器地址栏访问题目域名下的/robots.txt这是网站与搜索引擎爬虫之间的一种约定协议。它本来作用是指示爬虫哪些路径可以抓取、哪些路径不能抓取。但因为这份文件是公开的很多网站管理员习惯把不想被搜索到的后台路径写在里面这反而等于给攻击者指了路。CTF出题人也特别爱用这个考点。打开robots.txt之后你可能会看到类似这样的内容User-agent: * Disallow: /flag.txt Disallow: /admin/作用很直白让所有爬虫不要访问/flag.txt和/admin/。但对CTF选手来说这不就是一份目录清单吗我们按图索骥先访问/flag.txt浏览器直接显示一行字符串flag{robots_are_not_your_friends}。拿分。如果/flag.txt不存在再访问/admin/里面往往又是登录框或者另一段隐藏逻辑题目难度也随之提升。如果robots.txt里什么路径都没有或者文件根本不存在也不要慌。这时候可以手动试探一些常见敏感路径/.git/config/.svn/entries/backup.zip/web.zip/www.zip/flag.php/secret.txt/admin.php/test.php.bak基础题基本离不开这些名字。尤其备份文件很多写代码的人习惯把网站根目录打包成zip放在Web根目录下下载下来之后本地解压能直接看到完整源码Flag往往就在源码注释或配置文件里。2.3 我总结的源码robots的快速检查清单这道题给我们的最大收获不是你会访问robots.txt而是养成一套“看到页面先收集信息”的肌肉记忆。我在刷题时会按固定顺序走查看页面源代码搜索关键字flag、key、pass、secret、admin、username、token、TODO、fixme。检查响应头看看有没有Set-Cookie、X-Powered-By、Server、Location等泄露信息。访问/robots.txt、/sitemap.xml、/crossdomain.xml、/.well-known/security.txt这类通用文件。如果题目允许使用目录扫描工具跑一遍常见路径字典看有没有隐藏文件。很多新人会觉得自己猜路径太麻烦不如直接上扫描器。但扫描器会收集到大量无关文件反而干扰判断。基础题靠经验枚举就够了扫描是后面打复杂题才需要的。做这道题的关键不是“背路径”而是明白“信息不会凭空出现也不会凭空消失Flag只会在你觉得最难找的地方”。顺着这个思路很多隐藏内容都能被翻出来。3. 第二道题万能密码不提我们讲讲为什么能动3.1 题目场景一个会飙红的登录框第二题往往是个后台登录页面。页面很简单用户名输入框、密码输入框、一个登录按钮。页面上可能还有一行小字“admin后台登录系统”。新手遇到登录框会先试弱口令admin/adminadmin/123456admin/admin888。遗憾的是CTF题目很少出弱口令给你直接进多半是考验注入。当我们连续提交几组弱口令失败之后应该切换思路测试这个地方有没有SQL注入。测试方法不要太复杂先在用户名处输入一个单引号admin密码随便填然后提交。如果页面报错比如出现“SQL syntax error”或者“You have an error in your SQL syntax”说明后端把我们输入的内容直接拼到了SQL语句里而且没有过滤。这就是一个可以深入利用的注入点。当然有些题目前端会做字符限制或者在提交前用JavaScript拦截。这时候不要只盯着页面输入框可以用抓包工具修改请求后再提交或者用终端直接发送POST请求。我习惯先正常登录一次把请求里的参数格式复制下来再手动改参数内容重放这样可以排除前端干扰。3.2 万能密码的构造与原理登录框对应的后端代码逻辑大概率长这样SELECT * FROM users WHERE username$username AND password$password我们输入的用户名和密码被直接插到了两个单引号之间。当用户名输入admin or 11#密码随便填比如x实际执行的SQL就变成SELECT * FROM users WHERE usernameadmin or 11# AND passwordx这里我们需要理解三个符号的作用。单引号是为了闭合SQL语句里username值前面的引号这样我们后面的内容就不再是字符串而变成了SQL语法的一部分。or 11是一个永真的条件会让整个WHERE子句判断为真于是查询返回表里的第一行用户通常是admin。#是MySQL里的注释符它会把后面所有内容注释掉包括原本的AND passwordx这样密码校验就直接被跳过了。不同数据库的注释符不一样。MySQL支持#和--注意后面至少有一个空格在URL里通常写成--或--%20SQL Server和Oracle用--部分场景还支持/*...*/。CTF入门题最常用的是MySQL所以#和--基本通吃。这里有一个很多新手都会踩的坑直接在页面输入框里输入admin or 11#可能提交不成功因为浏览器地址栏或表单处理会忽略#后面的内容。如果请求是GET方式#会被当作浏览器锚点而不是参数内容根本发不到服务器。遇到这种情况可以把#改成URL编码%23或者直接用--。如果用抓包工具或者终端来发请求就没有这个烦恼。3.3 完整操作流程我强烈建议你跟着下面的流程完整复现一遍不要只背Payload打开浏览器开发者工具切到网络面板开启保留日志。在页面输入任意用户名密码点击登录找到生成的POST请求。查看请求参数确认后端接收的参数名是username和password。用抓包工具拦截请求把username参数改成admin or 11#password参数随意。点击发送观察响应。如果页面跳转到了后台并显示“欢迎admin”说明注入成功。在返回内容里搜索flag。通常后台管理页面会直接显示flag{...}。需要注意的是万能密码不是万能的。如果题目代码里对输入做了过滤比如把空格删了、把or屏蔽了、把注释符转义了这个Payload就不生效。这时候要么换空格绕过方式要么考虑联合注入、报错注入、盲注等更复杂的思路。入门阶段先把万能密码的原理搞懂后面的进阶就顺理成章。毕竟所有SQL注入的核心都是同一件事让输入在查询语句中产生“歧义”。这道题最大的价值是让你亲眼看到“用户的输入居然能改变SQL语句的逻辑”。以后再看到登录框你至少不会只想到弱口令。4. 第三道题命令拼接一句话就能拿flag4.1 题目场景一个“Ping检测”功能第三题做了一个小工具页面标题写着“网络连通性检测”。输入框旁边有提示“请输入IP地址例如 127.0.0.1”。你输入127.0.0.1页面返回几行ping命令的输出“PING 127.0.0.1 ... 4 packets transmitted, 4 received, 0% packet loss”。出现这种回显基本可以确认后端是把我们输入的内容拼进了一条系统命令里执行比如$ip $_POST[ip]; system(ping -c 4 . $ip);如果这个工具只是用来检测IP那我们输入任意IP都正常。可一旦我们在IP后面拼接额外命令就有意思了。测试命令注入的常见符号有四个;分号前面命令执行完不管成功失败继续执行后面命令。|管道符把前一个命令的输出当作后一个命令的输入。如果后一个命令有回显会直接显示在页面上。逻辑与前面的命令必须执行成功才会执行后面的命令。||逻辑或前面的命令执行失败才执行后面的命令。我最先试的是分号因为它最“宽容”。输入127.0.0.1;ls页面在ping结果下方输出了当前目录的文件列表说明命令注入成立。接着输入127.0.0.1;cat flag.php页面直接把flag.php文件内容输出出来其中就包含flag。整个过程约一分钟。4.2 被过滤时怎么绕过如果出题人给工具加了一点过滤比如屏蔽了空格或者屏蔽了cat就需要一些绕过技巧。这些技巧在真实的授权测试中也很有用这里分享几个最常见的空格被过滤时Linux系统里可以用${IFS}代替空格。比如原本是cat flag.php可以改写成cat${IFS}flag.php。$IFS是shell的字段分隔符变量默认包含空格、制表符和换行在命令中当成空格使用即可。也可以用$IFS$9来隔开$9是第九个位置的参数变量值为空但能和IFS组合出两个分隔的效果也是常见绕法。cat被过滤时可以试tac从末尾开始显示、more、less、head、tail、nl。很多Linux命令都能查看文件内容只是输出格式不同。如果所有常见查看命令都被过滤可以尝试给命令插入空字符或引号比如cat、c\at某些过滤只做精确匹配时会漏掉这种写法。如果符号被过滤比如分号和管道符都干掉了可以尝试通过%0a换行符拆成多条命令或者用$(命令替换)来执行嵌套命令。这些属于进阶内容基础题很少这么复杂。4.3 我自己踩过的坑空格和URL编码这道题看起来简单但实际做题时很多新手都会在提交环节翻车。最常见的坑是输入框把空格过滤了或者前端JavaScript做了字符白名单连空格都不允许输入。页面验证通过不代表后端也安全所以不要被前端限制迷惑。优先级最高的做法是用抓包工具直接修改原始请求或者用终端发送curl请求curl -d ip127.0.0.1;cat flag.php http://靶场地址/如果后端过滤了空格payload就改成curl -d ip127.0.0.1;cat${IFS}flag.php http://靶场地址/另一个坑是URL编码。如果用GET方式提交分号、管道符、空格在URL里都有特殊含义需要做URL编码。比如分号编码成%3B管道符编码成%7C空格编码成%20或者直接${IFS}。很多解题工具会自动编码但理解原理能让你在工具失灵时不至于卡死。命令注入的难度可高可低但基础题的门槛非常低。关键是要熟悉常见的Linux命令ls、cat、find、grep、whoami、id、pwd。做题时先列目录再读文件按顺序来基本不会错。5. 拿首血要过的最后一关提交Flag的艺术5.1 Flag的格式与提交规则找到Flag只是第一步提交不上等于白做。很多比赛平台的提交框会严格比对字符串多一个换行符都算错误。我建议把Flag复制到本地文本编辑器里去掉首尾空格再粘贴提交。常见错误包括把flag{...}误认为要提交...部分把题目描述的“其中flag为”后面的内容连同提示一起复制大小写不一致比如题目给出的是Flag{...}你提交的是flag{...}还有明明是_下划线你看成了-连字符。遇到提交失败不要连续盲目重试先检查格式。部分比赛平台会对连续错误提交做限流比如30秒内只能提交5次乱试反而浪费时间。有的题目会出现多个Flag比如一个放在源码里一个放在管理后台。不要把页面里出现的所有字符串都当成Flag优先级是看题目标签、看题目格式提示、看页面是否用醒目的颜色标注。通常出题人会用高亮代码块或者注释标记出真正的Flag。5.2 首血怎么抢得快“首血”指的是在一道题里第一个提交完整Flag的参赛者很多比赛平台会在题目右侧亮一个“First Blood”标识。想在入门阶段体验一次首血除了实力更需要流程上的效率。第一个习惯是不要花时间在无效操作上。打开题目后先复制URL和题目描述快速判断题目类型。是信息泄露题就立马翻源码、查robots是登录框就顺手测弱口令和单引号是Ping之类的工具就试探命令注入。把一套固定动作练成条件反射比临时翻教程快得多。第二个习惯是提前准备常用的Payload。把万能密码、命令注入拼接符号、常见路径、常见备份文件名写在一个速查表里。平时刷题遇到一个有效Payload就丢进速查表下次直接复制粘贴。很多人觉得背Payload不高级但在CTF比赛里速度也是能力的一部分。当然理解原理的前提下背Payload才有意义否则换个套路就抓瞎。第三个习惯是保持专注并信任队友。组队比赛时一个人负责信息收集另一个人负责利用漏洞。看到别人已经报出Flag别再去重复劳动。首血往往属于动作最快、分工最清晰的那支队伍。5.3 为什么不要硬猜Flag有些新手拿到题目之后不看漏洞直接在提交框里输入乱猜的Flag比如“flag{admin}”“flag{123456}”。这种行为在入门练习中除了浪费次数没有任何收益在正式比赛中甚至会破坏个人信誉。某些平台会把频繁无效提交标记为恶意行为限制你继续提交因小失大。真正应该做的是从题目中找flag。如果找不到说明前面的漏洞利用还差一步。这时候回过头审视有没有漏看源码有没有试过另一个端口有没有把响应头里的内容忽略掉Flag是题目设计者用代码精心埋下的结果不是赌出来的字符串。保持这个信念你就能始终走在“解题”而不是“猜题”的正确道路上。6. 三道题之外新手必备的排查技巧与成长路线6.1 卡住的时候试试“从结果倒推”入门阶段最常见的挫败感是一道题做了两个小时还是什么都拿不到。我的建议是不要一直闷头乱试而要建立一个“倒推思维”。先问自己这道题属于刚才讲的哪一类如果页面只有一个登录框那目标大概率是通过登录获取Flag方向就应该集中在绕过验证、注入、逻辑漏洞上。如果页面是一个能执行命令的工具目标大概率是读取文件方向就该放在命令注入的利用和绕过上。把问题归类搜索范围就缩小了。然后尝试制造“异常”。输入一个超长字符串、提交一个特殊字符、删除某个参数看页面会不会报错。报错信息是后端最好的提示灯。数据库报错说明是SQL问题PHP警告说明后端处理了你的输入并把它拼进某种函数404或500说明路径不对。这些反馈都能帮你判断下一步该往哪里走。最后别忘了看题目描述。CTF出题人通常会在题面里埋暗示比如“听说管理员喜欢备份重要文件”“这个网页好像没有过滤任何东西”。这些话不是废话是解题方向。6.2 从零开始怎么系统提升Web能力三道基础题跑通之后不要急着挑战高难度综合题。先把基础知识补扎实。建议按顺序掌握这几个模块HTTP协议请求方法、状态码、请求头、响应头、Cookie、Session、URL编码。这是Web方向的地基不熟练后面处处受阻。常见漏洞原理SQL注入、XSS跨站脚本、文件上传、文件包含、命令注入、SSRF服务端请求伪造、反序列化、逻辑漏洞。每类漏洞至少亲手复现一次。后端语言基础PHP是CTF Web题最常见的后端语言建议学会阅读简单PHP代码知道$_GET、$_POST、include、system这些关键字的作用。Java、Python、Node.js的Web题也越来越多但入门阶段不用贪多。工具链除了浏览器至少熟悉一个抓包工具、一个目录扫描工具、一个数据库操作客户端。工具不在于多在于用得熟练。刷题节奏上建议每周固定完成3-5道题每道题做完之后写一句话复盘考点是什么我卡在哪里下次遇到同类题要第一时间检查什么这一步比刷题数量重要得多。刷了题不复盘等于白刷。6.3 安全底线不管CTF打得有多好有一点必须刻在骨子里只有获得授权的靶场和实验环境才能进行这些测试。CTF竞赛平台和自建的漏洞环境是合法的练习场但真实网站属于他人的计算机系统未经授权去测试轻则违反平台规则重则触犯法律。这不是危言耸听而是每一个安全从业者都必须遵守的职业红线。所以当你学会SQL注入、命令注入之后千万不要手痒去试某些真实网站。真正成熟的入门方式是在靶场里充分练习把好奇心留给可控的环境。安全技术是一把工具能不能被信任取决于使用它的人懂不懂边界。最后再分享一个我很受用的小技巧无论做哪道Web题先把页面完整源码复制一份存到本地再把响应头截个图。很多看似复杂的题目答案就藏在源码注释或一个不起眼的响应头字段里。这个习惯帮我节省过无数冤枉时间也算是在你们即将开始的Web解题之旅前补上最后一块垫脚石。希望你们都能在合法的CTF环境里体会到第一次提交Flag的快乐。