JWT token破解绕过

前言

  这是印度举办的CTF中遇到的一道JWT破解绕过题,觉得还是挺有价值的,mark一下。

JWT伪造

  这是一道b00t2root的一道web题,觉得很有意思,并且结合了加密的知识,所以记录一下。

  首先了解下JWT:

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。JWT常被用于前后端分离,可以和Restful API配合使用,常用于构建身份认证机制。

  JWT的数据格式分为三个部分: headers , payloads,signature(签名),它们使用.点号分割。拿道题后看了一下cookie,发现是如下格式:




1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ImZhbHNlIn0.oe4qhTxvJB8nNAsFWJc7_m3UylVZzO3FwhkYuESAyUM

  进行base64解密后发现:




  所以,我们的目的就是把false改成true,而且要通过服务器的验证,这点很重要,并不是直接把false改成true就万事大吉了。因为服务器收到token后会对token的有效性进行验证。

  验证方法:首先服务端会产生一个key,然后以这个key作为密钥,使用第一部分选择的加密方式(这里就是HS256),对第一部分和第二部分拼接的结果进行加密,然后把加密结果放到第三部分

1
服务器每次收到信息都会对它的前两部分进行加密,然后比对加密后的结果是否跟客户端传送过来的第三部分相同,如果相同则验证通过,否则失败。

  因为加密算法我们已经知道了,如果我们只要再得到加密的key,我们就能伪造数据,并且通过服务器的检查。

  这里我使用了这个工具进行破解:C语言版JWT破解工具,下载安装完毕后,直接进行破解,如图:




  所以,我的加密密钥就是:54l7y。然后我们去验证一下,这个网站可以提供验证服务:https://jwt.io/。当我们使用破解出来的key时,我们能完美还原出原始数据,这证明我们的key是正确的。




  最后我们把false改成true,然后使用key进行加密,可以得到如下:




  然后我们拿着这个token刷新一下:




  可以看到flag已经出来了。

参考链接

https://github.com/brendan-rius/c-jwt-cracker

https://auth0.com/blog/brute-forcing-hs256-is-possible-the-importance-of-using-strong-keys-to-sign-jwts/

https://jwt.io/

http://www.cnblogs.com/dliv3/p/7450057.html

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×