JWT渗透姿势
字数 1944 2025-08-18 11:36:36
JWT渗透姿势详解
1. JWT基础概念
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递声明(claims)。它由三部分组成,用点(.)分隔:
- Header:包含令牌类型和签名算法
- Payload:包含声明(claims),即用户数据和其他元数据
- Signature:用于验证令牌完整性的签名
1.1 JWT结构示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
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
- 生成新令牌
- 暴力破解密钥
- 篡改测试
常用命令:
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. 渗透测试流程
- 收集信息:获取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的优势,同时最小化安全风险。