高级漏洞篇之JWT攻击专题
字数 1690 2025-08-10 16:34:36

JWT攻击专题深入解析

1. JWT基础概念

1.1 什么是JWT?

JSON Web Token (JWT)是一种标准化格式,用于在系统之间发送加密签名的JSON数据。它通常用于发送用户信息("声明"),作为身份验证、会话处理和访问控制机制的一部分。

1.2 JWT结构

JWT由三部分组成,用点号(.)分隔:

  • 头(Header)
  • 有效载荷(Payload)
  • 签名(Signature)

示例格式:header.payload.signature

1.3 JWT组成部分详解

头部(Header)

  • Base64Url编码的JSON对象
  • 包含token元数据
  • 关键参数:alg(算法)、typ(类型)

有效载荷(Payload)

  • Base64Url编码的JSON对象
  • 包含用户声明(claims)
  • 常见声明:sub(用户ID)、nameiat(签发时间)、exp(过期时间)

签名(Signature)

  • 对头部和有效载荷的哈希值
  • 使用服务器私钥生成
  • 用于验证token完整性

2. JWT安全漏洞类型

2.1 签名验证缺陷

2.1.1 完全未验证签名

  • 开发错误:使用decode()而非verify()
  • 攻击方法:直接修改payload部分

利用步骤

  1. 捕获合法JWT
  2. 解码并修改payload
  3. 发送修改后的JWT

2.1.2 接受无签名token

  • 设置algnone
  • 服务器可能过滤不严格

利用步骤

  1. 修改头部algnone
  2. 删除签名部分(保留末尾点号)
  3. 修改payload
  4. 发送修改后的JWT

2.2 弱密钥攻击

2.2.1 密钥爆破

  • 使用常见密钥字典
  • 使用工具如hashcat

hashcat爆破命令

hashcat -a 0 -m 16500 <jwt> <wordlist>

利用步骤

  1. 捕获合法JWT
  2. 使用字典爆破密钥
  3. 使用获取的密钥生成新签名
  4. 发送伪造的JWT

2.2.2 密钥硬编码

  • 开发使用默认/示例密钥
  • 密钥强度不足

2.3 头部参数注入

2.3.1 算法混淆攻击

  • 修改algHS256(对称算法)
  • 使用公钥作为密钥

2.3.2 其他头部参数注入

  • jku:指定验证密钥URL
  • jwk:直接嵌入验证密钥
  • kid:密钥ID注入

3. 攻击工具与技术

3.1 Burp Suite插件

  • JWT Editor:编辑、签名JWT
  • JWT4B:解码、修改JWT

3.2 手动修改技术

  1. 使用Base64Url解码/编码
  2. 直接修改JSON内容
  3. 重新生成签名(如有密钥)

3.3 自动化工具

  • hashcat:爆破JWT密钥
  • jwt_tool:JWT测试工具

4. 防御措施

4.1 签名验证

  • 始终验证签名
  • 使用verify()而非decode()

4.2 密钥管理

  • 使用强密钥
  • 避免硬编码密钥
  • 定期轮换密钥

4.3 算法限制

  • 明确指定允许的算法
  • 拒绝none算法
  • 避免算法混淆

4.4 其他防御

  • 验证所有声明(如exp, iss)
  • 使用HTTPS传输
  • 限制JWT有效期

5. 实战案例

5.1 未验证签名绕过

  1. 捕获请求获取JWT
  2. 解码修改payload(如用户角色)
  3. 发送修改后的JWT
  4. 访问特权功能

5.2 弱密钥攻击

  1. 收集目标JWT
  2. 使用hashcat爆破密钥
  3. 使用JWT Editor生成新token
  4. 发送伪造的token

5.3 算法混淆攻击

  1. 获取服务器公钥
  2. 修改alg为HS256
  3. 使用公钥作为密钥签名
  4. 发送伪造token

6. 补充知识

6.1 JWT vs JWS vs JWE

  • JWT:基本规范
  • JWS:签名实现
  • JWE:加密实现

6.2 常见签名算法

  • HS256:HMAC+SHA256(对称)
  • RS256:RSA+SHA256(非对称)
  • ES256:ECDSA+SHA256

