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 由三个部分组成,用点号 (.) 分隔:
- Header (头部)
- Payload (负载)
- Signature (签名)
格式:Header.Payload.Signature
2.1 Header (头部)
包含令牌类型和签名算法,例如:
{
"alg": "HS256",
"typ": "JWT"
}
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 (私有声明):自定义声明,用于在同意使用它们的各方之间共享信息
示例:
{
"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 特殊字符问题)
- 标准 Base64 使用
- 去掉填充字符
=
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 分析
示例请求:
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"
}
攻击思路:
- 获取有效 JWT
- 修改 Payload 中的权限相关字段
- 尝试重新签名或利用算法漏洞
- 发送修改后的 JWT 获取管理员权限
6. 防御措施
- 使用强密钥:足够长且复杂的签名密钥
- 严格验证算法:拒绝
none算法,验证alg字段 - 使用非对称加密:如 RS256 (公钥验证,私钥签名)
- 定期更换密钥:减少密钥泄露风险
- 设置合理过期时间:缩短 JWT 有效期
- 敏感操作二次验证:关键操作要求重新认证
- 黑名单机制:对已撤销但未过期的令牌进行管理
7. 实用工具
- JWT 在线解析/构造:https://jwt.io/
- Burp Suite 插件:JWT Editor 等
8. 总结
JWT 提供了简洁、自包含的身份验证机制,但同时也存在多种安全风险。开发人员应充分理解 JWT 的工作原理,实施适当的安全措施,避免常见漏洞。安全团队则应熟悉 JWT 的攻击面,能够有效测试和防御相关风险。