攻击JWT的一些方法
字数 1569 2025-08-25 22:58:40

JWT安全攻防指南

JWT基础概念

JWT(Json Web Token)是一种遵循JSON格式的令牌,用于将用户信息加密到token中。它由三部分组成:

  1. Header(头部)

    • 包含alg(算法)和typ(类型)字段
    • 常用算法:HMAC和RSA
    • 示例:{"alg": "HS256", "typ": "JWT"}
  2. Payload(载荷)

    • 包含用户数据和元数据声明
    • 示例:{"user_name": "admin"}
  3. Signature(签名)

    • 保护token完整性
    • 生成公式:signature = HMAC-SHA256(base64urlEncode(header) + "." + base64urlEncode(payload), secret_key)
    • 使用base64url编码(修改版Base64,无"="填充,"+"→"-","/"→"_")

完整token格式:header.payload.signature

JWT攻击方法

1. 空加密算法攻击

原理

  • JWT支持alg: None空加密算法
  • 服务器可能错误配置允许空算法

攻击步骤

  1. 修改header中的algNone
  2. 移除signature部分
  3. 构造payload中的用户身份信息

示例token

ew0KCSJhbGciIDogIk5vbmUiLA0KCSJ0eXAiIDogImp3dCINCn0.ew0KCSJ1c2VyIiA6ICJBZG1pbiINCn0

防御

  • 服务器端严格验证算法类型
  • 禁止使用None算法

2. RSA转HMAC算法攻击

原理

  • 当系统使用RSA算法时,攻击者可尝试改为HMAC
  • 使用RSA公钥作为HMAC密钥伪造签名

攻击步骤

  1. 获取系统RSA公钥
  2. 修改header中的algHS256
  3. 使用RSA公钥作为HMAC密钥生成签名
  4. 发送伪造的token

防御

  • 严格校验算法类型与预期一致
  • 不同算法使用不同密钥

3. 密钥爆破攻击

前提条件

  • 已知JWT使用的加密算法
  • 有一段有效的已签名token
  • 密钥复杂度不高(弱密钥)

工具

  • c-jwt-cracker

示例爆破命令

./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE

防御

  • 使用足够复杂的长密钥
  • 定期更换密钥

4. KID参数攻击

KID(Key ID)是header中的可选参数,用于指定加密算法的密钥。

4.1 任意文件读取

原理

  • KID参数未过滤用户输入
  • 系统可能读取任意文件作为密钥

攻击方式

{
  "alg": "HS256",
  "typ": "JWT",
  "kid": "/path/to/secret/file"
}

4.2 SQL注入

原理

  • KID参数用于从数据库提取密钥
  • 未过滤导致SQL注入

攻击方式

{
  "alg": "HS256",
  "typ": "JWT",
  "kid": "key123' UNION SELECT 'attacker_controlled_key'--"
}

4.3 命令注入

原理

  • 使用Ruby的open函数或PHP的exec/system读取密钥
  • 未过滤导致命令注入

攻击方式

{
  "alg": "HS256",
  "typ": "JWT",
  "kid": "/path/to/key|whoami"
}

防御

  • 严格过滤KID参数
  • 限制密钥文件路径
  • 使用白名单验证

5. JKU/X5U参数攻击

原理

  • JKU(JSON Web Key Set URL):指定验证密钥的URL
  • X5U:指定验证证书的URL
  • 未过滤时攻击者可指定恶意密钥/证书

攻击方式

{
  "alg": "HS256",
  "typ": "JWT",
  "jku": "https://attacker.com/malicious_keys.json"
}

防御

  • 禁用或严格验证JKU/X5U参数
  • 使用固定密钥集

6. 信息泄露

原理

  • JWT保证完整性而非机密性
  • Payload仅base64url编码,相当于明文传输

攻击方式

  • 直接解码payload部分获取敏感信息

防御

  • 不在JWT中存储敏感信息
  • 必要时加密payload