6.3 声明类型

  • 注册声明:预定义如iss, exp
  • 公共声明:通用如name, email
  • 私有声明:自定义声明

通过深入理解这些攻击技术和防御措施,安全人员可以更好地评估和加固使用JWT的应用程序安全性。

JWT攻击专题深入解析 1. JWT基础概念 1.1 什么是JWT? JSON Web Token (JWT)是一种标准化格式,用于在系统之间发送加密签名的JSON数据。它通常用于发送用户信息("声明"),作为身份验证、会话处理和访问控制机制的一部分。 1.2 JWT结构 JWT由三部分组成,用点号(.)分隔: 头(Header) 有效载荷(Payload) 签名(Signature) 示例格式: header.payload.signature 1.3 JWT组成部分详解 头部(Header) : Base64Url编码的JSON对象 包含token元数据 关键参数: alg (算法)、 typ (类型) 有效载荷(Payload) : Base64Url编码的JSON对象 包含用户声明(claims) 常见声明: sub (用户ID)、 name 、 iat (签发时间)、 exp (过期时间) 签名(Signature) : 对头部和有效载荷的哈希值 使用服务器私钥生成 用于验证token完整性 2. JWT安全漏洞类型 2.1 签名验证缺陷 2.1.1 完全未验证签名 开发错误:使用 decode() 而非 verify() 攻击方法:直接修改payload部分 利用步骤 : 捕获合法JWT 解码并修改payload 发送修改后的JWT 2.1.2 接受无签名token 设置 alg 为 none 服务器可能过滤不严格 利用步骤 : 修改头部 alg 为 none 删除签名部分(保留末尾点号) 修改payload 发送修改后的JWT 2.2 弱密钥攻击 2.2.1 密钥爆破 使用常见密钥字典 使用工具如hashcat hashcat爆破命令 : 利用步骤 : 捕获合法JWT 使用字典爆破密钥 使用获取的密钥生成新签名 发送伪造的JWT 2.2.2 密钥硬编码 开发使用默认/示例密钥 密钥强度不足 2.3 头部参数注入 2.3.1 算法混淆攻击 修改 alg 为 HS256 (对称算法) 使用公钥作为密钥 2.3.2 其他头部参数注入 jku :指定验证密钥URL jwk :直接嵌入验证密钥 kid :密钥ID注入 3. 攻击工具与技术 3.1 Burp Suite插件 JWT Editor :编辑、签名JWT JWT4B :解码、修改JWT 3.2 手动修改技术 使用Base64Url解码/编码 直接修改JSON内容 重新生成签名(如有密钥) 3.3 自动化工具 hashcat :爆破JWT密钥 jwt_ tool :JWT测试工具 4. 防御措施 4.1 签名验证 始终验证签名 使用 verify() 而非 decode() 4.2 密钥管理 使用强密钥 避免硬编码密钥 定期轮换密钥 4.3 算法限制 明确指定允许的算法 拒绝 none 算法 避免算法混淆 4.4 其他防御 验证所有声明(如 exp , iss ) 使用HTTPS传输 限制JWT有效期 5. 实战案例 5.1 未验证签名绕过 捕获请求获取JWT 解码修改payload(如用户角色) 发送修改后的JWT 访问特权功能 5.2 弱密钥攻击 收集目标JWT 使用hashcat爆破密钥 使用JWT Editor生成新token 发送伪造的token 5.3 算法混淆攻击 获取服务器公钥 修改 alg 为HS256 使用公钥作为密钥签名 发送伪造token 6. 补充知识 6.1 JWT vs JWS vs JWE JWT :基本规范 JWS :签名实现 JWE :加密实现 6.2 常见签名算法 HS256 :HMAC+SHA256(对称) RS256 :RSA+SHA256(非对称) ES256 :ECDSA+SHA256 6.3 声明类型 注册声明 :预定义如 iss , exp 公共声明 :通用如 name , email 私有声明 :自定义声明 通过深入理解这些攻击技术和防御措施,安全人员可以更好地评估和加固使用JWT的应用程序安全性。