高级漏洞篇之JWT攻击专题
字数 1690 2025-08-10 16:34:36
JWT攻击专题深入解析
1. JWT基础概念
1.1 什么是JWT?
JSON Web Token (JWT)是一种标准化格式,用于在系统之间发送加密签名的JSON数据。它通常用于发送用户信息("声明"),作为身份验证、会话处理和访问控制机制的一部分。
1.2 JWT结构
JWT由三部分组成,用点号(.)分隔:
- 头(Header)
- 有效载荷(Payload)
- 签名(Signature)
示例格式:header.payload.signature
1.3 JWT组成部分详解
头部(Header):
- Base64Url编码的JSON对象
- 包含token元数据
- 关键参数:
alg(算法)、typ(类型)
有效载荷(Payload):
- Base64Url编码的JSON对象
- 包含用户声明(claims)
- 常见声明:
sub(用户ID)、name、iat(签发时间)、exp(过期时间)
签名(Signature):
- 对头部和有效载荷的哈希值
- 使用服务器私钥生成
- 用于验证token完整性
2. JWT安全漏洞类型
2.1 签名验证缺陷
2.1.1 完全未验证签名
- 开发错误:使用
decode()而非verify() - 攻击方法:直接修改payload部分
利用步骤:
- 捕获合法JWT
- 解码并修改payload
- 发送修改后的JWT
2.1.2 接受无签名token
- 设置
alg为none - 服务器可能过滤不严格
利用步骤:
- 修改头部
alg为none - 删除签名部分(保留末尾点号)
- 修改payload
- 发送修改后的JWT
2.2 弱密钥攻击
2.2.1 密钥爆破
- 使用常见密钥字典
- 使用工具如hashcat
hashcat爆破命令:
hashcat -a 0 -m 16500 <jwt> <wordlist>
利用步骤:
- 捕获合法JWT
- 使用字典爆破密钥
- 使用获取的密钥生成新签名
- 发送伪造的JWT
2.2.2 密钥硬编码
- 开发使用默认/示例密钥
- 密钥强度不足
2.3 头部参数注入
2.3.1 算法混淆攻击
- 修改
alg为HS256(对称算法) - 使用公钥作为密钥
2.3.2 其他头部参数注入
jku:指定验证密钥URLjwk:直接嵌入验证密钥kid:密钥ID注入
3. 攻击工具与技术
3.1 Burp Suite插件
- JWT Editor:编辑、签名JWT
- JWT4B:解码、修改JWT
3.2 手动修改技术
- 使用Base64Url解码/编码
- 直接修改JSON内容
- 重新生成签名(如有密钥)
3.3 自动化工具
- hashcat:爆破JWT密钥
- jwt_tool:JWT测试工具
4. 防御措施
4.1 签名验证
- 始终验证签名
- 使用
verify()而非decode()
4.2 密钥管理
- 使用强密钥
- 避免硬编码密钥
- 定期轮换密钥
4.3 算法限制
- 明确指定允许的算法
- 拒绝
none算法 - 避免算法混淆
4.4 其他防御
- 验证所有声明(如
exp,iss) - 使用HTTPS传输
- 限制JWT有效期
5. 实战案例
5.1 未验证签名绕过
- 捕获请求获取JWT
- 解码修改payload(如用户角色)
- 发送修改后的JWT
- 访问特权功能
5.2 弱密钥攻击
- 收集目标JWT
- 使用hashcat爆破密钥
- 使用JWT Editor生成新token
- 发送伪造的token
5.3 算法混淆攻击
- 获取服务器公钥
- 修改
alg为HS256 - 使用公钥作为密钥签名
- 发送伪造token
6. 补充知识
6.1 JWT vs JWS vs JWE
- JWT:基本规范
- JWS:签名实现
- JWE:加密实现
6.2 常见签名算法
- HS256:HMAC+SHA256(对称)
- RS256:RSA+SHA256(非对称)
- ES256:ECDSA+SHA256
6.3 声明类型
- 注册声明:预定义如
iss,exp - 公共声明:通用如
name,email - 私有声明:自定义声明
通过深入理解这些攻击技术和防御措施,安全人员可以更好地评估和加固使用JWT的应用程序安全性。