Contournement d’authentification via oracle de chiffrement

Authentication bypass via encryption oracle

Description du laboratoire

Ce laboratoire présente une faille logique exposant un oracle de chiffrement côté serveur. En exploitant cette faiblesse, il est possible de forger une valeur chiffrée valide afin de contourner l’authentification, accéder au panneau d’administration et supprimer l’utilisateur carlos.

Identifiants fournis :

  • Utilisateur : wiener

  • Mot de passe : peter

Observation initiale

Sur la page de connexion, l’option “stay logged in” est disponible.

Lorsqu’elle est utilisée, une cookie chiffrée en Base64 est générée et stockée côté client.

Mise en évidence de l’oracle de chiffrement

Lorsqu’un commentaire valide est soumis, aucune réponse particulière n’est observée.

En revanche, si un commentaire provoque une erreur applicative (par exemple une adresse email invalide), le serveur :

  • renvoie un message d’erreur affiché à l’écran ;

  • génère une nouvelle cookie notification, chiffrée.

Le contenu affiché est par exemple :

Cela montre que :

  • le serveur déchiffre le contenu de la cookie notification ;

Le serveur agit donc comme un oracle de chiffrement et de déchiffrement.

  • le texte déchiffré est réinjecté dans la réponse HTML.

En injectant la valeur chiffrée de la cookie “stay logged in” dans la cookie notification, le serveur affiche son contenu en clair.

Le format observé est :

Cela correspond clairement à :

  • un nom d’utilisateur ;

  • un timestamp.

Forgery d’une identité administrateur

L’objectif est alors de faire chiffrer par le serveur la chaîne suivante :

Pour cela, cette valeur est injectée dans le champ vulnérable (commentaire/email invalide), ce qui provoque :

  • l’affichage du message d’erreur contenant cette chaîne ;

la génération d’une nouvelle cookie notification chiffrée, incluant le texte injecté.

Identification de l’algorithme de chiffrement

En tronquant arbitrairement la valeur chiffrée, le serveur retourne l’erreur suivante

Input length must be multiple of 16 when decrypting with padded cipher

Cela indique clairement l’utilisation de AES avec padding, fonctionnant par blocs de 16 octets.

Manipulation des blocs de chiffrement

Le problème rencontré est la présence de caractères de padding invalides en fin de message. Pour y remédier, la chaîne injectée est précédée de caractères de remplissage afin d’aligner correctement les blocs :

Une nouvelle cookie chiffrée est alors générée.

VQbs3ex4CbvKjTm0LM5wuZJqwlVboMZ2IzNuiTfVH6iHj9RZUT59d5kGoS64tVE5wWiEfmp6VbJG%2bb%2fNW5%2bblA%3d%3d

En supprimant les deux premiers blocs chiffrés (correspondant au remplissage), il reste uniquement les blocs contenant :

Cette valeur chiffrée finale est acceptée par le serveur.

Contournement de l’authentification

Étapes finales :

  1. Supprimer la cookie de session existante.

  2. Remplacer la valeur de la cookie “stay logged in” par la valeur chiffrée forgée.

  3. Rafraîchir la page.

Mis à jour