Race condition en construction partielle

Partial construction race conditions

Objectif du lab

  • Le site propose un mécanisme d’inscription avec vérification d’email.

  • Une condition de course permet de bypasser la vérification et de s’inscrire avec une adresse arbitraire.

  • But final : créer un compte, se connecter, puis supprimer l’utilisateur carlos.

Contexte observé (inscription)

  • Message côté UI : “If you work for GinAndJuice, please use your @ginandjuice.shop email address”.

Tentative de création de compte avec l’email fourni par le lab → réponse “invalid email address”.

Tentative avec un email conforme, ex. [email protected] → réponse :

“Please check your emails for your account registration link”.

Analyse du fonctionnement (resources/users.js)

Dans users.js, on voit :

  • Le formulaire de register envoie username, email, password.

  • La confirmation d’email est réalisée via un POST vers :

    • POST /confirm?token=...

  • Le token est extrait de l’URL et injecté dans l’action du form de confirmation.

Conclusion : la validation dépend d’un endpoint /confirm avec un token transmis en query string.

Première piste et blocage

  • Tentative de forcer une confirmation vide :

  • Réponse : Forbidden → endpoint protégé contre token vide “classique”.

Contournement de la protection (interprétation alternative)

Nouvelle tentative :

  • Réponse : “Incorrect token: Array”

    • Interprétation : le backend ne bloque plus “comme Forbidden”, il traite la valeur (mais signale qu’elle est un tableau).

Observation des timings

  • La requête register est plus lente :

  • ~ 199 ms

La requête confirm est plus rapide :

  • ~ 78 ms

Idée : bombarder /confirm?token[]= pendant la fenêtre où le compte est en cours de création, pour déclencher une confirmation “au mauvais moment”.

Exploitation

Méthode 1 — Intruder “classique” (concurrence)

  1. Envoyer la requête POST /confirm?token[]= dans Intruder.

  • Configurer l’envoi en requêtes concurrentes (ex. 10).

  • Pendant ce spam, depuis Repeater (ou navigateur), créer plusieurs comptes :

    • test1, test2, test3, … test7

Vérifier les réponses d’Intruder :

  • Une des réponses finit par retourner 200

Essayer de se connecter avec les comptes test :

  • Succès observé (ex. test2).

Méthode 2 — Turbo Intruder (Race single packet attack)

  1. Sélectionner une requête et l’envoyer à Turbo Intruder.

  • Choisir l’attaque race / single packet.

Utiliser ce script :

Principe du script (tel qu’appliqué ici) :

  • Mettre en file plusieurs registrations (usernames lol0..lol19)

  • Mettre en file beaucoup de confirmations (/confirm?token[]=)

  • Ouvrir la “gate” pour déclencher la condition de course.

Résultat attendu

  • Au moins un compte est créé comme si l’email était confirmé (sans posséder le token).

  • On peut alors se connecter avec ce compte, puis utiliser les fonctionnalités du compte pour atteindre l’objectif du lab (suppression de carlos).

Mis à jour