攻击JWT的一些方法
字数 1569 2025-08-25 22:58:40
JWT安全攻防指南
JWT基础概念
JWT(Json Web Token)是一种遵循JSON格式的令牌,用于将用户信息加密到token中。它由三部分组成:
-
Header(头部)
- 包含
alg(算法)和typ(类型)字段 - 常用算法:HMAC和RSA
- 示例:
{"alg": "HS256", "typ": "JWT"}
- 包含
-
Payload(载荷)
- 包含用户数据和元数据声明
- 示例:
{"user_name": "admin"}
-
Signature(签名)
- 保护token完整性
- 生成公式:
signature = HMAC-SHA256(base64urlEncode(header) + "." + base64urlEncode(payload), secret_key) - 使用base64url编码(修改版Base64,无"="填充,"+"→"-","/"→"_")
完整token格式:header.payload.signature
JWT攻击方法
1. 空加密算法攻击
原理:
- JWT支持
alg: None空加密算法 - 服务器可能错误配置允许空算法
攻击步骤:
- 修改header中的
alg为None - 移除signature部分
- 构造payload中的用户身份信息
示例token:
ew0KCSJhbGciIDogIk5vbmUiLA0KCSJ0eXAiIDogImp3dCINCn0.ew0KCSJ1c2VyIiA6ICJBZG1pbiINCn0
防御:
- 服务器端严格验证算法类型
- 禁止使用
None算法
2. RSA转HMAC算法攻击
原理:
- 当系统使用RSA算法时,攻击者可尝试改为HMAC
- 使用RSA公钥作为HMAC密钥伪造签名
攻击步骤:
- 获取系统RSA公钥
- 修改header中的
alg为HS256 - 使用RSA公钥作为HMAC密钥生成签名
- 发送伪造的token
防御:
- 严格校验算法类型与预期一致
- 不同算法使用不同密钥
3. 密钥爆破攻击
前提条件:
- 已知JWT使用的加密算法
- 有一段有效的已签名token
- 密钥复杂度不高(弱密钥)
工具:
- c-jwt-cracker
示例爆破命令:
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
防御:
- 使用足够复杂的长密钥
- 定期更换密钥
4. KID参数攻击
KID(Key ID)是header中的可选参数,用于指定加密算法的密钥。
4.1 任意文件读取
原理:
- KID参数未过滤用户输入
- 系统可能读取任意文件作为密钥
攻击方式:
{
"alg": "HS256",
"typ": "JWT",
"kid": "/path/to/secret/file"
}
4.2 SQL注入
原理:
- KID参数用于从数据库提取密钥
- 未过滤导致SQL注入
攻击方式:
{
"alg": "HS256",
"typ": "JWT",
"kid": "key123' UNION SELECT 'attacker_controlled_key'--"
}
4.3 命令注入
原理:
- 使用Ruby的
open函数或PHP的exec/system读取密钥 - 未过滤导致命令注入
攻击方式:
{
"alg": "HS256",
"typ": "JWT",
"kid": "/path/to/key|whoami"
}
防御:
- 严格过滤KID参数
- 限制密钥文件路径
- 使用白名单验证
5. JKU/X5U参数攻击
原理:
JKU(JSON Web Key Set URL):指定验证密钥的URLX5U:指定验证证书的URL- 未过滤时攻击者可指定恶意密钥/证书
攻击方式:
{
"alg": "HS256",
"typ": "JWT",
"jku": "https://attacker.com/malicious_keys.json"
}
防御:
- 禁用或严格验证JKU/X5U参数
- 使用固定密钥集
6. 信息泄露
原理:
- JWT保证完整性而非机密性
- Payload仅base64url编码,相当于明文传输
攻击方式:
- 直接解码payload部分获取敏感信息
防御:
- 不在JWT中存储敏感信息
- 必要时加密payload
防御建议
-
算法验证:
- 严格验证
alg参数与预期一致 - 禁用
None算法
- 严格验证
-
输入过滤:
- 严格过滤KID、JKU、X5U等参数
- 使用白名单机制
-
密钥管理:
- 使用足够强度的密钥
- 定期更换密钥
- 不同算法使用不同密钥
-
敏感信息:
- 不在JWT中存储敏感数据
- 必要时加密payload
-
安全配置:
- 关闭调试功能
- 限制密钥文件访问权限
通过全面了解JWT的安全机制和潜在攻击面,开发人员可以更好地设计和实现安全的JWT认证系统。