Explained

JSON Web Token

格式

1
2
3
xxxxx.yyyyy.zzzzz
(header.payload.Signature)
header一般以ey开头

header

在头部的数据中通常包含有 2 部分的内容:token 的类型,这里使用的是字符 JWT,和使用的的签名加密算法,例如 SHA256 或者 RSA。

例如下面的格式

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

然后,将上面的 JSON 数据格式使用 Base64Url 算法进行哈希,这样就得到了 JWT 的第一部分。

payload

字段可以自定义

1
2
3
{
"name": "John Doe"
}

当然数据也是经过 Base64Url 进行加密的,这部分加密的内容组成了 JWT 的第二部分。

Signature

为了创建一个加密部分,需要有已经编码过的头部和负载,然后还需要一个密钥(secret)和一个已经在头部中指定的加密算法来进行签名。

例如,如果你希望使用 HMAC SHA256 算法来进行签名,那么这个算法中使用的数据为:

1
2
3
4
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret) secret base64 encode

签名的作用主要用于校验传输的令牌(Token)数据没有在过程中被篡改。

可以在jwt.io上解码jwt token

Exploitation

有时可以把加密算法改成none,signature不变

1
2
3
4
{
"alg": "None",
"typ": "JWT"
}

把header进行base64编码

有的时候signature里的secret是可以爆破的,把jwt存到jwt.txt里,然后hashcat跑

1
./hashcat -m 16500 -a 0 jwt.txt password.txt

把secret破解出来之后,再去jwt.io上加密自己的jwt

有时候jwt可以复用,也就是在同一个目标下的不同资产里,可能能重用