一文学习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的签名。

利用步骤

  1. 获取普通用户的JWT令牌
  2. 解码JWT,修改payload中的身份信息(如将username改为administrator
  3. 直接使用修改后的JWT访问特权功能

防御措施

  • 始终使用verify()方法而非decode()
  • 确保签名验证逻辑正确实现

2.2 接受无签名令牌漏洞

漏洞原理
JWT规范允许alg参数设置为none,表示无签名。如果服务器配置为接受无签名JWT,攻击者可伪造任意令牌。

利用步骤

  1. 获取普通用户的JWT令牌
  2. 修改header中的algnone
  3. 移除signature部分(保留最后的点)
  4. 修改payload中的身份信息
  5. 使用伪造的令牌访问特权功能

防御措施

  • 明确拒绝alg=none的JWT
  • 使用白名单限制允许的算法

2.3 弱密钥爆破漏洞

漏洞原理
类似弱密码问题,如果JWT使用的密钥强度不足,可能被暴力破解。

利用工具

  • jwt_tool (https://github.com/ticarpi/jwt_tool)

爆破过程

  1. 收集目标JWT样本
  2. 使用常见密码字典进行爆破
  3. 成功获取密钥后可伪造任意令牌

防御措施

  • 使用足够强度的密钥(至少256位)
  • 定期更换密钥
  • 避免使用常见或默认密钥

2.4 算法混淆攻击

2.4.1 算法混淆基础

加密算法区别

  • HS256 (HMAC with SHA-256):
    • 对称加密算法
    • 使用同一个密钥进行签名和验证
  • RS256 (RSA Signature with SHA-256):
    • 非对称加密算法
    • 使用私钥签名,公钥验证

漏洞原理
后端通过JWT的alg头部决定验证方式,但如果错误地使用固定公钥验证所有类型JWT(包括HS256),会导致安全漏洞。

2.4.2 公钥泄露的算法混淆攻击

利用步骤

  1. 获取公钥

    • 检查常见端点:/jwks.json/.well-known/jwks.json
    • 公钥通常以JWK(JSON Web Key)格式存储
  2. 生成签名

    • alg改为HS256
    • 使用获取的公钥作为HS256的对称密钥
    • 生成新的JWT签名
  3. 伪造令牌

    • 修改payload中的身份信息
    • 使用新生成的签名
  4. 特权访问

    • 使用伪造的JWT访问特权功能

2.4.3 无公钥泄露的算法混淆攻击

利用步骤

  1. 获取两个不同时间生成的JWT
  2. 使用工具分析可能的密钥
  3. 尝试将alg改为HS256并使用推测的密钥
  4. 伪造特权令牌

防御措施

  • 明确指定接受的算法(白名单)
  • 不要使用公钥验证HS256令牌
  • 不同算法使用不同的验证逻辑

3. 综合防御策略

  1. 签名验证

    • 始终验证JWT签名
    • 使用正确的验证方法(如verify()
  2. 算法管理

    • 明确指定接受的算法
    • 拒绝alg=none
    • 不同算法使用独立的验证逻辑
  3. 密钥安全

    • 使用足够强度的密钥
    • 保护私钥和对称密钥
    • 定期更换密钥
  4. 敏感操作保护

    • 对特权操作实施额外验证
    • 记录JWT使用情况
  5. 库和配置安全

    • 使用最新版本的JWT库
    • 定期审计配置

通过全面了解这些漏洞和防御措施,开发人员可以更安全地实现JWT认证机制,有效防止各类攻击。

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认证机制,有效防止各类攻击。