ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 原理 通过伪造JWT的数据进行利用,而组成签名的方法是由头部和声明两个的原生数据,通过生成的密钥进行的加密,在对方不服务器不验证签名的情况下,可以在头部把加密方式放更none不加密,修改声明当中的内容,从而能够达到利用 ## JWT伪造示例 * JWT的数据格式分为三个部分: headers , payloads,signature(签名),它们使用`.`点号分割。拿道题后看了一下cookie,(也可抓包看)发现是如下格式: ![](https://img.kancloud.cn/10/c6/10c67e3f462d313df1e9160294cf989a_688x502.png) ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ImZhbHNlIn0.oe4qhTxvJB8nNAsFWJc7_m3UylVZzO3FwhkYuESAyUM ``` * 进行base64解密后发现: ![](https://img.kancloud.cn/8b/e6/8be6404e5596badff845aac75e74718d_1027x184.png) * **所以,我们的目的就是把false改成true,而且要通过服务器的验证,这点很重要,并不是直接把false改成true就万事大吉了。因为服务器收到token后会对token的有效性进行验证。** * **验证方法:首先服务端会产生一个key,然后以这个key作为密钥,使用第一部分选择的加密方式(这里就是HS256),对第一部分和第二部分拼接的结果进行加密,然后把加密结果放到第三部分。** * **服务器每次收到信息都会对它的前两部分进行加密,然后比对加密后的结果是否跟客户端传送过来的第三部分相同,如果相同则验证通过,否则失败。** * **因为加密算法我们已经知道了,我们只要再得到加密的key,我们就能伪造数据,并且通过服务器的检查。** * 这里我使用了这个工具进行key的破解:[C语言版JWT破解工具](https://github.com/brendan-rius/c-jwt-cracker),下载安装完毕后,直接进行破解,如图: ![](https://img.kancloud.cn/93/e4/93e42b6066a874d98c3ebb9d6f7d533b_927x135.png) * 所以,破解出来的加密密钥key就是:54l7y。然后我们去验证一下,这个网站可以提供验证服务:[https://jwt.io/](https://jwt.io/)。**当我们使用破解出来的key,能完美还原出原始数据时,这证明我们的key是正确的。** ![](https://img.kancloud.cn/66/2b/662bd7fcab1a25cc69ee5e7a83afae7e_1043x723.png) * 最后我们把false改成true,然后使用破解出来的key进行加密,可以得到如下: ![](https://img.kancloud.cn/18/15/181580bf8bf0a948cdae46cbdb6b230b_987x638.png) * 然后我们拿着这个token去抓包,重放刷新一下: ![](https://img.kancloud.cn/e7/88/e788a2a49ada108ebb76108e46ada321_1078x323.png) * 可以看到flag已经出来了。