how to hack jwt

  • A+
所属分类:安全文章


/*

在线生成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形式的用户数据存储。比如:

how to hack jwt



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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: