• 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

  • 相关阅读:
    js原型对象与Java类的比较
    javascript特效--制作背景电子钟(整点时祝贺生日快乐)
    Java web MVC开发模式入门感悟
    重新审视面向对象编程
    10-排序4 统计工龄(20 分)
    基数排序
    表排序
    快速排序
    09-排序3 Insertion or Heap Sort(25 分)
    09-排序2 Insert or Merge(25 分)
  • 原文地址:https://www.cnblogs.com/gao88/p/10493226.html
Copyright © 2020-2023  润新知