JWT安全问题

Json Web Tokens

在线工具网站:https://jwt.io/

python 用到的库 jwt  // pip install pyjwt  

JWTCrack key   // git clone https://github.com/Ch1ngg/JWTPyCrack.git

JWT 数据结构

 

 

 JWT头

JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。

{

"alg": "HS256",

"typ": "JWT"

}

在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。

最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。

3.2 有效载荷

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认字段供选择。

iss:发行人

exp:到期时间

sub:主题

aud:用户

nbf:在此之前不可用

iat:发布时间

jti:JWT ID用于标识该JWT

除以上默认字段外,我们还可以自定义私有字段,如下例:

{

"sub": "1234567890",

"name": "chongchong",

"admin": true

}

请注意,默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。

JSON对象也使用Base64 URL算法转换为字符串保存。

3.3签名哈希

签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。

首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),

secret)

在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,就构成整个JWT对象。

 

4. JWT的用法

客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。

此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。

Authorization: Bearer

当跨域时,也可以将JWT被放置于POST请求的数据主体中。

 

JWT所使用的Base64Url  与原本Base64的区别

# Base64Url编码如下所示
from base64 import *
def base64URLen(s):
    t0=b64encode(s)
    t1=t0.strip('=').replace('+','-').replace('/','_')
    return t1

def base64URLde(s):
    t0=s.replace('-','+').replace('_','/')
    t1=t0+'='*(4-len(t0)%4)%4
    return b64decode(t1)

  

JWT漏洞1

修改签名算法:

 

可以看到当前JWT到 alg算法为HS256

 

 

 

 

 

 

修改了JWT header alg 为none  //将算法HS256 更改为none

修改 payload username:guest  为 username:admin

并伪造payload  username=admin

python 生成payload

 

 

 

获取flag

 

 

 

JWT漏洞2

弱key爆破:

通过key 和对应的算法  自定义payload 生成新的jwt认证  伪造admin 身份

key:lol

算法:HS512

 

 

 

 

伪造role:admin 

encode    payload(dict), key, 加密方式

>>> dd=jwt.encode({"role":"admin"},"lol",algorithm="HS512")
>>> print(dd)
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4ifQ.y9GHxQbH70x_S8F_VPAjra_S-nQ9MsRnuvwWFGoIyKXKk8xCcMpYljN190KcV1qV6qLFTNrvg4Gwyv29OCjAWA'
>>>

 

 

获得flag

 

 

posted @ 2020-03-20 21:46  0xdd  阅读(546)  评论(0编辑  收藏  举报