jwt安全漏洞
- 什么是JWT
- JWT验证流程
- 漏洞介绍
- 方法一:伪造JWT
- 方法二:爆破密钥
什么是JWT
Json Web Token(JWT)
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。
JWT是一个有着简单的统一表达形式的字符串:
头部(Header)
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。
载荷(PayLoad)
payload的五个字段都是由JWT的标准所定义的。
- iss: 该JWT的签发者
- sub: 该JWT所面向的用户
- aud: 接收该JWT的一方
- exp(expires): 什么时候过期,这里是一个Unix时间戳
- iat(issued at): 在什么时候签发的
后面的信息可以按需补充。 JSON内容要经Base64 编码生成字符串成为PayLoad。
签名(signature)
这个部分header与payload通过header中声明的加密方式,使用密钥secret进行加密,生成签名。 JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。
JWT验证流程
首先,前端通过web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。
后端核对用户名和密码成功后,形成一个JWT Token。
后端将JWT字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在localStorage或sessionStorage中,退出登录时前端删除保存的JWT即可。
前端在每次请求时将JWT放入HTTP Header中的Authorization字段。
后端校验前端传来的JWT的有效性。
验证通过后,后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。
————————————————
版权声明:本文为CSDN博主「kali_Ma」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kali_Ma/article/details/121609999
漏洞介绍
我们可以通过伪造jwt的方式来伪装以达成认证通过的目的,从而进一步入侵服务器
方法一:伪造JWT
- 把头部加密方式修改为空
- 舍弃签名部分,与载荷进行拼接形成新的jwt(无加密方式所以不会生成签名)
- 去除=号
因为http传输过程中,base64编码中“=”。“+”,“/”等特殊符号通过url解码通常容易产生歧义,因此产生了与url兼容的base64 url编码
拼接完成后得到:
eyJhbGciOiIifQ.ewocc3ViHRocMTIzNDU2Nzg5MB0MChxuYW1lHToiSm9obiBEb2UiLAoiaWF0IjoxNTE2MjM5MDIyCn0.
tips:需要用.隔开
方法二:爆破密钥
通过脚本对密钥进行爆破从而构造新的jwt达成伪造目的
爆破代码
脚本暂时未找到,待补充