JWT安全漏洞与防护(进阶篇)
字数 1118 2025-11-06 22:53:22
JWT安全漏洞与防护(进阶篇)
1. 知识点描述
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519),由头部(Header)、载荷(Payload)和签名(Signature)三部分组成。虽然JWT被广泛使用,但若实现不当会导致严重的安全漏洞,如签名绕过、密钥混淆、算法篡改等。进阶篇将深入探讨JWT的常见漏洞场景及防护措施。
2. 漏洞原理与攻击场景
2.1 算法混淆攻击(Algorithm Confusion)
- 原理:JWT头部包含
alg字段,用于指定签名算法(如HS256、RS256)。若服务端代码依赖客户端传入的alg值验证签名,攻击者可能将非对称算法(RS256)改为对称算法(HS256),从而用公钥伪造签名。 - 攻击步骤:
- 获取服务的公钥(通常可公开访问)。
- 修改JWT头部为
{"alg":"HS256","typ":"JWT"},载荷为恶意内容(如提升权限)。 - 用公钥作为HS256的密钥,生成签名。
- 服务端误用公钥进行HS256验证,导致签名被绕过。
2.2 密钥泄露与弱密钥
- 弱密钥(如"secret"、"password")易被爆破,或密钥硬编码在代码中导致泄露。
- 工具(如
jwt_tool)可自动化测试常见密钥。
2.3 未验证签名
- 开发人员可能直接解码JWT而未验证签名,导致载荷被任意篡改。
3. 防护措施
3.1 强制指定算法
- 代码中固定验证时使用的算法,忽略客户端传入的
alg值。# 错误示例:依赖客户端alg decoded = jwt.decode(token, key, algorithms=["HS256", "RS256"]) # 正确示例:固定算法 decoded = jwt.decode(token, key, algorithms=["RS256"]) # 仅接受非对称算法
3.2 密钥管理
- 对称算法(HS256)需使用强随机密钥,并定期更换。
- 非对称算法(RS256)确保私钥严格保密,公钥仅用于验证。
3.3 校验完整性与有效期
- 验证签名后,检查载荷中的
exp(过期时间)、iss(签发者)等字段。 - 示例:
decoded = jwt.decode( token, key, algorithms=["RS256"], options={"verify_exp": True, "verify_iss": True} )
3.4 避免敏感信息泄露
- JWT载荷默认仅Base64编码,未加密。敏感数据(如密码)不应存入载荷。
4. 实战检测流程
- 收集JWT:通过登录功能获取示例Token。
- 解码分析:使用jwt.io解码头部和载荷,观察算法、参数是否可篡改。
- 测试签名绕过:
- 修改
alg为none(需服务端支持)。 - 尝试算法混淆(RS256→HS256)。
- 爆破弱密钥(常用工具:
hashcat、jwt_tool)。
- 修改
- 验证服务端逻辑:篡改
exp或用户ID,检查是否影响权限。
5. 总结
JWT安全依赖严格的算法验证、密钥管理和参数校验。开发中应:
- 禁用
alg=none; - 固定验证算法;
- 定期轮换密钥;
- 结合日志监控异常Token使用。
通过以上措施,可显著降低JWT实现中的风险。