JWT是什么
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
在哪些场景使用
Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。
如何工作
服务器创建了一个json web token,它进行了编码,使用自己的key对其签名。如果您进行篡改,则它知道已无效。服务器上没有任何JWT的信息,而是将它发送给了浏览器。但是key本身保存于服务器中,确保密钥安全性。
浏览器可以选择存储它,比如使用cookie来存储。不管已什么方式,最终浏览器会发送含有jwt内容的请求给服务器,确保服务器知道用户正在使用什么进行授权。
jwt由三个部分组成:header.payload.signature
安全问题
-
修改header部分加密算法值为none,可能会绕过校验
空加密算法的设计初衷是用于调试的,如果开发人员失误在生产环境中开启了空加密算法,就会有问题
-
修改RSA加密算法为HMAC
是个漏洞,本来使用RSA算法进行的校验,但是我们在header中改为HMAC,我们使用获取到的钥**pub
(有办法获取)作为算法的密钥,对token进行签名,发送到服务器端,服务器端会将RSA的公钥(pub
**)视为当前算法(HMAC)的密钥,使用HS256算法对接收到的签名进行验证。
-
爆破密钥
条件:
-
知悉JWT使用的加密算法
-
一段有效的、已签名的token
-
签名用的密钥不复杂(弱密钥)
c-jwt-cracker
-
KID参数问题
kid
是jwt header中的一个可选参数,全称是key ID
,它用于指定加密算法的密钥,因为该参数可以由用户输入,所以也可能造成一些安全问题。
-
任意文件读取,
kid
参数用于读取密钥文件,但系统并不会知道用户想要读取的到底是不是密钥文件 -
SQL注入,
kid
也可以从数据库中提取数据,这时候就有可能造成SQL注入攻击 -
命令注入,对
kid
参数过滤不严也可能会出现命令注入问题,但是利用条件比较苛刻。
来玩
欢迎进群吹水交流~~~、
原文始发于微信公众号(赛博之眼CyberEye):【安全笔记】Web安全之- JWT
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论