一文学习JWT造成的各种安全漏洞利用手法(二)
字数 1396 2025-08-29 08:30:13
JWT安全漏洞利用手法详解(二)
一、无密钥算法混淆攻击
漏洞原理
当服务器不验证JWT签名算法时,攻击者可以将算法从非对称加密(如RS256)改为对称加密(如HS256),利用服务器公钥作为HMAC密钥伪造令牌。
利用步骤
- 获取两个不同会话的JWT令牌
- 使用工具(如jwt_tool)分析令牌:
python3 jwt_tool.py <JWT1> -C -d <JWT2> - 尝试将算法从RS256改为HS256
- 使用服务器公钥作为HMAC密钥重新签名
- 修改payload中的权限字段(如将sub改为admin)
- 使用伪造的令牌访问系统
二、JWK头部注入攻击
漏洞基础
- JWK(JSON Web Key)是JWS规范中允许的头部字段
- 漏洞发生在服务器信任JWT中嵌入的公钥而不验证其来源时
- 攻击者可自建RSA密钥对,用自己的私钥签名,在头部嵌入对应的公钥
利用步骤
- 使用工具生成RSA密钥对(如Burp JWT Editor插件)
- 获取正常JWT令牌
- 修改payload中的权限字段
- 在头部添加jwk参数,包含攻击者公钥
- 使用攻击者私钥重新签名
- 发送伪造的JWT访问特权接口
三、JKU头部注入攻击
漏洞基础
- JKU(JSON Web Key Set URL)指向存储公钥的URL
- 服务器可能不验证JKU指向的域名是否可信
- 攻击者可托管恶意JWK Set,在JKU中指向自己的服务器
利用步骤
- 搭建恶意服务器托管JWK Set(包含攻击者公钥)
- 获取正常JWT令牌
- 修改payload中的权限字段
- 在头部添加jku参数,指向恶意URL
- 确保kid与远程JWK Set中的一致
- 使用攻击者私钥重新签名
- 发送伪造的JWT访问特权接口
四、KID头部注入攻击
漏洞基础
- KID(Key ID)没有严格格式要求
- 服务器可能使用kid值作为文件路径获取密钥
- 特殊文件如/dev/null(空文件)可被利用
利用步骤(路径遍历)
- 获取正常JWT令牌
- 修改头部:
- 设置alg为HS256
- 设置kid为"../../../dev/null"
- 使用空密钥("")进行HMAC签名
- 发送伪造的JWT绕过验证
五、敏感信息泄露
漏洞原理
- JWT payload部分仅Base64编码,可被轻易解码
- 开发者可能在payload中存储敏感信息(密码、密钥等)
利用步骤
- 获取JWT令牌
- Base64解码payload部分:
echo "<payload>" | base64 -d - 检查泄露的敏感信息(如密码可能是哈希值)
- 尝试破解哈希(如MD5)
- 使用泄露凭证登录系统
六、密钥硬编码漏洞
典型案例:Nacos JWT漏洞
- Nacos使用JWT进行身份认证
- 配置文件中存在默认签名密钥(如"SecretKey012345678901234567890123456789012345678901234567890123456789")
- 开发者未更改默认密钥导致可伪造JWT
利用步骤
- 识别系统使用JWT认证
- 查找公开的默认密钥(文档、GitHub等)
- 使用默认密钥伪造高权限JWT
- 绕过身份认证访问管理接口
防御措施
- 严格验证JWT签名算法,禁止算法降级
- 不信任客户端提供的jwk/jku,使用预定义的白名单密钥
- 对kid参数进行严格校验,防止路径遍历
- 不在JWT payload中存储敏感信息
- 不使用默认/弱密钥,定期轮换密钥
- 实现完整的JWT验证逻辑(过期时间、签发者等)
以上技术仅供安全研究和授权测试使用,未经授权测试他人系统可能违反法律。