防御建议

  1. 算法验证

    • 严格验证alg参数与预期一致
    • 禁用None算法
  2. 输入过滤

    • 严格过滤KID、JKU、X5U等参数
    • 使用白名单机制
  3. 密钥管理

    • 使用足够强度的密钥
    • 定期更换密钥
    • 不同算法使用不同密钥
  4. 敏感信息

    • 不在JWT中存储敏感数据
    • 必要时加密payload
  5. 安全配置

    • 关闭调试功能
    • 限制密钥文件访问权限

通过全面了解JWT的安全机制和潜在攻击面,开发人员可以更好地设计和实现安全的JWT认证系统。

JWT安全攻防指南 JWT基础概念 JWT(Json Web Token)是一种遵循JSON格式的令牌,用于将用户信息加密到token中。它由三部分组成: Header(头部) 包含 alg (算法)和 typ (类型)字段 常用算法:HMAC和RSA 示例: {"alg": "HS256", "typ": "JWT"} Payload(载荷) 包含用户数据和元数据声明 示例: {"user_name": "admin"} Signature(签名) 保护token完整性 生成公式: signature = HMAC-SHA256(base64urlEncode(header) + "." + base64urlEncode(payload), secret_key) 使用base64url编码(修改版Base64,无"="填充,"+"→"-","/"→"_ ") 完整token格式: header.payload.signature JWT攻击方法 1. 空加密算法攻击 原理 : JWT支持 alg: None 空加密算法 服务器可能错误配置允许空算法 攻击步骤 : 修改header中的 alg 为 None 移除signature部分 构造payload中的用户身份信息 示例token : 防御 : 服务器端严格验证算法类型 禁止使用 None 算法 2. RSA转HMAC算法攻击 原理 : 当系统使用RSA算法时,攻击者可尝试改为HMAC 使用RSA公钥作为HMAC密钥伪造签名 攻击步骤 : 获取系统RSA公钥 修改header中的 alg 为 HS256 使用RSA公钥作为HMAC密钥生成签名 发送伪造的token 防御 : 严格校验算法类型与预期一致 不同算法使用不同密钥 3. 密钥爆破攻击 前提条件 : 已知JWT使用的加密算法 有一段有效的已签名token 密钥复杂度不高(弱密钥) 工具 : c-jwt-cracker 示例爆破命令 : 防御 : 使用足够复杂的长密钥 定期更换密钥 4. KID参数攻击 KID(Key ID)是header中的可选参数,用于指定加密算法的密钥。 4.1 任意文件读取 原理 : KID参数未过滤用户输入 系统可能读取任意文件作为密钥 攻击方式 : 4.2 SQL注入 原理 : KID参数用于从数据库提取密钥 未过滤导致SQL注入 攻击方式 : 4.3 命令注入 原理 : 使用Ruby的 open 函数或PHP的 exec/system 读取密钥 未过滤导致命令注入 攻击方式 : 防御 : 严格过滤KID参数 限制密钥文件路径 使用白名单验证 5. JKU/X5U参数攻击 原理 : JKU (JSON Web Key Set URL):指定验证密钥的URL X5U :指定验证证书的URL 未过滤时攻击者可指定恶意密钥/证书 攻击方式 : 防御 : 禁用或严格验证JKU/X5U参数 使用固定密钥集 6. 信息泄露 原理 : JWT保证完整性而非机密性 Payload仅base64url编码,相当于明文传输 攻击方式 : 直接解码payload部分获取敏感信息 防御 : 不在JWT中存储敏感信息 必要时加密payload 防御建议 算法验证 : 严格验证 alg 参数与预期一致 禁用 None 算法 输入过滤 : 严格过滤KID、JKU、X5U等参数 使用白名单机制 密钥管理 : 使用足够强度的密钥 定期更换密钥 不同算法使用不同密钥 敏感信息 : 不在JWT中存储敏感数据 必要时加密payload 安全配置 : 关闭调试功能 限制密钥文件访问权限 通过全面了解JWT的安全机制和潜在攻击面,开发人员可以更好地设计和实现安全的JWT认证系统。