渗透测试 | JWT攻击面分析
字数 1431 2025-08-19 12:42:16
JWT安全分析与渗透测试指南
1. JWT概述
JWT(JSON Web Token)是一种用于身份认证和授权的开放标准(RFC 7519),它通过在网络应用间传递被加密的JSON数据来安全地传输信息。
主要作用:
- 身份验证(Authentication)
- 授权(Authorization)
2. JWT基本结构
JWT由三部分组成,以"."分隔:
Header.Payload.Signature
2.1 Header部分
包含JWT使用的算法和类型等元数据信息,使用Base64Url编码。
典型结构:
{
"alg": "HS256", // 签名算法
"typ": "JWT" // 令牌类型
}
常见算法:
- HS256:HMAC + SHA256
- RS256:RSA + SHA256
- ES256:ECDSA + SHA256
2.2 Payload部分
包含JWT的主要信息,使用Base64Url编码。包含三类声明:
-
注册声明(Registered Claims):预定义标准字段
iss(issuer):签发者sub(subject):面向用户aud(audience):接收方exp(expiration time):过期时间nbf(not before):生效时间iat(issued at):签发时间jti(JWT ID):唯一标识
-
公共声明(Public Claims):可自定义的公开信息
-
私有声明(Private Claims):提供者和消费者共同定义的私有信息
示例:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
2.3 Signature部分
用于验证消息完整性,防止篡改。生成方式:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
3. JWT攻击面分析
3.1 敏感信息泄露
- 风险:Header和Payload仅Base64编码,未加密
- 检测:使用工具解码JWT查看内容
- 工具:https://jwt.io/
3.2 算法篡改攻击
- None算法:将alg改为"none"绕过签名验证
- HS256转RS256:当应用支持多种算法时,将算法从非对称改为对称
3.3 密钥爆破攻击
- 对HS256算法尝试常见密钥爆破
- 工具:hashcat, jwt_tool
3.4 无效签名验证
- 某些实现不验证签名
- 测试方法:修改Payload后不更新签名
3.5 过期时间篡改
- 修改exp字段延长令牌有效期
- 测试方法:删除exp字段或设为未来时间
3.6 密钥泄露
- 通过信息泄露、源码分析获取签名密钥
- 测试方法:检查GitHub、配置文件等
3.7 其他攻击
- Kid注入:通过kid参数进行路径遍历或SQL注入
- JWT复用:捕获未过期的JWT重复使用
- 标头参数注入:注入恶意标头参数
4. 渗透测试工具
-
jwt_tool:功能全面的JWT测试工具
python3 jwt_tool.py <JWT> -
Burp Suite JWT插件:直接在Burp中测试JWT
-
在线工具:
- https://jwt.io/
- https://jwtdebugger.com/
5. 防御措施
- 敏感信息:不要在JWT中存储敏感数据
- 强算法:优先使用RS256而非HS256
- 密钥管理:使用强密钥并妥善保管
- 验证机制:
- 严格验证签名
- 检查过期时间
- 验证算法一致性
- 黑名单:实现JWT撤销机制
- 安全配置:
- 禁用"none"算法
- 限制支持的算法类型
- 验证所有声明字段
6. 总结
JWT作为现代认证机制的核心组件,其安全性至关重要。渗透测试人员应全面检查JWT的生成、传输、验证各环节,重点关注算法实现、密钥管理、声明验证等方面。开发人员则应遵循安全最佳实践,避免常见配置错误。