JWT可爆破——未验证签名导致越权&加密为None导致不验证签名越权漏洞
字数 1357 2025-09-23 19:27:46

JWT安全漏洞分析与利用教学文档

0x01 JWT基础概念

JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在各方之间安全地传输信息作为JSON对象。JWT通常由三部分组成:

  1. Header - 包含令牌类型和签名算法
  2. Payload - 包含声明(claims)
  3. Signature - 用于验证消息在传输过程中未被篡改

典型JWT格式:header.payload.signature

0x02 JWT常见安全漏洞

1. 可爆破密钥漏洞

漏洞原理

  • 当JWT使用弱密钥或可预测密钥时,攻击者可以通过暴力破解获取签名密钥
  • 一旦获取密钥,攻击者可伪造任意令牌

利用条件

  • JWT使用对称加密算法(如HS256)
  • 服务器未对密钥强度做限制
  • 服务器未实施爆破防护机制

利用工具

  • hashcat
  • jwt_tool
  • 自定义爆破脚本

爆破步骤

  1. 捕获有效JWT令牌
  2. 使用字典攻击尝试破解密钥
  3. 使用破解出的密钥生成新令牌

2. 未验证签名漏洞

漏洞原理

  • 服务器端未正确验证JWT签名
  • 攻击者可修改payload后直接提交,无需有效签名

利用方法

  1. 捕获有效JWT
  2. 修改payload中的权限相关字段(如user→admin)
  3. 直接提交修改后的JWT

3. "None"算法漏洞

漏洞原理

  • JWT规范允许使用"none"算法,表示不签名
  • 如果服务器配置不当,可能接受"none"算法的令牌
  • 攻击者可移除签名部分或将算法改为"none"绕过验证

利用步骤

  1. 修改header中的alg字段为"none"
  2. 删除签名部分(保留最后的点)
  3. 修改payload中的权限信息
  4. 提交修改后的令牌

0x03 实战案例分析

案例1:小程序JWT密钥爆破

  1. 信息收集

    • 使用Burp Suite抓取小程序流量
    • 识别包含JWT的数据包(通常Authorization头中)
    • 使用HAE等插件高亮敏感信息
  2. 分析JWT结构

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    
  3. 爆破尝试

    hashcat -a 0 -m 16500 jwt.txt rockyou.txt
    

    或使用jwt_tool:

    python3 jwt_tool.py <JWT> -C -d wordlist.txt
    

案例2:未验证签名越权

  1. 原始JWT payload:

    {
      "user": "test",
      "role": "user"
    }
    
  2. 修改payload:

    {
      "user": "test",
      "role": "admin"
    }
    
  3. 直接提交修改后的JWT,观察是否可提权

案例3:"None"算法绕过

  1. 原始JWT:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    
  2. 修改为:

    eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
    

    (注意最后的点保留)

0x04 防御措施

  1. 密钥管理

    • 使用强密钥(长度≥256位)
    • 定期轮换密钥
    • 不同服务使用不同密钥
  2. 签名验证

    • 严格验证所有JWT签名
    • 拒绝"none"算法
    • 验证header中的alg字段与预期算法一致
  3. 其他防护

    • 实施速率限制防止爆破
    • 使用非对称加密算法(如RS256)
    • 设置合理的令牌有效期
    • 对敏感操作实施二次验证

0x05 检测工具

  1. jwt_tool

    • JWT漏洞综合测试工具
    • 支持多种攻击方式
  2. Burp Suite插件

    • JSON Web Tokens插件
    • Autorize插件检测越权
  3. 在线检测

    • https://jwt.io/
    • https://token.dev/

0x06 总结

JWT安全漏洞主要源于实现不当而非协议本身缺陷。开发人员应:

  • 严格验证签名
  • 使用强密码学算法
  • 避免接受"none"算法
  • 对密钥实施严格管理

安全测试人员应重点关注:

  • JWT算法类型
  • 签名验证逻辑
  • 密钥强度
  • 权限提升可能性
JWT安全漏洞分析与利用教学文档 0x01 JWT基础概念 JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在各方之间安全地传输信息作为JSON对象。JWT通常由三部分组成: Header - 包含令牌类型和签名算法 Payload - 包含声明(claims) Signature - 用于验证消息在传输过程中未被篡改 典型JWT格式: header.payload.signature 0x02 JWT常见安全漏洞 1. 可爆破密钥漏洞 漏洞原理 : 当JWT使用弱密钥或可预测密钥时,攻击者可以通过暴力破解获取签名密钥 一旦获取密钥,攻击者可伪造任意令牌 利用条件 : JWT使用对称加密算法(如HS256) 服务器未对密钥强度做限制 服务器未实施爆破防护机制 利用工具 : hashcat jwt_tool 自定义爆破脚本 爆破步骤 : 捕获有效JWT令牌 使用字典攻击尝试破解密钥 使用破解出的密钥生成新令牌 2. 未验证签名漏洞 漏洞原理 : 服务器端未正确验证JWT签名 攻击者可修改payload后直接提交,无需有效签名 利用方法 : 捕获有效JWT 修改payload中的权限相关字段(如user→admin) 直接提交修改后的JWT 3. "None"算法漏洞 漏洞原理 : JWT规范允许使用"none"算法,表示不签名 如果服务器配置不当,可能接受"none"算法的令牌 攻击者可移除签名部分或将算法改为"none"绕过验证 利用步骤 : 修改header中的alg字段为"none" 删除签名部分(保留最后的点) 修改payload中的权限信息 提交修改后的令牌 0x03 实战案例分析 案例1:小程序JWT密钥爆破 信息收集 : 使用Burp Suite抓取小程序流量 识别包含JWT的数据包(通常Authorization头中) 使用HAE等插件高亮敏感信息 分析JWT结构 : 爆破尝试 : 或使用jwt_ tool: 案例2:未验证签名越权 原始JWT payload: 修改payload: 直接提交修改后的JWT,观察是否可提权 案例3:"None"算法绕过 原始JWT: 修改为: (注意最后的点保留) 0x04 防御措施 密钥管理 : 使用强密钥(长度≥256位) 定期轮换密钥 不同服务使用不同密钥 签名验证 : 严格验证所有JWT签名 拒绝"none"算法 验证header中的alg字段与预期算法一致 其他防护 : 实施速率限制防止爆破 使用非对称加密算法(如RS256) 设置合理的令牌有效期 对敏感操作实施二次验证 0x05 检测工具 jwt_ tool : JWT漏洞综合测试工具 支持多种攻击方式 Burp Suite插件 : JSON Web Tokens插件 Autorize插件检测越权 在线检测 : https://jwt.io/ https://token.dev/ 0x06 总结 JWT安全漏洞主要源于实现不当而非协议本身缺陷。开发人员应: 严格验证签名 使用强密码学算法 避免接受"none"算法 对密钥实施严格管理 安全测试人员应重点关注: JWT算法类型 签名验证逻辑 密钥强度 权限提升可能性