JWT渗透姿势
字数 1944 2025-08-18 11:36:36

JWT渗透姿势详解

1. JWT基础概念

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递声明(claims)。它由三部分组成,用点(.)分隔:

  1. Header:包含令牌类型和签名算法
  2. Payload:包含声明(claims),即用户数据和其他元数据
  3. Signature:用于验证令牌完整性的签名

1.1 JWT结构示例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

2. JWT常见漏洞类型

2.1 算法修改攻击(None算法)

原理:JWT支持"none"算法,表示不验证签名。攻击者可将算法改为"none"并移除签名部分。

利用步骤

  1. 解码JWT获取原始header
  2. 修改alg为"none"
  3. 移除签名部分(最后一个点后的内容)
  4. 发送修改后的令牌

防御:服务器应明确指定允许的算法,拒绝none算法。

2.2 弱密钥攻击

原理:使用弱密钥(如"secret"、"password"等)容易被暴力破解。

利用工具

  • jwt_tool
  • hashcat
  • John the Ripper

防御:使用强随机密钥,定期更换密钥。

2.3 算法混淆攻击(RS256转HS256)

原理:当应用支持多种算法时,攻击者可将非对称算法(RS256)改为对称算法(HS256),并使用公钥作为密钥伪造签名。

利用步骤

  1. 获取服务器公钥
  2. 修改header中的alg为HS256
  3. 使用公钥作为密钥生成新签名
  4. 发送伪造的令牌

防御:严格校验算法类型,只允许预期算法。

2.4 密钥泄露

原理:密钥文件或配置不当导致密钥泄露。

常见泄露位置

  • 版本控制系统(.git)
  • 配置文件
  • 文档注释
  • 错误消息

防御:严格管理密钥,避免硬编码。

2.5 无效签名验证

原理:服务器未正确验证签名,仅解码payload就信任令牌。

检测方法:修改payload后不修改签名,观察是否仍被接受。

防御:严格验证签名有效性。

2.6 过期时间缺失/过长

原理:未设置exp声明或过期时间过长,增加令牌被盗风险。

防御:设置合理的过期时间,使用refresh token机制。

3. JWT渗透测试工具

3.1 jwt_tool

功能:

  • 解码/编码JWT
  • 生成新令牌
  • 暴力破解密钥
  • 篡改测试

常用命令:

python3 jwt_tool.py <JWT>
python3 jwt_tool.py <JWT> -C -d wordlist.txt  # 字典攻击
python3 jwt_tool.py <JWT> -X a -pk public.pem  # 算法混淆攻击

3.2 Burp Suite插件

  • JWT Editor
  • JSON Web Tokens

3.3 在线工具

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

4. 渗透测试流程

  1. 收集信息:获取JWT样本,分析结构
  2. 测试签名验证
    • 修改payload不修改签名
    • 测试none算法
    • 测试算法混淆
  3. 密钥破解
    • 使用常见密钥字典
    • 暴力破解
  4. 检查声明
    • 检查exp、nbf、iat等时间声明
    • 测试权限提升
  5. 测试注销机制:检查令牌是否可继续使用

5. 防御措施

  1. 算法控制
    • 明确指定允许的算法
    • 拒绝none算法
  2. 密钥管理
    • 使用强随机密钥
    • 定期更换密钥
    • 避免密钥泄露
  3. 声明验证
    • 验证exp、nbf、iat
    • 验证iss、aud等标准声明
  4. 安全配置
    • 设置合理的过期时间
    • 实现令牌撤销机制
  5. 传输安全
    • 始终使用HTTPS
    • 避免URL传输(可能被日志记录)

6. 高级攻击技巧

6.1 JKU/JWK注入

原理:利用header中的jku或jwk参数指定外部密钥。

利用步骤

  1. 托管恶意公钥
  2. 修改jku指向恶意服务器
  3. 使用对应私钥签名

防御:禁用jku/jwk或严格限制域名。

6.2 Kid参数滥用

原理:kid(key ID)参数可能用于文件包含或SQL注入。

利用方法

  • 路径遍历:"kid": "../../../etc/passwd"
  • SQL注入:"kid": "key' UNION SELECT 'key' --"

防御:严格校验kid值。

6.3 嵌套JWT攻击

原理:利用JWE嵌套JWT绕过验证。

防御:明确处理嵌套令牌的逻辑。

7. 实际案例

案例1:算法修改导致认证绕过

  1. 原始JWT使用RS256算法
  2. 攻击者修改为HS256算法
  3. 使用泄露的公钥作为密钥签名
  4. 服务器错误地使用公钥验证HS256签名
  5. 认证绕过成功

案例2:弱密钥导致账户接管

  1. 发现JWT使用HS256算法
  2. 使用常见密钥字典破解
  3. 成功破解密钥为"secret123"
  4. 使用该密钥生成管理员令牌
  5. 接管任意账户

