JWT的安全问题

本文主要讨论JWT的安全问题,因水平有限,可能有些安全方面没有涉及到,欢迎各位师傅在评论区留言补充

JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

JWT的组成

它由三部分组成,头部、载荷与签名
通常如下所示
xxxx.yyyy.zzzz
在这里插入图片描述
头部
在这里插入图片描述
alg表示了该jwt所使用的签名算法
typ表示格式

载荷
在这里插入图片描述
载荷一般记载角色的权限信息,iat表示创建时间

签名
在这里插入图片描述
签名的话一般使用HS256算法,HS512算法和RSA算法

JWT的使用场景

授权:这是使用 JWT 最常见的场景。用户登录后,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够轻松跨不同域使用。

信息交换:JSON Web Tokens 是一种在各方之间安全传输信息的好方法。因为 JWT 可以被签名——例如,使用公钥/私钥对——你可以确定发件人就是他们所说的那样。此外,由于使用标头和有效负载计算签名,因此您还可以验证内容是否未被篡改。

具体详情
https://jwt.io/introduction
https://blog.csdn.net/weixin_43409309/article/details/102569913

JWT的安全问题

1,越权
我们看一下这个例子
(1)我们要帮Tom付款一笔订单。
在这里插入图片描述
当我们点击查看时,发现该JWT过期,无法支付
在这里插入图片描述
所以我们要伪造一个合法的JWT,来为该订单付款。
接下来,我们先对该JWT进行解析
在这里插入图片描述
发现该JWT的签名算法用的是HS512算法。这里我们采用把alg字段设置为none绕过,意思时不采用签名算法,其中iat字段表示的是该JWT的创建时间,exp表示该JWT的过期时间,我们把exp的时间设置大一点,如设置过期时间到2050年。因为不采用签名算法,所以第三字段为空
在这里插入图片描述

在这里插入图片描述
可以看到已经成功支付。所以说允许JWT不使用签名算法是高危行为。
(2)当JWT必须使用签名算法所产生的安全行为
在这里插入图片描述
我们所完成的目标是用Jerry账号权限来删除Tom账号。JWT解析格式如下,头部的kid字段是key的id值,可以从数据库找到该id所对应的key
在这里插入图片描述
我们按照上一个例子的方法来看看能不能越权删除成功。把username设置为Tom
在这里插入图片描述
在这里插入图片描述
可以发现,该网站不接受未签名的JWT
接下来我们看看该网站的源代码,找到该模块对应的代码,可以发现,在签名密钥提取这里,它没有对kid进行过滤,便和数据库查询语句结合进行查询,导致了SQL注入的产生,而且对查询到的key进行了base64解码
在这里插入图片描述
所以我们可以利用kid值来指定我们想要的密钥
我这里指定了密钥为abc,因为代码会对密钥进行解码,所以我们要先把他编码一遍,abc的base64编码为YWJj。构造的JWT如下
在这里插入图片描述
越权删除成功
在这里插入图片描述
当JWT的密钥为弱密钥时,很容易被暴力破解
在这里插入图片描述
我们的目标是越权取得管理员权限来重置投票,我们采用暴力破解的发法来获取JWT的密钥,代码如下
在这里插入图片描述
该JWT的密钥为victory
在这里插入图片描述
将admin字段设置为true,并用我们得到的密钥进行签名
在这里插入图片描述
在这里插入图片描述
2,敏感信息泄露
在JWT的载荷中,通常会存储用户的邮箱,手机号,账号密码等敏感信息,这就导致了敏感信息泄露

总结

JWT必须使用签名算法,对没有使用签名算法的JWT禁止接受。
JWT中不要存储敏感信息
对key id要进行过滤
不要使用弱密钥进行签名

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值