JWT

Stateful Authentication vs Stateless Authentication :

Stateful Authentication
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 :

hashcat
jwttools

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 :

  1. Une clé publique dans le paramÚtre jwk (qui correspond à une clé privée détenue par l'attaquant).

  2. 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