漏洞赏金猎人:JWT 漏洞深度解析(实战演示逐步讲解)
字数 1410 2025-08-22 12:23:06

JWT漏洞深度解析:算法降级攻击实战指南

1. JWT基础概念

1.1 JWT定义与用途

  • JWT (JSON Web Token) 是一种开放标准(RFC 7519)
  • 主要用于身份认证(Authentication)和授权(Authorization)
  • 广泛应用于现代Web应用和API安全

1.2 JWT常见传输位置

  • Authorization: Bearer 头部(最常见)
  • Cookie中
  • 作为URL参数(jwt=...)

2. JWT结构解析

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

header.payload.signature

2.1 头部(Header)

  • Base64编码的JSON对象
  • 包含两个关键字段:
    • alg:签名算法(如HS256、RS256、none等)
    • typ:令牌类型(通常为"JWT")

示例:

{
  "alg": "HS256",
  "typ": "JWT"
}

2.2 负载(Payload)

  • Base64编码的JSON对象
  • 包含用户相关声明(claims):
    • 标准声明:iss(签发者)、exp(过期时间)、sub(主题)等
    • 私有声明:username、user_id、role、isAdmin等自定义字段

示例:

{
  "username": "user",
  "admin": false,
  "exp": 1735689600
}

2.3 签名(Signature)

  • 由头部+负载+密钥通过指定算法生成
  • 用于验证消息未被篡改

3. JWT算法降级漏洞原理

3.1 漏洞背景

  • JWT规范支持none算法
  • none算法表示"此令牌不需要签名验证"
  • 如果服务器配置不当,可能接受none算法的JWT

3.2 漏洞利用条件

  1. 服务器未正确验证JWT的签名算法
  2. 服务器接受alg: none的JWT
  3. 负载中包含权限相关字段(如admin、role等)

3.3 攻击步骤

  1. 获取正常JWT令牌(如普通用户令牌)
  2. Base64解码头部和负载
  3. 修改头部中的算法为none
  4. 修改负载中的权限相关字段(如"admin": false"admin": true)
  5. 移除签名部分(因为none算法不需要签名)
  6. 将修改后的令牌发送给服务器

示例攻击流程:

原始JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJhZG1pbiI6ZmFsc2V9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

修改后:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VybmFtZSI6InVzZXIiLCJhZG1pbiI6dHJ1ZX0.

4. 实战演示

4.1 识别漏洞

  1. 检查JWT是否包含敏感权限字段
  2. 尝试将算法改为none并移除签名
  3. 观察服务器是否接受修改后的令牌

4.2 工具使用

  • 浏览器开发者工具:查看网络请求中的JWT
  • jwt.io:在线解码/编码JWT
  • Burp Suite:拦截和修改请求

4.3 利用示例

使用curl发送修改后的JWT:

curl -H 'Authorization: Bearer eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VybmFtZSI6InVzZXIiLCJhZG1pbiI6dHJ1ZX0.' http://target.com/api/privileged-action

5. 防御措施

5.1 服务器端防御

  1. 强制验证签名算法:拒绝none算法的JWT
  2. 白名单验证:只接受预期的签名算法(如HS256或RS256)
  3. 密钥保护:确保签名密钥安全存储
  4. 声明验证:严格验证负载中的所有声明

5.2 开发建议

# Python示例:使用PyJWT验证JWT时明确指定算法
import jwt

# 正确的验证方式(指定允许的算法)
try:
    decoded = jwt.decode(token, 'secret', algorithms=['HS256'])
except jwt.InvalidAlgorithmError:
    # 处理无效算法
    pass

6. 漏洞赏金实战技巧

  1. 全面测试所有JWT传输位置:不仅检查Authorization头,还要检查Cookies和URL参数
  2. 尝试各种算法:除none外,还可尝试HS256/RS256切换等
  3. 关注权限字段:重点修改role、admin、isAdmin等字段
  4. 自动化工具辅助:使用jwt_tool等工具提高效率

7. 总结

JWT算法降级攻击是一种常见的高危漏洞,利用服务器对none算法的错误处理实现权限提升。防御关键在于服务器端严格验证JWT的签名算法和所有声明。作为安全研究人员,掌握此类漏洞的发现和利用方法对漏洞赏金猎人和渗透测试工作至关重要。

JWT漏洞深度解析:算法降级攻击实战指南 1. JWT基础概念 1.1 JWT定义与用途 JWT (JSON Web Token) 是一种开放标准(RFC 7519) 主要用于 身份认证 (Authentication)和 授权 (Authorization) 广泛应用于现代Web应用和API安全 1.2 JWT常见传输位置 Authorization: Bearer 头部(最常见) Cookie中 作为URL参数(jwt=...) 2. JWT结构解析 JWT由三部分组成,用点号(.)连接: 2.1 头部(Header) Base64编码的JSON对象 包含两个关键字段: alg :签名算法(如HS256、RS256、none等) typ :令牌类型(通常为"JWT") 示例: 2.2 负载(Payload) Base64编码的JSON对象 包含用户相关声明(claims): 标准声明:iss(签发者)、exp(过期时间)、sub(主题)等 私有声明:username、user_ id、role、isAdmin等自定义字段 示例: 2.3 签名(Signature) 由头部+负载+密钥通过指定算法生成 用于验证消息未被篡改 3. JWT算法降级漏洞原理 3.1 漏洞背景 JWT规范支持 none 算法 none 算法表示"此令牌不需要签名验证" 如果服务器配置不当,可能接受 none 算法的JWT 3.2 漏洞利用条件 服务器未正确验证JWT的签名算法 服务器接受 alg: none 的JWT 负载中包含权限相关字段(如admin、role等) 3.3 攻击步骤 获取正常JWT令牌(如普通用户令牌) Base64解码头部和负载 修改头部中的算法为 none 修改负载中的权限相关字段(如 "admin": false → "admin": true ) 移除签名部分(因为 none 算法不需要签名) 将修改后的令牌发送给服务器 示例攻击流程: 4. 实战演示 4.1 识别漏洞 检查JWT是否包含敏感权限字段 尝试将算法改为 none 并移除签名 观察服务器是否接受修改后的令牌 4.2 工具使用 浏览器开发者工具 :查看网络请求中的JWT jwt.io :在线解码/编码JWT Burp Suite :拦截和修改请求 4.3 利用示例 使用curl发送修改后的JWT: 5. 防御措施 5.1 服务器端防御 强制验证签名算法 :拒绝 none 算法的JWT 白名单验证 :只接受预期的签名算法(如HS256或RS256) 密钥保护 :确保签名密钥安全存储 声明验证 :严格验证负载中的所有声明 5.2 开发建议 6. 漏洞赏金实战技巧 全面测试所有JWT传输位置 :不仅检查Authorization头,还要检查Cookies和URL参数 尝试各种算法 :除 none 外,还可尝试HS256/RS256切换等 关注权限字段 :重点修改role、admin、isAdmin等字段 自动化工具辅助 :使用jwt_ tool等工具提高效率 7. 总结 JWT算法降级攻击是一种常见的高危漏洞,利用服务器对 none 算法的错误处理实现权限提升。防御关键在于服务器端严格验证JWT的签名算法和所有声明。作为安全研究人员,掌握此类漏洞的发现和利用方法对漏洞赏金猎人和渗透测试工作至关重要。