PortSwigger JWT 安全问题
字数 1637 2025-08-12 11:34:02

JWT安全漏洞分析与防护指南

1. JWT基础概念

1.1 JWT组成结构

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

  • Header:包含Token类型和加密算法
  • Payload:存储业务数据如用户ID等
  • Signature:数字签名,验证Token完整性

示例格式:Header.Payload.Signature

1.2 JWT相关术语

  • JWS(JSON Web Signature):带签名的JWT实现
  • JWE(JSON Web Encryption):加密的JWT实现
  • JWK(JSON Web Key):表示加密密钥的JSON对象

2. JWT基础安全问题

2.1 未验证签名漏洞

漏洞原理:服务器未验证JWT签名,攻击者可任意修改Payload数据

利用方法

  1. 获取合法JWT
  2. 修改Payload中的权限字段(如isAdmin: true)
  3. 发送修改后的JWT

防护措施:服务器必须验证JWT签名

2.2 弱算法验证漏洞

漏洞原理:服务器未严格验证Header中的alg参数

利用方法

  1. 修改algnone
  2. 删除Signature部分(保留点号)
  3. 修改Payload中的权限字段

防护措施:禁用none算法,严格限制可用算法

2.3 弱密钥爆破漏洞

漏洞原理:使用弱密钥或常见密钥,可被爆破

利用工具

hashcat -a 0 -m 16500 <JWT> /path/to/jwt.secrets.list

防护措施:使用强随机密钥,定期更换密钥

3. JWT标头注入攻击

3.1 JWK注入攻击

漏洞原理:服务器允许任意公钥验证签名

利用步骤

  1. 使用JWT Editor Keys插件生成RSA密钥对
  2. 在JWT Header中添加jwk参数指向生成的公钥
  3. 修改Payload中的权限字段
  4. 使用私钥签名

防护措施:限制可接受的公钥白名单

3.2 JKU注入攻击

漏洞原理:服务器信任jku参数指定的外部密钥

利用步骤

  1. 生成RSA密钥对
  2. 将公钥托管在可控服务器上
  3. 修改JWT Header中的jku指向恶意公钥
  4. 修改Payload并签名

防护措施:严格限制jku域名白名单

3.3 KID注入与目录遍历

漏洞原理kid参数未严格验证,可结合路径遍历

利用方法

  1. 创建对称密钥,设置k值为AA==(null)
  2. 修改kid../../../dev/null
  3. 修改Payload权限字段
  4. 使用空密钥签名

防护措施:验证kid格式,限制文件系统访问

4. 算法混淆攻击

4.1 攻击原理

漏洞成因:当服务器:

  1. 使用RS256(非对称)算法签发JWT
  2. 但使用通用验证方法,可能将公钥作为HS256(对称)密钥使用

攻击流程

  1. 获取服务器公钥(如从/jwks.json)
  2. 将公钥转换为PEM格式并Base64编码
  3. 创建HS256对称密钥,使用编码后的公钥
  4. 修改alg为HS256,修改Payload
  5. 使用"对称密钥"签名

4.2 无公钥泄露场景

利用方法

  1. 获取两个不同时间签发的JWT
  2. 使用工具(如sig2n)分析提取公钥:
docker run --rm -it portswigger/sig2n <token1> <token2>
  1. 后续步骤与有公钥泄露场景相同

5. JWT安全防护措施

  1. 使用最新JWT库:确保修复已知漏洞
  2. 严格算法限制:禁用none,仅允许强算法
  3. 密钥管理:使用强随机密钥,定期更换
  4. 标头验证
    • 限制jku域名白名单
    • 验证kid格式,防止路径遍历
  5. 签名验证:必须验证签名有效性
  6. 公钥管理:维护可信公钥白名单
  7. 监控日志:记录异常JWT使用情况

6. 工具推荐

  1. Burp Suite插件

    • JWT Editor
    • JWT Editor Keys
  2. 离线工具

    • hashcat:爆破弱密钥
    • sig2n:从多个Token中提取公钥
  3. 在线工具

    • jwt.io:JWT编解码与验证

