一文学习JWT造成的各种安全漏洞利用手法
字数 1635 2025-08-29 08:30:24
JWT安全漏洞利用手法全面解析
1. JWT基础概念回顾
JSON Web Token (JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。JWT由三部分组成:
- Header(头部)
- Payload(负载)
- Signature(签名)
格式为:header.payload.signature
2. JWT常见安全漏洞及利用手法
2.1 未验证签名漏洞
漏洞原理:
JWT库通常提供两种方法:
verify():验证令牌的签名decode():仅解码令牌而不验证签名
当开发者混淆这两个方法,只使用decode()时,应用程序不会验证JWT的签名。
利用步骤:
- 获取普通用户的JWT令牌
- 解码JWT,修改payload中的身份信息(如将
username改为administrator) - 直接使用修改后的JWT访问特权功能
防御措施:
- 始终使用
verify()方法而非decode() - 确保签名验证逻辑正确实现
2.2 接受无签名令牌漏洞
漏洞原理:
JWT规范允许alg参数设置为none,表示无签名。如果服务器配置为接受无签名JWT,攻击者可伪造任意令牌。
利用步骤:
- 获取普通用户的JWT令牌
- 修改header中的
alg为none - 移除signature部分(保留最后的点)
- 修改payload中的身份信息
- 使用伪造的令牌访问特权功能
防御措施:
- 明确拒绝
alg=none的JWT - 使用白名单限制允许的算法
2.3 弱密钥爆破漏洞
漏洞原理:
类似弱密码问题,如果JWT使用的密钥强度不足,可能被暴力破解。
利用工具:
- jwt_tool (https://github.com/ticarpi/jwt_tool)
爆破过程:
- 收集目标JWT样本
- 使用常见密码字典进行爆破
- 成功获取密钥后可伪造任意令牌
防御措施:
- 使用足够强度的密钥(至少256位)
- 定期更换密钥
- 避免使用常见或默认密钥
2.4 算法混淆攻击
2.4.1 算法混淆基础
加密算法区别:
- HS256 (HMAC with SHA-256):
- 对称加密算法
- 使用同一个密钥进行签名和验证
- RS256 (RSA Signature with SHA-256):
- 非对称加密算法
- 使用私钥签名,公钥验证
漏洞原理:
后端通过JWT的alg头部决定验证方式,但如果错误地使用固定公钥验证所有类型JWT(包括HS256),会导致安全漏洞。
2.4.2 公钥泄露的算法混淆攻击
利用步骤:
-
获取公钥:
- 检查常见端点:
/jwks.json或/.well-known/jwks.json - 公钥通常以JWK(JSON Web Key)格式存储
- 检查常见端点:
-
生成签名:
- 将
alg改为HS256 - 使用获取的公钥作为HS256的对称密钥
- 生成新的JWT签名
- 将
-
伪造令牌:
- 修改payload中的身份信息
- 使用新生成的签名
-
特权访问:
- 使用伪造的JWT访问特权功能
2.4.3 无公钥泄露的算法混淆攻击
利用步骤:
- 获取两个不同时间生成的JWT
- 使用工具分析可能的密钥
- 尝试将
alg改为HS256并使用推测的密钥 - 伪造特权令牌
防御措施:
- 明确指定接受的算法(白名单)
- 不要使用公钥验证HS256令牌
- 不同算法使用不同的验证逻辑
3. 综合防御策略
-
签名验证:
- 始终验证JWT签名
- 使用正确的验证方法(如
verify())
-
算法管理:
- 明确指定接受的算法
- 拒绝
alg=none - 不同算法使用独立的验证逻辑
-
密钥安全:
- 使用足够强度的密钥
- 保护私钥和对称密钥
- 定期更换密钥
-
敏感操作保护:
- 对特权操作实施额外验证
- 记录JWT使用情况
-
库和配置安全:
- 使用最新版本的JWT库
- 定期审计配置
通过全面了解这些漏洞和防御措施,开发人员可以更安全地实现JWT认证机制,有效防止各类攻击。