PortSwigger JWT 安全问题
字数 1637 2025-08-12 11:34:02
JWT安全漏洞分析与防护指南
1. JWT基础概念
1.1 JWT组成结构
JWT(JSON Web Token)由三部分组成,用点号(.)分隔:
- Header:包含Token类型和加密算法
- Payload:存储业务数据如用户ID等
- Signature:数字签名,验证Token完整性
示例格式:Header.Payload.Signature
1.2 JWT相关术语
- JWS(JSON Web Signature):带签名的JWT实现
- JWE(JSON Web Encryption):加密的JWT实现
- JWK(JSON Web Key):表示加密密钥的JSON对象
2. JWT基础安全问题
2.1 未验证签名漏洞
漏洞原理:服务器未验证JWT签名,攻击者可任意修改Payload数据
利用方法:
- 获取合法JWT
- 修改Payload中的权限字段(如
isAdmin: true) - 发送修改后的JWT
防护措施:服务器必须验证JWT签名
2.2 弱算法验证漏洞
漏洞原理:服务器未严格验证Header中的alg参数
利用方法:
- 修改
alg为none - 删除Signature部分(保留点号)
- 修改Payload中的权限字段
防护措施:禁用none算法,严格限制可用算法
2.3 弱密钥爆破漏洞
漏洞原理:使用弱密钥或常见密钥,可被爆破
利用工具:
hashcat -a 0 -m 16500 <JWT> /path/to/jwt.secrets.list
防护措施:使用强随机密钥,定期更换密钥
3. JWT标头注入攻击
3.1 JWK注入攻击
漏洞原理:服务器允许任意公钥验证签名
利用步骤:
- 使用JWT Editor Keys插件生成RSA密钥对
- 在JWT Header中添加
jwk参数指向生成的公钥 - 修改Payload中的权限字段
- 使用私钥签名
防护措施:限制可接受的公钥白名单
3.2 JKU注入攻击
漏洞原理:服务器信任jku参数指定的外部密钥
利用步骤:
- 生成RSA密钥对
- 将公钥托管在可控服务器上
- 修改JWT Header中的
jku指向恶意公钥 - 修改Payload并签名
防护措施:严格限制jku域名白名单
3.3 KID注入与目录遍历
漏洞原理:kid参数未严格验证,可结合路径遍历
利用方法:
- 创建对称密钥,设置
k值为AA==(null) - 修改
kid为../../../dev/null - 修改Payload权限字段
- 使用空密钥签名
防护措施:验证kid格式,限制文件系统访问
4. 算法混淆攻击
4.1 攻击原理
漏洞成因:当服务器:
- 使用RS256(非对称)算法签发JWT
- 但使用通用验证方法,可能将公钥作为HS256(对称)密钥使用
攻击流程:
- 获取服务器公钥(如从
/jwks.json) - 将公钥转换为PEM格式并Base64编码
- 创建HS256对称密钥,使用编码后的公钥
- 修改
alg为HS256,修改Payload - 使用"对称密钥"签名
4.2 无公钥泄露场景
利用方法:
- 获取两个不同时间签发的JWT
- 使用工具(如sig2n)分析提取公钥:
docker run --rm -it portswigger/sig2n <token1> <token2>
- 后续步骤与有公钥泄露场景相同
5. JWT安全防护措施
- 使用最新JWT库:确保修复已知漏洞
- 严格算法限制:禁用
none,仅允许强算法 - 密钥管理:使用强随机密钥,定期更换
- 标头验证:
- 限制
jku域名白名单 - 验证
kid格式,防止路径遍历
- 限制
- 签名验证:必须验证签名有效性
- 公钥管理:维护可信公钥白名单
- 监控日志:记录异常JWT使用情况
6. 工具推荐
-
Burp Suite插件:
- JWT Editor
- JWT Editor Keys
-
离线工具:
- hashcat:爆破弱密钥
- sig2n:从多个Token中提取公钥
-
在线工具:
- jwt.io:JWT编解码与验证
通过全面了解这些JWT安全问题和防护措施,开发人员和安全工程师可以更好地保护基于JWT的身份验证系统免受攻击。