/*
在线生成jwt网站
https://jwt.io/#debugger
若设置成none,则会视为恶意行为无法生成
此外某些 JWT 实现对大小写敏感 None nOne NONE 建议多试试
*/
0x00 what is “JWT”
JWT全称JSON WEB Token,可以理解为一个小型的协议,用于客户端和服务端可靠地传输数据。
一个JWT串(来自maimai)实际上长成这个样子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1IjozNDcyMjU4NiwiaWQiOjc3Mjk3NTl9.I3p2MonJyAAMdsk4VyKgrQT6jal4jJSJv09BCbzOcNw
是一个以点号分割的三个子串拼接起来的。
JWT串的组成分为三个部分:
(1)头部
{
"typ": "JWT",
"alg": "HS256"
}
alg用于指定后端用什么方式进行签名校验,默认使用的是HS256,也就是HMAC-SHA256。将上面的串进行base64编码后作为真正填充的头部。
(2)载荷
这里的载荷其实就是一些用户数据的声明,分为公有声明、私有声明、注册声明。可以理解为K-V形式的用户数据存储。比如:
iss:该JWT的签发者,是否使用是可选的;
sub:该JWT所面向的用户,是否使用是可选的;
aud:接收该JWT的一方,是否使用是可选的;
exp(expires):什么时候过期,这里是一个Unix时间戳,是否使用是可选的;
iat(issued at):在什么时候签发的(UNIX时间),是否使用是可选的;
其他还有:
nbf (Not Before):如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟;是否使用是可选的
(3)签名
签名是有很多种算法考虑的,有哈希也有非对称加密方式。这里是对base64后的头和载荷进行签名计算,计算完成后base64一遍然后用点号拼接到JWT串的最后面。
当服务器端收到一个JWT串时,毫无疑问首先要对其进行分解,之后根据头部提供的方式来进行签名校验,校验无误之后再进行后续的操作。
0x01 how to hack it
(1)签名方式为None
历史上很多类库支持设置签名方式为None的情况,比如下面这种:
{
"typ": "JWT",
"alg": "None"
}
攻击方法很简单,将header部分的alg改为None,然后将签名部分删除掉,形如:
xxxxxx.xxxxxx.
然后提交,就可以绕过签名机制
(2)未效验签名
{
"typ": "JWT",
"alg": "HS256"
}
{
"iat": 1441593502,
"username": "admin"
}
{
"typ": "JWT",
"alg": "None"
}
此时我们将admin修改成admin1
//admin跟admin1都为已存在的账号
(3)爆破密钥
https://github.com/jmaxxz/jwtbrute
https://github.com/Sjord/jwtcrack/blob/master/crackjwt.py
https://github.com/magnumripper/JohnTheRipper
https://github.com/jpadilla/pyjwt
本文始发于微信公众号(零组攻防实验室):how to hack jwt
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论