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),从而用公钥伪造签名。
  • 攻击步骤
    1. 获取服务的公钥(通常可公开访问)。
    2. 修改JWT头部为{"alg":"HS256","typ":"JWT"},载荷为恶意内容(如提升权限)。
    3. 用公钥作为HS256的密钥,生成签名。
    4. 服务端误用公钥进行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. 实战检测流程

  1. 收集JWT:通过登录功能获取示例Token。
  2. 解码分析:使用jwt.io解码头部和载荷,观察算法、参数是否可篡改。
  3. 测试签名绕过
    • 修改algnone(需服务端支持)。
    • 尝试算法混淆(RS256→HS256)。
    • 爆破弱密钥(常用工具:hashcatjwt_tool)。
  4. 验证服务端逻辑:篡改exp或用户ID,检查是否影响权限。

5. 总结
JWT安全依赖严格的算法验证、密钥管理和参数校验。开发中应:

  • 禁用alg=none
  • 固定验证算法;
  • 定期轮换密钥;
  • 结合日志监控异常Token使用。

通过以上措施,可显著降低JWT实现中的风险。

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 值。 3.2 密钥管理 对称算法(HS256)需使用强随机密钥,并定期更换。 非对称算法(RS256)确保私钥严格保密,公钥仅用于验证。 3.3 校验完整性与有效期 验证签名后,检查载荷中的 exp (过期时间)、 iss (签发者)等字段。 示例: 3.4 避免敏感信息泄露 JWT载荷默认仅Base64编码,未加密。敏感数据(如密码)不应存入载荷。 4. 实战检测流程 收集JWT :通过登录功能获取示例Token。 解码分析 :使用 jwt.io 解码头部和载荷,观察算法、参数是否可篡改。 测试签名绕过 : 修改 alg 为 none (需服务端支持)。 尝试算法混淆(RS256→HS256)。 爆破弱密钥(常用工具: hashcat 、 jwt_tool )。 验证服务端逻辑 :篡改 exp 或用户ID,检查是否影响权限。 5. 总结 JWT安全依赖严格的算法验证、密钥管理和参数校验。开发中应: 禁用 alg=none ; 固定验证算法; 定期轮换密钥; 结合日志监控异常Token使用。 通过以上措施,可显著降低JWT实现中的风险。