随着分布式系统和移动app的大量使用,通过sessionid进行登录状态管理和权限验证的方法越来越复杂,故基于http header Authorization开始流行。
通过Authorization header,开发人员可以在多个设备和系统之间分享认证凭据并完成持久化,可以用更低的成本实现单点登录功能。故在安全测试中,需对JWT令牌的安全性进行深入测试。
JWT令牌
一般情况下,JWT令牌由3部分构成,如下:
· Header
Header部分包含了令牌的类型(type)和签名算法(alg)
· Payload
Payload部分主要为令牌携带的json格式信息,用于传递给服务端进行处理,具体内容由开发者自行定义,样例如下:
· Signature
Signature为对header和payload内容的签名,用于服务端校验令牌内容是否被篡改,具体签名流程如下:
最终需将header,payload和signature进行base64编码,并用.连接,如下:
常见漏洞汇总
对JWT的安全测试主要通过对签名机制进行绕过,并篡改payload进行攻击,主要测试点如下:
· 签名校验缺陷
部分JWT实现未对Signature进行校验,故可直接篡改payload或删除singature来尝试绕过签名校验。此外,可尝试将header中的alg设置为none来绕过算法签名校验(CVE-2015-2951)。
· 签名秘钥泄密
如签名密钥secret泄漏(代码泄漏/页面硬编码等),则可以通过secret伪造签名。
· 不安全签名算法
HS256算法作为对称算法易于遭受爆破攻击,攻击者可通过字典爆破已收到令牌的密钥secret,如爆破成功,则可以通过secret伪造签名。目前的安全实践推荐使用非对称的RS256作为签名算法。
· 签名算法替换
部分JWT库的校验逻辑会对使用HS256算法签发的令牌做较为宽容的校验,如收到的令牌算法为HS256且未找到secret,则自动使用SSL证书文件作为secret,故测试时可以考虑替换RS256到HS256,并通过证书做重签名,以尝试绕过签名算法。
· 令牌滥用问题
在存在JWT的使用场景中,可能存在多个应用共同使用同一套认证机制的情况(例如各类单点登录系统)。在此情况下,可能存在权限控制缺失问题,在测试中可以尝试通过获取边缘应用的认证token来尝试登录核心应用,以完成提权攻击。
· JWS自签名攻击问题
部分JWT库允许通过JWS机制实现公钥签名,故在测试时可以尝试在客户端对篡改的令牌生成一个可信的公钥JWS签名,并使用JWS签名替换原有的signature,以尝试绕过服务端的验证机制,如下:
· 注入攻击
由于JWT payload携带的数据处于已base64编码过后的HTTP header中,常规的WAF和WEB框架安全过滤机制难以覆盖此处,故可以在令牌中的payload区尝试各类注入攻击。
总结
以上为JWT的常见安全测试手法,供读者参考。
扫码关注我们
本文始发于微信公众号(零度安全攻防实验室):骇极干货 | 浅谈JWT安全测试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论