• JWT漏洞学习


    JWT漏洞学习

    什么是JWT?

    JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证,会话状态维持以及信息交换等任务。

    JSON Web令牌结构是什么?

    JWT由三部分构成,分别称为header,payload和signature,各部分用“.”相连构成一个完整的Token,形如xxxxx.yyyyy.zzzzz

    下面一张图明确显示了该结构:

    jwt令牌

    令牌是base64编码的,由三部分组成header.claims.signature。该令牌的解码版本为:

    {
      "alg":"HS256",
      "typ":"JWT"
    }
    .
    {
      "exp": 1416471934,
      "user_name": "user",
      "scope": [
        "read",
        "write"
      ],
      "authorities": [
        "ROLE_ADMIN",
        "ROLE_USER"
      ],
      "jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84",
      "client_id": "my-client-with-secret"
    }
    .
    qxNjYSPIKSURZEMqLQQPw1Zdk6Le2FdGHRYZG7SQnNk
    

    令牌数据解码

    由于Header和Payload部分是使用可逆base64方法编码的,因此任何能够看到令牌的人都可以读取数据。
    要读取内容,您只需要将每个部分传递给base64解码函数,以下是一些示例:

    Linux base64工具(带有-d标志用于解码):

    $ echo eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 | base64 -d
     {"typ":"JWT","alg":"HS256"}
    

    浏览器JavaScript控制台:

    >> atob("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9")
     "{"typ":"JWT","alg":"HS256"}"
    

    Powershell:

    PS C:> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64Strin
    g("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"))
    {"typ":"JWT","alg":"HS256"}
    

    Pyhton:

    >>> import base64
    >>> print(base64.b64decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9'))
    {"typ":"JWT","alg":"HS256"}
    

    靶场练习

    靶场下载

    实验使用靶场:WEBGOAT

    https://github.com/WebGoat/WebGoat/releases/download/v8.0.0.M17/webgoat-server-8.0.0.M17.jar

    如何运行:

    java -jar webgoat-server-8.0.0.M17.jar

    访问http://localhost:8080/WebGoat/即可。

    特征识别

    首先我们需要识别应用程序正在使用JWT,最简单的方法是在代理工具的历史记录中搜索JWT正则表达式:

    [= ]ey[A-Za-z0-9_-]*.[A-Za-z0-9._-]*         -网址安全的JWT版本
    [= ]ey[A-Za-z0-9_/+-]*.[A-Za-z0-9._/+-]*   -所有JWT版本(可能误报)
    

    以burpsuite举例,在Proxy-HTTP history-File by search term中填入上诉正则表达式,切记勾选“区分大小写”和“正则表达式”选项:

    靶场实验

    Page4

    GET /WebGoat/JWT/votings HTTP/1.1
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
    Accept: */*
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    X-Requested-With: XMLHttpRequest
    Connection: close
    Referer: http://localhost:8080/WebGoat/start.mvc
    Cookie: access_token=eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2MDYzNTgwNzAsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.uuxUOl2GoZaVEY8TsKJte0adKMGVd5Eywu3ys-nNIetgg0vfPLC68mMoat-Pp9z20it0AzFfEEEy2YgIZXJKEg; JSESSIONID=6C55033D91301896A8FAB9BA824DDDDC
    X-Forwarded-For: 127.0.0.1
    

    token:

    eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2MDYzNTgwNzAsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.uuxUOl2GoZaVEY8TsKJte0adKMGVd5Eywu3ys-nNIetgg0vfPLC68mMoat-Pp9z20it0AzFfEEEy2YgIZXJKEg
    

    解码:

    Headers = {
      "alg": "HS512"
    }
    
    Payload = {
      "iat": 1606358070,
      "admin": "false",
      "user": "Tom"
    }
    
    Signature = "uuxUOl2GoZaVEY8TsKJte0adKMGVd5Eywu3ys-nNIetgg0vfPLC68mMoat-Pp9z20it0AzFfEEEy2YgIZXJKEg"
    

    使用JWT_TOOL进行漏洞检测

    显示存在"alg":"none"

    更改Headers 中"alg"为none,Payload中"admin"为true.

    注:https://jwt.io/ 该平台不能把alg更改为none,有些师傅使用该平台得到token也是神了,可以使用burpsuite中的Decoder模块,麻烦模仿别人博客的师傅自己实验一下好吧。

    Page5

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJ0b21Ad2ViZ29hdC5jb20iLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQuY29tIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.m-jSyfYEsVzD3CBI6N39wZ7AcdKdp_GiO7F_Ym12u-0
    

    base64解码后的令牌

    {
    "typ":"JWT",
    "alg":"HS256"
    }
    .
    {
    "iss":"WebGoat Token Builder",
    "iat":1524210904,
    "exp":1618905304,
    "aud":"webgoat.org",
    "sub":"tom@webgoat.com",
    "username":"Tom",
    "Email":"tom@webgoat.com",
    "Role":[
    "Manager",
    "Project Administrator"]
    }
    .
    m-jSyfYEsVzD3CBI6N39wZ7AcdKdp_GiO7F_Ym12u-0
    

    使用JWT_TOOL跑密钥。

    python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJ0b21Ad2ViZ29hdC5jb20iLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQuY29tIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.m-jSyfYEsVzD3CBI6N39wZ7AcdKdp_GiO7F_Ym12u-0 -C -d 20k.txt 
    

    然后更改Payload中“username”为WebGoat,使用破解的密钥victory生成新的token。

    Page7

    从题目大意来讲是以Tom的身份来购买这些物品,查看他给出的链接:http://localhost:8080/WebGoat/images/logs.txt 里面有一串token

    eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTUyNjIxNzgxMSwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ.DCoaq9zQkyDH25EcVWKcdbyVfUL4c9D4jRvsqOqvi9iAd4QuqmKcchfbU8FNzeBNF9tLeFXHZLU4yRkq-bjm7Q
    

    解码:

    考虑到题目给出的是令牌刷新,所以这因为是令牌过期的问题,直接查看"iat"和"exp"

    使用python查看当前时间

    >python3
    >import time;
    >time.time();
    

    修改完exp之后把"admin"改为true,"alg"改为none,可以使用burpsuite的JOSEPH插件进行改编码

    请求包添加“Authorization” 字段,然后把token加入即可。

    Page8

    请求包如下:

    token:

    eyJ0eXAiOiJKV1QiLCJraWQiOiJ3ZWJnb2F0X2tleSIsImFsZyI6IkhTMjU2In0.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJqZXJyeUB3ZWJnb2F0LmNvbSIsInVzZXJuYW1lIjoiSmVycnkiLCJFbWFpbCI6ImplcnJ5QHdlYmdvYXQuY29tIiwiUm9sZSI6WyJDYXQiXX0.CgZ27DzgVW8gzc0n6izOU638uUCi6UhiOJKYzoEZGE8
    

    解码:

    常规思路是把"alg"改为none,username改为Tom.

    另外一种应该是使用"kid"进行注入。(没试验过)

    相关资料

    https://www.cnblogs.com/yh-ma/p/10271720.html

    https://www.cnblogs.com/xiaozi/p/12031111.html

    https://www.cnblogs.com/xiaozi/p/12005929.html

    https://emtunc.org/blog/11/2017/jwt-refresh-token-manipulation/

    https://www.freebuf.com/vuls/211842.html

    https://jwt.io/

  • 相关阅读:
    ByteArrayInputStream&ByteArrayOutputStream源码分析
    常用FastJSON的SerializerFeature特性及日期转换格式
    SpringAware
    Zuul(SpringCloud学习笔记一)
    RabbitMQ和SpringBoot的简单整合列子
    Cngigure和BUS实现远端配置
    vagrant安装homestead环境使用总结
    sublime安装插件
    vagrant配置(假设已经安装好了vagrant并且下载好了box)
    linux php安装配置oci8模块
  • 原文地址:https://www.cnblogs.com/Secde0/p/13968608.html
Copyright © 2020-2023  润新知