通过全面了解这些JWT安全问题和防护措施,开发人员和安全工程师可以更好地保护基于JWT的身份验证系统免受攻击。

JWT安全漏洞分析与防护指南 1. JWT基础概念 1.1 JWT组成结构 JWT(JSON Web Token)由三部分组成,用点号(.)分隔: Header :包含Token类型和加密算法 Payload :存储业务数据如用户ID等 Signature :数字签名,验证Token完整性 示例格式: Header.Payload.Signature 1.2 JWT相关术语 JWS(JSON Web Signature) :带签名的JWT实现 JWE(JSON Web Encryption) :加密的JWT实现 JWK(JSON Web Key) :表示加密密钥的JSON对象 2. JWT基础安全问题 2.1 未验证签名漏洞 漏洞原理 :服务器未验证JWT签名,攻击者可任意修改Payload数据 利用方法 : 获取合法JWT 修改Payload中的权限字段(如 isAdmin: true ) 发送修改后的JWT 防护措施 :服务器必须验证JWT签名 2.2 弱算法验证漏洞 漏洞原理 :服务器未严格验证Header中的 alg 参数 利用方法 : 修改 alg 为 none 删除Signature部分(保留点号) 修改Payload中的权限字段 防护措施 :禁用 none 算法,严格限制可用算法 2.3 弱密钥爆破漏洞 漏洞原理 :使用弱密钥或常见密钥,可被爆破 利用工具 : 防护措施 :使用强随机密钥,定期更换密钥 3. JWT标头注入攻击 3.1 JWK注入攻击 漏洞原理 :服务器允许任意公钥验证签名 利用步骤 : 使用JWT Editor Keys插件生成RSA密钥对 在JWT Header中添加 jwk 参数指向生成的公钥 修改Payload中的权限字段 使用私钥签名 防护措施 :限制可接受的公钥白名单 3.2 JKU注入攻击 漏洞原理 :服务器信任 jku 参数指定的外部密钥 利用步骤 : 生成RSA密钥对 将公钥托管在可控服务器上 修改JWT Header中的 jku 指向恶意公钥 修改Payload并签名 防护措施 :严格限制 jku 域名白名单 3.3 KID注入与目录遍历 漏洞原理 : kid 参数未严格验证,可结合路径遍历 利用方法 : 创建对称密钥,设置 k 值为 AA== (null) 修改 kid 为 ../../../dev/null 修改Payload权限字段 使用空密钥签名 防护措施 :验证 kid 格式,限制文件系统访问 4. 算法混淆攻击 4.1 攻击原理 漏洞成因 :当服务器: 使用RS256(非对称)算法签发JWT 但使用通用验证方法,可能将公钥作为HS256(对称)密钥使用 攻击流程 : 获取服务器公钥(如从 /jwks.json ) 将公钥转换为PEM格式并Base64编码 创建HS256对称密钥,使用编码后的公钥 修改 alg 为HS256,修改Payload 使用"对称密钥"签名 4.2 无公钥泄露场景 利用方法 : 获取两个不同时间签发的JWT 使用工具(如sig2n)分析提取公钥: 后续步骤与有公钥泄露场景相同 5. JWT安全防护措施 使用最新JWT库 :确保修复已知漏洞 严格算法限制 :禁用 none ,仅允许强算法 密钥管理 :使用强随机密钥,定期更换 标头验证 : 限制 jku 域名白名单 验证 kid 格式,防止路径遍历 签名验证 :必须验证签名有效性 公钥管理 :维护可信公钥白名单 监控日志 :记录异常JWT使用情况 6. 工具推荐 Burp Suite插件 : JWT Editor JWT Editor Keys 离线工具 : hashcat:爆破弱密钥 sig2n:从多个Token中提取公钥 在线工具 : jwt.io:JWT编解码与验证 通过全面了解这些JWT安全问题和防护措施,开发人员和安全工程师可以更好地保护基于JWT的身份验证系统免受攻击。