JWT
Stateful Authentication vs Stateless Authentication :


Attacking signature verification
Il existe plusieurs moyen :
Le serveur ne vérifie pas la signature et bingo on peut tamper le JWT et il sera accepté
None Algorithm attack
L'attaque None Algorithm qui va nous permettre de faire passer l'algorithme à None et la signature ne sera pas vérifier

Attacking the Signing Secret
JWT supports three symmetric algorithms based on potentially guessable secrets: HS256, HS384, and HS512.
Comment cracker le secret ?
En utilisant hashcat et une wordlist on peut :
On aurait pu aussi jwt_tools :



Algorithm confusion attack
La confusion d'algorithme est une attaque ciblant les JWT (JSON Web Tokens) qui oblige une application web à utiliser un algorithme différent pour vérifier la signature du JWT par rapport à celui utilisé pour le créer.
Principe de fonctionnement : Lorsqu'une application web utilise un algorithme asymétrique comme RS256, une clé privée est utilisée pour calculer la signature, tandis qu'une clé publique est employée pour vérifier cette signature. Ces clés sont différentes : la clé privée reste secrÚte, tandis que la clé publique est partagée.
Cependant, si un attaquant crĂ©e un token utilisant un algorithme symĂ©trique comme HS256, la signature peut ĂȘtre vĂ©rifiĂ©e avec la mĂȘme clĂ© que celle utilisĂ©e pour signer le JWT. Si l'application web utilise la clĂ© publique (destinĂ©e uniquement Ă la vĂ©rification) pour vĂ©rifier ces tokens symĂ©triques, elle acceptera tout JWT signĂ© avec cette clĂ© publique. Comme cette clĂ© publique est accessible Ă tous, l'attaquant peut crĂ©er un JWT valide en le signant avec cette clĂ©.
Conditions de réussite de l'attaque :
L'application web détermine l'algorithme à utiliser pour vérifier la signature en se basant uniquement sur la valeur de la revendication alg dans le JWT.
L'application n'impose pas un algorithme spécifique pour vérifier les signatures.
Comment obtenir la clé publique
Elle est soit disponible dans les chemins suivant :
jwks.json/.well-known/jwks.json
Si on la trouve pas on peut utiliser l'outil suivant qui se chargera de la retrouver Ă l'aide de deux JWT :
Commande :

L'outils ce qui est bien nous donne aussi des JWT qui sont tamper avec l'algo HS256 :

Du coup on a la clé publique on peut forger un JWT via cyberchef, à savoir on doit ajouter un \n à la fin de la clé :


Et boom ça fonctionne :

Réutilisation des secrets JWT
Lorsqu'une entreprise héberge plusieurs applications web utilisant des JWT (JSON Web Tokens) pour l'authentification, chaque application doit utiliser un secret de signature différent. Si ce n'est pas le cas, un attaquant pourrait réutiliser un JWT obtenu à partir d'une application web pour s'authentifier sur une autre. Cette situation est particuliÚrement préoccupante si l'une des applications accorde un niveau de privilÚge élevé et que ce niveau est encodé dans le JWT.
Exemple pratique :
Supposons qu'une entreprise héberge deux réseaux sociaux distincts : socialA.htb et socialB.htb. De plus, un utilisateur est modérateur sur socialA, ce qui signifie que son JWT contient la revendication "role": "moderator". Cependant, sur socialB, cet utilisateur n'a aucun privilÚge particulier, et son JWT contient donc la revendication "role": "user".
Si les deux rĂ©seaux sociaux utilisent le mĂȘme secret JWT, l'utilisateur pourrait rĂ©utiliser son JWT de socialA sur socialB pour obtenir les privilĂšges de modĂ©rateur, crĂ©ant ainsi une faille de sĂ©curitĂ© majeure.
Exploiter les jwks
Injection de paramĂštres dans lâen-tĂȘte JWT
Selon la spĂ©cification JWS (JSON Web Signature), seul le paramĂštre dâen-tĂȘte alg est obligatoire. Toutefois, en pratique, les en-tĂȘtes JWT (souvent appelĂ©s en-tĂȘtes JOSE) contiennent frĂ©quemment plusieurs autres paramĂštres. Certains de ces paramĂštres sont particuliĂšrement intĂ©ressants pour les attaquants :
jwk (JSON Web Key) : Permet dâintĂ©grer un objet JSON reprĂ©sentant la clĂ© directement dans le token.
jku (JSON Web Key Set URL) : Fournit une URL permettant au serveur de récupérer un ensemble de clés contenant la clé correcte.
kid (Key ID) : Fournit un identifiant permettant au serveur de choisir la clé appropriée parmi plusieurs clés disponibles. Ce paramÚtre peut correspondre à une valeur associée à la clé.
Ces paramĂštres, contrĂŽlables par lâutilisateur, indiquent au serveur destinataire quelle clĂ© utiliser pour vĂ©rifier la signature. En exploitant ces paramĂštres, un attaquant peut injecter des JWT modifiĂ©s et signĂ©s avec une clĂ© arbitraire, au lieu d'utiliser le secret du serveur.
Injection de JWT auto-signés via le paramÚtre jwk
La spĂ©cification JWS dĂ©crit le paramĂštre dâen-tĂȘte optionnel jwk, qui permet au serveur dâintĂ©grer sa clĂ© publique directement dans le JWT, au format JSON Web Key (JWK).
Principe dâexploitation : Un attaquant peut crĂ©er un JWT contenant :
Une clé publique dans le paramÚtre jwk (qui correspond à une clé privée détenue par l'attaquant).
Une signature générée en utilisant la clé privée correspondante.
Lors de la vĂ©rification, si le serveur accepte et utilise la clĂ© publique intĂ©grĂ©e dans le JWT via jwk, lâattaquant peut faire valider des tokens quâil a lui-mĂȘme signĂ©s, permettant dâusurper des identitĂ©s ou de contourner des mĂ©canismes dâautorisation.
Last updated