🪞Race conditions

Description

Originellement, la situation de concurrence (race-condition) est une situation caractérisée par un résultat différent selon l'ordre dans lequel agissent les acteurs du système. Le terme est plutôt employé à propos de programmes informatiques et de systèmes électroniques. C'est généralement considéré comme un défaut car source de panne ou de blocage.

Une condition de concurrence se produit lorsque deux sections de code conçues pour être exécuté dans une même séquence sont exécutés hors séquence.

La concurrence a deux types : le multitraitement et le multithreading. Le multitraitement fait référence à l'utilisation de plusieurs unités centrales de traitement (CPU), le matériel dans un ordinateur qui exécute des instructions, pour effectuer des simulations calculs fastidieux. D'autre part, le multithreading est la capacité pour un seul processeur de fournir plusieurs threads ou des exécutions simultanées.

Organiser la séquence d'exécution de plusieurs threads s'appelle du scheduling. Différents systèmes utilisent différents algorithmes de planification, selon leurs priorités de performance. Par exemple, certains systèmes peuvent programmer leur tâches en exécutant d'abord les tâches les plus prioritaires, tandis qu'un autre système pourrait exécuter ses tâches en donnant du temps de calcul à tour de rôle, quel que soit priorité.

Cette planification flexible est précisément ce qui provoque des conditions de concurrence. Elles se produisent lorsque les développeurs n'adhèrent pas à certains principes de concurrence.

Exploitation

Trouver des fonctionnalitées souvent sensibles aux race conditions

Parmis les fonctionnalitées qu'on retrouve souvent dans ce type d'attaques on trouve:

  • Les fonctionnalitées de contrôle d'accès

  • Les fonctionnalitées effectuant des décomptes ou touchant plus vagement à des chiffres/nombres (votes, scores, transferts d'argent, montants de cartes cadeau, ...)

On va ensuite copier la requête dans burp suite en faisant un clic droit et en séléctionnant "copy as curl command".

Envoyer la requête simultanément

La seconde étape vise à envoyer la même requête exactement au même moment pour voir s'il est possible de contourner la vérifiacation de pour l'une des deux requêtes.

Exemple:

On a un compte en banque possédant 100€, notre but est de savoir si on peut envoyer plus d'argent que ce que nous avons réellement.

On va donc envoyer la requête de transfert plusieurs fois aussi rapidement que possible avec la requête copiée dans l'étape précédente.

Ce qui nous donnera quelque chose comme:

curl ... & curl ... & curl ... & curl ... & curl ... & curl ... & curl ... & curl ... & curl ... & curl ... &

&: permet de lancer une commande en background (les commandes curl sont envoyées en même temps et pas les unes après les autres).

Il faut garder en tête que pour tester une race condition, il faut que la requête envoyée ne soit pas répétable (ici, si notre compte contient exactement 100€, si on tente d'envoyer 500€ l'opération sera refusée et inversement si on envoie 10€ l'opération sera autorisée 10 fois ce qui n'est pas le but.

Avec Burp suite

Turbo intruder exemples:

Bypass de rate limit

  1. Envoyer la requête dans Turbo intruder avec "%s" à la place de l'élément à remplacer

  2. Choisir le script qui se rapproche le plus du besoin dans la liste déroulante

  3. Modifier le script selon le contexte (wordlists.clipboard, boucles, conditions etc)

Dernière mise à jour