JWT-混淆算法
jwt - RS256(RSA + SHA-256)
题目来源:DownUnderCTF2021 Web jwt
外国的比赛,找不到线上的环境了,github中有Docker,拖下来用docker生成一个本地环境
原题wp链接:
https://ctftime.org/writeup/30541
github链接:
https://github.com/DownUnderCTF/Challenges_2021_Public
jwt参考链接:
https://web-sec.gitbook.io/wsa/advanced/jwt/algorithm-confusion
每次访问jwt数据都会变化,通过工具根据两个不同的令牌 生成一个可能的公钥(这说的不太准确,)
rsa_sign2n工具通过已知的令牌生成公钥
注意这个written to
后面的文件名 -> 公钥文件
通过生成的公钥依次尝试 利用工具 推出私钥**(只有当上面的公钥是弱公钥时才有可能)**
RsaCTFtool
用这个工具将公钥 -> 私钥
python3 RsaCtfTool.py --publickey ./public.key --private
成功生成私钥
通过私钥修改jwt验证数据, 将admin:false -> admin:true
import jwt
private_key = open('./private').read()
#print(private_key)
token = jwt.encode({'admin':True}, private_key, algorithm='RS256')
print(token)
curl -X POST -d "jwt=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZX0.B5wl51qvk-wOKN8JwAWiZ2U27lr_aHoTCPIbkEfVup4h_pdeMjXtbEMZvThns1aFWZN3ENscia3JwoTRu7alhmsSRL6QLuMmn6iSSsx2ZbOKQLenwWSfxOWjDymjk20moA" http://127.0.0.1:1337/get_flag
然后请求/get_flag路由用POST方法发送正确的jwt数据即可
总结
- 生成有不同的jwt数据 -> 通过工具生成公钥 -> 尝试弱公钥生成私钥 -> 私钥可以生成jwt数据