> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/web/jwt/attaques-sur-la-revocation.md).

# Attaques sur la révocation

Il est possible de donner une date d'expiration à un JWT avec le paramètre `exp`. Ne pas configurer de date limite est une mauvaise pratique.

Côté serveur, les tokens peuvent être révoqués de 2 manières différentes:

* par valeur : la valeur encodée en base64 du token
* par contenu : les informations décodées contenues dans le token

{% hint style="danger" %}
Si une simple vérification par contenu est faite, on peut modifier la valeur encodée de telle sorte que la valeur décodée ne soit pas altérée en jouant sur les caractères de la base64.

Si le serveur contient une liste noire de tokens encodés à ne plus accepter, on peut ainsi contourner l'accès car la valeur en base64 est différente. Il décode ensuite le token qui contient les informations valides.
{% endhint %}

### Modifier les caractères du jeton encodé

Les tokens sont composés de 3 parties encodées en base64. L'encodage utilisé pour les JWT est [base64url](https://fr.wikipedia.org/wiki/Base64#base64url) qui remplace respectivement les caractères `+` et `/` par `-` et `_`. Le caractère de padding reste `=` mais n'est pas utilisé pour les tokens.

Comme le montre le tableau suivant, la présence du padding (`=`) à la fin d'un mot n'empêche pas le décodage correct de la base64.

|   base64   |  ASCII  |
| :--------: | :-----: |
| `U2FsdXQ=` | `Salut` |
|  `U2FsdXQ` | `Salut` |

Si la révocation se base sur une simple vérification de contenu on peut :

1. prendre un token valide
2. ajouter du padding (`=`) à la signature
3. soumettre ce jeton

Si le serveur décode le token, il récupèrera les mêmes informations que si on avait pas ajouté de padding.

On peut aussi remplacer les `-` et les `_` par des `+` et `/` (seulement pour la signature).

{% hint style="danger" %}
Comme la signature utilise les autres champs encodés en base64, si on modifie l'en-tête ou le payload, la signature sera différente et le token invalide. Il ne faut donc modifier que la signature.
{% endhint %}
