JWT安全漏洞与防护
字数 1423 2025-11-04 08:34:41

JWT安全漏洞与防护

描述
JWT(JSON Web Token)是一种用于身份验证与授权的开放标准(RFC 7519),由头部(Header)、载荷(Payload)和签名(Signature)三部分组成。其常见漏洞包括签名验证缺失、算法混淆、敏感信息泄露、密钥暴力破解等。攻击者可能利用这些漏洞伪造令牌、提升权限或窃取数据。

解题过程

  1. 理解JWT结构

    • 头部(Header):包含令牌类型(如"JWT")和签名算法(如HS256、RS256)。示例:
      {"alg":"HS256","typ":"JWT"}
      
    • 载荷(Payload):存储用户信息(如用户ID、角色)和标准声明(如过期时间)。示例:
      {"sub":"123","role":"admin","exp":1630000000}
      
    • 签名(Signature):对头部和载荷的Base64编码进行签名,确保令牌完整性。公式:
      签名 = HMACSHA256(Base64(头部) + "." + Base64(载荷), 密钥)
  2. 常见漏洞与攻击手法

    • 漏洞1:签名验证缺失

      • 问题:服务端未验证JWT签名,直接信任解码后的数据。
      • 攻击:修改载荷(如将"role":"user"改为"role":"admin")后重新组合令牌,绕过权限检查。
      • 示例:原令牌Header.Payload.Signature → 篡改为Header.ModifiedPayload.(任意字符串)
    • 漏洞2:算法混淆攻击(Algorithm Confusion)

      • 问题:服务端依赖JWT头部的alg参数选择验证算法,但未强制限制算法类型。
      • 攻击
        1. alg改为none(如果支持),删除签名部分(如Header.Payload.)。
        2. 将非对称算法(如RS256)改为对称算法(如HS256),并用公钥作为密钥伪造签名(因为服务端可能误用公钥验证HS256签名)。
      • 关键点:攻击者需获取服务端公钥(通常通过公开接口暴露)。
    • 漏洞3:敏感信息泄露

      • 问题:JWT载荷仅经过Base64编码(未加密),可被直接解码查看。
      • 攻击:通过Base64解码获取敏感信息(如密码、密钥ID等)。
      • 示例:在线工具解码载荷部分eyJzdWIiOiIxMjMifQ{"sub":"123"}
    • 漏洞4:弱密钥或密钥暴力破解

      • 问题:使用弱密钥(如"secret")或短密钥,易被暴力破解。
      • 攻击:用常见密钥列表(如John the Ripper工具)尝试签名验证。
  3. 防护措施

    • 强制签名验证:服务端必须验证签名,且拒绝无签名或无效签名的令牌。
    • 固定算法:代码中强制指定验证算法(如只允许RS256),忽略JWT头部的alg参数。
      # 错误示例:依赖客户端提交的alg  
      decoded = jwt.decode(token, key, algorithms=["HS256", "RS256"])  
      # 正确示例:固定算法  
      decoded = jwt.decode(token, key, algorithms=["RS256"])  
      
    • 避免敏感信息存储:载荷中仅存储必要信息(如用户ID),敏感数据存于服务端。
    • 使用强密钥:对称密钥(HS256)需足够长(≥256位);非对称算法(RS256)私钥严格保密。
    • 附加防护
      • 设置短过期时间(如15分钟)。
      • 使用黑名单机制吊销令牌。
      • 验证标准声明(如expiss)。
  4. 实战检测步骤

    • 步骤1:用Base64解码JWT头部和载荷,检查敏感信息。
    • 步骤2:修改载荷内容,发送请求观察是否被拒绝(验证签名)。
    • 步骤3:尝试将alg改为noneHS256,用公钥重签令牌。
    • 步骤4:工具扫描(如jwt_tool、Burp Suite插件JWT Editor)。

通过以上分析,可系统化识别和防御JWT相关漏洞,确保身份验证机制的安全性。

JWT安全漏洞与防护 描述 JWT(JSON Web Token)是一种用于身份验证与授权的开放标准(RFC 7519),由头部(Header)、载荷(Payload)和签名(Signature)三部分组成。其常见漏洞包括签名验证缺失、算法混淆、敏感信息泄露、密钥暴力破解等。攻击者可能利用这些漏洞伪造令牌、提升权限或窃取数据。 解题过程 理解JWT结构 头部(Header) :包含令牌类型(如"JWT")和签名算法(如HS256、RS256)。示例: 载荷(Payload) :存储用户信息(如用户ID、角色)和标准声明(如过期时间)。示例: 签名(Signature) :对头部和载荷的Base64编码进行签名,确保令牌完整性。公式: 签名 = HMACSHA256(Base64(头部) + "." + Base64(载荷), 密钥) 常见漏洞与攻击手法 漏洞1:签名验证缺失 问题 :服务端未验证JWT签名,直接信任解码后的数据。 攻击 :修改载荷(如将 "role":"user" 改为 "role":"admin" )后重新组合令牌,绕过权限检查。 示例 :原令牌 Header.Payload.Signature → 篡改为 Header.ModifiedPayload.(任意字符串) 。 漏洞2:算法混淆攻击(Algorithm Confusion) 问题 :服务端依赖JWT头部的 alg 参数选择验证算法,但未强制限制算法类型。 攻击 : 将 alg 改为 none (如果支持),删除签名部分(如 Header.Payload. )。 将非对称算法(如RS256)改为对称算法(如HS256),并用公钥作为密钥伪造签名(因为服务端可能误用公钥验证HS256签名)。 关键点 :攻击者需获取服务端公钥(通常通过公开接口暴露)。 漏洞3:敏感信息泄露 问题 :JWT载荷仅经过Base64编码(未加密),可被直接解码查看。 攻击 :通过Base64解码获取敏感信息(如密码、密钥ID等)。 示例 :在线工具解码载荷部分 eyJzdWIiOiIxMjMifQ → {"sub":"123"} 。 漏洞4:弱密钥或密钥暴力破解 问题 :使用弱密钥(如"secret")或短密钥,易被暴力破解。 攻击 :用常见密钥列表(如John the Ripper工具)尝试签名验证。 防护措施 强制签名验证 :服务端必须验证签名,且拒绝无签名或无效签名的令牌。 固定算法 :代码中强制指定验证算法(如只允许RS256),忽略JWT头部的 alg 参数。 避免敏感信息存储 :载荷中仅存储必要信息(如用户ID),敏感数据存于服务端。 使用强密钥 :对称密钥(HS256)需足够长(≥256位);非对称算法(RS256)私钥严格保密。 附加防护 : 设置短过期时间(如15分钟)。 使用黑名单机制吊销令牌。 验证标准声明(如 exp 、 iss )。 实战检测步骤 步骤1 :用Base64解码JWT头部和载荷,检查敏感信息。 步骤2 :修改载荷内容,发送请求观察是否被拒绝(验证签名)。 步骤3 :尝试将 alg 改为 none 或 HS256 ,用公钥重签令牌。 步骤4 :工具扫描(如jwt_ tool、Burp Suite插件JWT Editor)。 通过以上分析,可系统化识别和防御JWT相关漏洞,确保身份验证机制的安全性。