← 返回主页
NOTE

JWT Token 漏洞

整理 JWT 结构、签名校验问题、常见风险与防御建议。

1. 敏感信息泄露

JSON Web Token(JWT)由三部分组成:Header(头部)、Payload(载荷)和 Signature(签名)。其中,Header 和 Payload 仅使用 Base64Url 编码,并未加密。因此,若将敏感信息(如密码、密钥、个人身份信息等)直接存放在 Token 中,可能导致信息泄露。

建议:避免在 Token 中存储任何敏感信息。必要时可对 Payload 进行加密处理,或仅使用 Token 作为索引,将敏感数据存储在服务端。


2. 无签名漏洞(None Algorithm)

某些 JWT 实现支持将签名算法设置为 none,即不进行签名验证。攻击者可通过修改 Token 头部中的 alg 字段为 none,并随意篡改 Payload 内容,构造一个“合法”的 Token 绕过验证。

防护措施:服务端应明确禁用 none 算法,并对所有接收到的 Token 进行严格的签名验证。


3. 弱密钥爆破

若 JWT 使用的密钥强度不足(如常用词、短密钥等),攻击者可能通过暴力破解或字典攻击方式猜解密钥,进而伪造有效 Token。

常用工具
可使用 c-jwt-cracker 进行密钥爆破尝试:

git clone https://github.com/brendan-rius/c-jwt-cracker.git
cd c-jwt-cracker
make
./jwtcracker <token>

建议:使用足够长度和复杂度的密钥,并定期更换。推荐使用系统生成的随机字符串作为密钥。


4. 算法混淆攻击(Algorithm Confusion)

该漏洞源于验证方盲目信任 Token 头部中指定的算法。典型攻击流程如下:

  1. 攻击者获取一个使用 RS256(非对称加密)签名的 Token;
  2. 将头部中的 alg 改为 HS256(对称加密);
  3. 篡改 Payload 后,使用目标的公钥(作为 HMAC 的密钥)生成签名;
  4. 服务端收到 Token 后,使用公钥作为密钥验证签名,由于签名本身由公钥生成,验证通过。

注意:复现时需将公钥保存为文件后再用于签名,直接复制字符串可能导致格式错误。

防护措施:在验证 Token 时,应强制指定预期使用的算法,而非依赖 Token 头部中的 alg 字段。


5. 其他常见问题与建议

漏洞类型防护建议
Token 泄露使用 HTTPS、设置较短的有效期、启用 Token 黑名单
密钥管理不当密钥隔离存储、定期更换、避免硬编码
未验证签名在所有接收 Token 的地方进行签名验证
Payload 解析错误使用标准库解析、避免手动解码 Base64

总结

JWT 作为一种广泛使用的身份验证机制,其安全性高度依赖于实现方式。开发人员应遵循最佳实践,避免常见漏洞,并使用可靠的库进行处理。定期进行安全审计和渗透测试也是保障系统安全的有效手段。