简单记录一下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字符串