Vol de jeton d’accès OAuth via une page proxy

Stealing OAuth access tokens via a proxy page

Objectif du laboratoire

Ce laboratoire met en œuvre un service OAuth permettant l’authentification via un réseau social. Une validation insuffisante côté fournisseur OAuth permet de rediriger le jeton d’accès vers une page arbitraire de l’application cliente.

L’objectif est :

  • d’identifier une vulnérabilité secondaire dans l’application cliente,

  • de l’utiliser comme page proxy pour exfiltrer le jeton d’accès OAuth de l’administrateur,

  • puis d’utiliser ce jeton pour récupérer l’API key de l’admin.

L’administrateur ouvrira tout contenu envoyé depuis le serveur d’exploitation et dispose déjà d’une session OAuth active.

Analyse de l’application cliente

On observe une zone de commentaires sous les articles du blog.

Lors du chargement du formulaire de commentaire, une requête GET est envoyée vers

Le formulaire est chargé dans une iframe, ce qui est visible dans le code source de la page du post :

Comportement JavaScript intéressant

Le formulaire embarque un script JavaScript révélateur :

Points clés :

  • Le script lit le fragment URL (#).

  • Il envoie son contenu à la page parente via postMessage.

  • Cela permet de faire remonter un jeton OAuth présent dans le fragment.

Le formulaire de commentaire peut donc servir de page proxy.

Exploitation via OAuth (flux implicite)

On modifie la redirection OAuth pour pointer vers le formulaire de commentaire :

Exemple de requête OAuth manipulée :

Après authentification, le serveur OAuth redirige vers :

  • /post/comment/comment-form#access_token=ykNiftpsUeqLcCU-YsLcTQV40mETdrpdDeEIn8TpxFU

Le jeton est donc exposé dans le fragment URL, puis transmis au parent via postMessage.

Payload envoyé à la victime

Depuis le serveur d’exploitation, on envoie le contenu suivant :

Fonctionnement :

  • L’iframe déclenche le flux OAuth implicite.

  • Le jeton est injecté dans le fragment URL.

  • Le formulaire de commentaire l’envoie via postMessage.

  • Le script le capture et l’exfiltre vers le serveur d’exploitation.

Récupération du jeton

Dans les logs du serveur d’exploitation, on observe :

Après décodage URL, le jeton est :

  • 0PVBpvJwVQWGtaF7uKFUxCNLayxgK5pbFrUPdEwZ5Qn

Accès à l’API avec le jeton volé

On utilise le jeton pour appeler l’endpoint /me du fournisseur OAuth

Réponse

Résultat

  • Le jeton OAuth de l’administrateur a été volé.

  • L’API key administrateur a été récupérée.

  • Le laboratoire est validé avec succès.

Mis à jour