Web CTF 的整体考点地图
Web CTF 的整体考点地图
拿到web题目应该怎么分析
一、Web 题的核心分析框架
一般把 Web 题分成 5 层:
1
2
3
4
5
- 页面交互点
- 请求参数点
- 后端语言特性
- 中间件/配置特性
- 业务逻辑漏洞
也就是说,拿到一个页面,先问自己:
1
2
3
4
5
这个页面让我输入什么?
这些输入会被后端怎么处理?
处理结果在哪里体现?
有没有报错、回显、跳转、文件生成?
后端可能是什么语言和框架?
CTF Web 的本质基本就是:用户可控输入进入了危险位置。
二、常见 Web 考点总框架
1. 信息泄露类
这是最基础的一类,很多题第一步都要看。
常见位置:
1
2
3
4
5
6
7
8
9
10
/source
/www.zip
/.git/
/robots.txt
/.svn/
/index.php.bak
/.DS_Store
/phpinfo.php
/flag
/flag.php
还要看:
1
2
3
4
5
6
7
8
页面源代码
响应头
Cookie
JS 文件
CSS 文件
注释
报错信息
目录扫描结果
典型考点:
1
2
3
4
5
源码泄露
备份文件泄露
Git 泄露
敏感路径泄露
配置文件泄露
看到页面很简单、功能很少时,优先怀疑信息泄露。
2. SQL 注入类
只要页面里有这些功能,就要想到 SQL 注入:
1
2
3
4
5
6
7
登录
查询
搜索
文章 id
用户 id
商品 id
排序参数
常见参数:
1
2
3
4
?id=1
?user=admin
?search=xxx
?order=1
判断方法:
1
2
3
4
输入 ' 是否报错
输入 and 1=1 / and 1=2 页面是否不同
输入 order by 判断字段数
输入 union select 判断回显点
常见分支:
1
2
3
4
5
6
7
8
联合查询注入
报错注入
布尔盲注
时间盲注
堆叠注入
二次注入
宽字节注入
过滤绕过
CTF 里 SQL 注入经常和过滤绕过结合,比如:
1
2
3
4
5
6
空格过滤
select 过滤
union 过滤
逗号过滤
引号过滤
or / and 过滤
3. 文件上传类
看到上传框,第一反应就是这一类。
核心问题只有三个:
1
2
3
能不能上传?
上传到哪里?
上传后能不能被解析执行?
常见考点:
1
2
3
4
5
6
7
8
9
10
11
12
前端限制绕过
Content-Type 绕过
文件头绕过
后缀黑名单绕过
大小写绕过
双后缀绕过
.htaccess 绕过
.user.ini 绕过
图片马
条件竞争
文件名路径穿越
phar 反序列化
比如:
1
2
3
4
5
6
a.php
a.phtml
a.php5
a.phar
a.php.jpg
a.Php
文件头伪装:
1
2
GIF89a
如果上传目录不解析 PHP,就继续想:
1
2
3
4
5
有没有 .htaccess?
有没有 .user.ini?
有没有文件包含功能?
有没有头像裁剪/图片处理触发?
有没有 phar 反序列化链?
4. 文件包含 / 路径穿越类
看到这种参数要敏感:
1
2
3
4
5
6
?file=
?page=
?path=
?url=
?template=
?lang=
常见 payload 思路:
1
2
3
4
5
?file=../../../../etc/passwd
?file=php://filter/read=convert.base64-encode/resource=index.php
?file=data://text/plain,
?file=zip://xxx.zip%23shell.php
?file=phar://xxx.phar
常见考点:
1
2
3
4
5
6
7
任意文件读取
本地文件包含 LFI
远程文件包含 RFI
PHP 伪协议
日志包含
session 文件包含
上传文件包含
文件上传和文件包含经常是组合拳:
1
先上传图片马,再通过 include 参数包含它。
5. 命令执行类
看到这些功能要想到命令执行:
1
2
3
4
5
6
7
8
ping
curl
nslookup
dig
文件压缩
图片处理
代码运行
系统检测
常见参数:
1
2
3
?ip=127.0.0.1
?url=http://example.com
?cmd=whoami
常见拼接符:
1
2
3
4
5
6
7
8
;
|
||
&
&&
`
$()
%0a
如果过滤空格,可以试:
1
2
3
4
${IFS}
$IFS$9
<
%09
常见考点:
1
2
3
4
5
命令拼接
过滤绕过
无回显命令执行
反弹 shell
DNS 外带
CTF 初级题一般不用反弹 shell,读 flag 就够了:
1
2
3
cat /flag
cat /flag*
find / -name “flag“ 2>/dev/null
6. PHP 特性类
CTF Web 里 PHP 特性非常高频,尤其是 ctfshow。
常见考点:
1
2
3
4
5
6
7
8
9
10
弱类型比较
变量覆盖
反序列化
伪协议
文件上传
preg_match 绕过
md5 绕过
intval 绕过
extract 变量覆盖
parse_str 变量覆盖
经典弱类型:
1
2
3
“0e12345” == “0e67890”
“admin” == 0
[] == false
md5 绕过:
1
2
md5($a) == md5($b)
md5($a) === md5($b)
前者可以用 0e 绕过,后者一般需要数组、碰撞或别的逻辑。
7. 反序列化类
看到这些东西要想到反序列化:
1
2
3
4
5
6
7
8
serialize
unserialize
O:4:”User”
__wakeup
__destruct
__toString
__call
__invoke
常见语言:
1
2
3
4
PHP 反序列化
Java 反序列化
Python pickle
Node.js serialize
PHP 反序列化最常见。
核心思路:
1
2
3
4
5
找可控对象
找魔术方法
找危险函数
构造 POP 链
触发反序列化
危险函数:
1
2
3
4
5
6
7
system
eval
assert
include
file_get_contents
file_put_contents
unlink
8. SSRF 类
看到输入 URL 的地方,要想到 SSRF。
常见功能:
1
2
3
4
5
6
在线截图
远程图片加载
URL 预览
Webhook
文件下载
检测网站状态
常见目标:
1
2
3
4
5
6
http://127.0.0.1
http://localhost
http://0.0.0.0
http://[::1]
http://172.17.0.1
http://169.254.169.254
常见绕过:
1
2
3
4
5
6
7
8
9
IP 十进制
八进制
十六进制
短地址
DNS rebinding
302 跳转
gopher 协议
dict 协议
file 协议
SSRF 在 CTF 里经常用来打:
1
2
3
4
5
内网服务
Redis
FastCGI
MySQL
云元数据
9. SSTI 模板注入类
看到页面会把输入的内容原样渲染,并且像模板一样处理,就要想到 SSTI。
常见框架:
1
2
3
4
Python Flask / Jinja2
PHP Twig
Java FreeMarker
Node.js EJS
测试:
1
2
3
4
{{77}}
${77}
<%= 77 %>
#{77}
如果页面返回:
1
49
说明可能存在模板注入。
10. XSS 类
XSS 在 CTF 里通常不是单纯弹窗,而是和 bot、cookie、后台管理员结合。
常见功能:
1
2
3
4
5
6
留言板
反馈
文章发布
个人资料
昵称
搜索回显
常见类型:
1
2
3
4
5
6
7
8
9
10
11
12
反射型 XSS
存储型 XSS
DOM 型 XSS
CSP 绕过
`
CTF 里常见目标:
偷管理员 Cookie
让 bot 访问恶意页面
读取后台 flag
### [](#11-Cookie-Session-JWT-类)11. Cookie / Session / JWT 类
看到登录、身份判断、Cookie 很奇怪,就要想到这一类。
常见考点:
1
2
3
4
5
6
7
Cookie 可伪造
Session 固定
JWT 弱密钥
JWT alg=none
JWT HS256/RS256 混淆
Base64 伪加密
权限字段可改
比如 Cookie:
1
2
role=user
is_admin=0
那就试:
1
2
role=admin
is_admin=1
JWT 看起来一般是三段:
1
xxxxx.yyyyy.zzzzz
可以 Base64 解码看 payload。
### [](#12-逻辑漏洞类)12. 逻辑漏洞类
这是最接近真实业务的一类。
常见场景:
1
2
3
4
5
6
7
8
登录绕过
越权访问
任意用户密码重置
验证码复用
支付金额篡改
订单状态篡改
文件任意下载
接口未鉴权
判断方式:
1
2
3
4
5
6
7
8
改 user_id
改 order_id
改 price
改 role
改 status
删 Cookie
换请求方法
重复提交
CTF 里有时题面很简单,但真正考的是业务逻辑。
## [](#三、拿到一道-Web-题后怎么找考点?)三、拿到一道 Web 题后怎么找考点?
可以固定按这个流程走。
### [](#第一步:看页面功能)第一步:看页面功能
页面让我们干什么?
1
2
3
4
5
6
7
登录 → 认证、SQL 注入、Cookie、弱密码、逻辑绕过
搜索 → SQL 注入、XSS、SSTI
上传 → 文件上传、文件包含、图片马、phar
输入 URL → SSRF
输入命令/IP → 命令执行
选择模板/语言/页面 → 文件包含
留言/反馈 → XSS、管理员 bot
### [](#第二步:看源码和请求)第二步:看源码和请求
浏览器右键查看源码,重点找:
1
2
<form action="..." method="post" enctype="multipart/form-data">
<input type="file" name="...">
要拿到:
1
2
3
4
5
上传接口
文件参数名
是否有 accept 限制
是否有隐藏参数
是否有 JS 校验
然后 Burp 抓包,看:
1
2
3
4
5
POST 到哪里?
文件字段叫什么?
返回什么?
是否返回路径?
是否有错误信息?
### [](#第三步:判断过滤点)第三步:判断过滤点
对于上传题,后端可能检查:
1
2
3
4
5
6
7
8
文件后缀
MIME 类型
文件头
文件内容
文件大小
文件名
图片尺寸
是否真的能被 getimagesize 识别
尽量每次只改一个变量。
比如:
1
2
3
4
5
6
7
先传正常 png
再传 php
再传 php + image/png
再传 GIF89a + php
再传 phtml
再传 .htaccess
再传 .user.ini
### [](#第四步:判断利用链)第四步:判断利用链
上传成功不代表结束,我们还要问:
1
2
3
4
5
6
上传文件在哪里?
能不能访问?
能不能执行?
如果不能执行,能不能被包含?
如果不能包含,能不能影响配置?
如果不能影响配置,能不能触发反序列化?
文件上传题的完整思路不是“传 shell”,而是:
1
上传点 → 绕过检测 → 找到路径 → 触发解析/包含 → 读 flag
## [](#四、看到页面就联想考点)四、看到页面就联想考点
页面特征
优先怀疑
登录框
SQL 注入、弱密码、Cookie、JWT、逻辑绕过
搜索框
SQL 注入、XSS、SSTI
上传框
文件上传、图片马、`.htaccess`、`.user.ini`、phar
URL 输入框
SSRF、任意文件读取
文件名参数
文件包含、路径穿越、任意下载
`?id=1`
SQL 注入、越权
`?file=xxx`
文件包含、伪协议
`?cmd=` / `?ip=`
命令执行
留言板
XSS、模板注入
Cookie 很明显
Cookie 伪造、JWT、session
页面报 PHP 错误
PHP 特性、源码泄露
页面提示 “where is the flag”
信息泄露、文件读取、RCE