8. 总结

JWT作为现代应用广泛使用的认证机制,其安全性至关重要。渗透测试时应全面检查算法实现、密钥强度、声明验证等方面。开发人员应遵循安全最佳实践,避免常见配置错误。通过正确实施防御措施,可以充分发挥JWT的优势,同时最小化安全风险。

JWT渗透姿势详解 1. JWT基础概念 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递声明(claims)。它由三部分组成,用点(.)分隔: Header :包含令牌类型和签名算法 Payload :包含声明(claims),即用户数据和其他元数据 Signature :用于验证令牌完整性的签名 1.1 JWT结构示例 2. JWT常见漏洞类型 2.1 算法修改攻击(None算法) 原理 :JWT支持"none"算法,表示不验证签名。攻击者可将算法改为"none"并移除签名部分。 利用步骤 : 解码JWT获取原始header 修改alg为"none" 移除签名部分(最后一个点后的内容) 发送修改后的令牌 防御 :服务器应明确指定允许的算法,拒绝none算法。 2.2 弱密钥攻击 原理 :使用弱密钥(如"secret"、"password"等)容易被暴力破解。 利用工具 : jwt_ tool hashcat John the Ripper 防御 :使用强随机密钥,定期更换密钥。 2.3 算法混淆攻击(RS256转HS256) 原理 :当应用支持多种算法时,攻击者可将非对称算法(RS256)改为对称算法(HS256),并使用公钥作为密钥伪造签名。 利用步骤 : 获取服务器公钥 修改header中的alg为HS256 使用公钥作为密钥生成新签名 发送伪造的令牌 防御 :严格校验算法类型,只允许预期算法。 2.4 密钥泄露 原理 :密钥文件或配置不当导致密钥泄露。 常见泄露位置 : 版本控制系统(.git) 配置文件 文档注释 错误消息 防御 :严格管理密钥,避免硬编码。 2.5 无效签名验证 原理 :服务器未正确验证签名,仅解码payload就信任令牌。 检测方法 :修改payload后不修改签名,观察是否仍被接受。 防御 :严格验证签名有效性。 2.6 过期时间缺失/过长 原理 :未设置exp声明或过期时间过长,增加令牌被盗风险。 防御 :设置合理的过期时间,使用refresh token机制。 3. JWT渗透测试工具 3.1 jwt_ tool 功能: 解码/编码JWT 生成新令牌 暴力破解密钥 篡改测试 常用命令: 3.2 Burp Suite插件 JWT Editor JSON Web Tokens 3.3 在线工具 https://jwt.io/ https://token.dev/ 4. 渗透测试流程 收集信息 :获取JWT样本,分析结构 测试签名验证 : 修改payload不修改签名 测试none算法 测试算法混淆 密钥破解 : 使用常见密钥字典 暴力破解 检查声明 : 检查exp、nbf、iat等时间声明 测试权限提升 测试注销机制 :检查令牌是否可继续使用 5. 防御措施 算法控制 : 明确指定允许的算法 拒绝none算法 密钥管理 : 使用强随机密钥 定期更换密钥 避免密钥泄露 声明验证 : 验证exp、nbf、iat 验证iss、aud等标准声明 安全配置 : 设置合理的过期时间 实现令牌撤销机制 传输安全 : 始终使用HTTPS 避免URL传输(可能被日志记录) 6. 高级攻击技巧 6.1 JKU/JWK注入 原理 :利用header中的jku或jwk参数指定外部密钥。 利用步骤 : 托管恶意公钥 修改jku指向恶意服务器 使用对应私钥签名 防御 :禁用jku/jwk或严格限制域名。 6.2 Kid参数滥用 原理 :kid(key ID)参数可能用于文件包含或SQL注入。 利用方法 : 路径遍历: "kid": "../../../etc/passwd" SQL注入: "kid": "key' UNION SELECT 'key' --" 防御 :严格校验kid值。 6.3 嵌套JWT攻击 原理 :利用JWE嵌套JWT绕过验证。 防御 :明确处理嵌套令牌的逻辑。 7. 实际案例 案例1:算法修改导致认证绕过 原始JWT使用RS256算法 攻击者修改为HS256算法 使用泄露的公钥作为密钥签名 服务器错误地使用公钥验证HS256签名 认证绕过成功 案例2:弱密钥导致账户接管 发现JWT使用HS256算法 使用常见密钥字典破解 成功破解密钥为"secret123" 使用该密钥生成管理员令牌 接管任意账户 8. 总结 JWT作为现代应用广泛使用的认证机制,其安全性至关重要。渗透测试时应全面检查算法实现、密钥强度、声明验证等方面。开发人员应遵循安全最佳实践,避免常见配置错误。通过正确实施防御措施,可以充分发挥JWT的优势,同时最小化安全风险。