ctfshow jwt

简单记录一下jwt的专项题

jwt

jwt主要用于身份验证,由服务器端在验证客户端身份之后生成并返回给客户端,客户端在登陆之后每次访问服务器都要携带该参数。
jwt主要由三部分组成:header + payload + signature。每部分由‘.’连接。


jwt构成
  • header:主要存储加密方式
  • payload:携带客户信息
  • signature:用于服务器端验证
    如果想要详细了解jwt,请自行查询

ctfshow

web345

  • 查看cookie,找到auth,应该是token
  • 在jwt.io进行解码。其中header部分为:
{
  "alg": "None",
  "typ": "jwt"
}

payload部分为:

[
  {
    "iss": "admin",
    "iat": 1646440778,
    "exp": 1646447978,
    "nbf": 1646440778,
    "sub": "user",
    "jti": "87357538d22b5bdd11675ff727397687"
  }
]

由于header中的alg为"none",所以该jwt没有进行加密,因此也就没有签名部分(在没有加密的情况下不存在签名)。

  • 有了上面的分析,解题就简单了,我们将payload中sub赋值为"admin"然后将两部分进行base64编码,使用'.'(点)拼接,作为cookie,去访问/admin路由,flag就出来了(最好是利用burpsuit抓包进行请求)。

web346

  • 取出cookie中的token,在jwt.io中进行解码,得出如下结果


    解析结果 web346
  • 上图可知,jwt使用了"HS256"的加密方式,因此该题存在签名。解题方式为将header中的alg修改为"none"(无加密方式),这样可以绕过签名,然后将paload中的sub修改为"admin",将两部分的base64编码使用点号(‘.’)进行拼接。
  • 虽然该题修改加密方式可以绕过签名,但是由于该jwt本身存在签名,所以我们需要在上面一步得出的结果后在加上一个点号('.'),再去访问/admin。请注意,像修改加密方式为'none'绕过签名的方法旨在一部分题目中有效。换句话说,只有当后台开启了允许无加密的设置时才会有效。

web347

改题目的签名可以猜出来--123456(弱口令),修改payload中的sub字段,利用该弱口令去生成jwt就好了。

web348

对jwt密钥进行爆破, 本文使用工具为c-jwt-cracker,请自行下载安装(官方文档写的很清楚)

web349

根据给出的js文件,访问/private.key与/public.key分别得到公私钥,然后复制到jwt.io生成新的jwt字符串

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容