zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【装机知识】内存条知识总结
    【装机知识】主板知识整理
    【装机知识】CPU知识整理
    SHELL 学历笔记
    tmux 会话恢复(no sessions)
    数据库客户端神器(mycli/pgcli/iredis)
    golang编写二叉树
    编译安装带lua 的 vim 编辑器
    linux 下vim 开发环境配置(通用所有编程语言)
    mac 下安装mysql
  • 原文地址:https://www.cnblogs.com/0xdd/p/12535128.html
Copyright © 2011-2022 走看看