JWT介绍
1.1 JWT概念
JSON Web Token(JWT) 是一个开放标准。它定义了一种紧凑而独立的方法,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用secret(HMAC算法)或使用“RSA或ECDSA的公用/私有key pair密钥对”对JWT进行签名。
简单来说,JWT类似于身份令牌,只要JWT校验通过,即可验证身份。
1.2 JWT结构
JWT分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。JWT的内容以Base64URL进行了编码。
- header 头部:指明签名时使用的算法参数,token类型。上面为HS256加密,JWT类型。
- pyaload 数据 也叫声明:表明该JWT字符串内携带了哪些进行
- signature 签名:给上面的头部和数据进行签名,其实就是加密,保证上面数据没有被篡改、没有被替换。服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是JWT的签名。注意:签名本质就是加密,该字段会对头部和payload进行加密。上面加密过程为:HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload),secret)
总结
JWT其实就是对传输数据套了一层加密,保证数据没有被篡改和替换。没有密钥的情况下,直接修改数据时无效的,无法通过数据校验。
JWT其实是明文传输。JWT对传输的header、payload数据其实就是Base64加密,可直接解密。仅是加了签名字段,校验数据是否被更改,所以JWT一般不传输敏感数据。同时程序员没注意也存在敏感信息泄露。
2.漏洞利用
2.1思路
上述知道,JWT一般用于身份验证,但其实JWT的header和payload字段仅为base64编码,相当于明文。那如果后台验证时,并没检查签名字段,那可直接修改payload字段信息。
如果后台确实进行签名校验,但其实签名生成是通过header头中的加密算法和一段密文。如果知道密文,则可直接修改JWT数据。
如果不知道密文,那后端校验时存在2中情况:1. 后台提取header中的alg字段数据,再使用对应算法进行校验。2. 后台不提取header中的alg数据,直接默认使用指定的加密算法进行校验。
其实从代码逻辑中考虑,应该使用1的情况。这是就存在漏洞,header中的alg字段可设置为none,表明不使用加密算法,此时签名就为空。而header数据和payload数据直接base64加密即可。如果是2情况,那只有暴力破解密文,由于签名算法是已知的,加密数据除了secret之外也是已知的,只需要有密文字典,进行爆破即可。
注意:base6 4后其实还要适应URL,将base64的等号= 删掉即可。