Vol de jeton OAuth via une redirection ouverte
htStealing OAuth access tokens via an open redirect
Objectif du laboratoire
Ce laboratoire exploite une mauvaise validation du paramètre redirect_uri par le service OAuth.
L’objectif est d’utiliser une redirection ouverte présente sur l’application cliente pour exfiltrer le jeton d’accès OAuth de l’utilisateur administrateur, puis s’en servir pour récupérer sa clé API.
⚠️ Il n’est pas possible d’obtenir la clé API de l’admin simplement en se connectant à son compte via l’application cliente.
Identification de la redirection ouverte
Une redirection ouverte est présente dans la fonctionnalité de navigation entre articles du blog :

En remplaçant le paramètre path par une URL externe, la redirection est acceptée :
Le navigateur est bien redirigé, confirmant la vulnérabilité.

Analyse du flux OAuth
Lors de l’authentification via OAuth, la requête suivante est observée :

Le service OAuth refuse un redirect_uri totalement externe, mais il accepte une URL interne modifiée avec une traversée de chemin.

Contournement de la validation du redirect_uri
En utilisant ../ pour sortir du chemin /oauth-callback, il est possible de chaîner la redirection ouverte :

Cette URL est acceptée comme redirect_uri par le fournisseur OAuth.
Construction de l’URL malveillante OAuth
L’URL finale envoyée à la victime est :
Problème du fragment (#)
Le fragment d’URL n’est jamais envoyé au serveur lors d’une requête HTTP.

Il est donc nécessaire d’utiliser du JavaScript côté client pour capturer le jeton.

Capture du jeton avec JavaScript
Le script suivant est hébergé sur l’Exploit Server et envoyé à l’admin :

Si aucun fragment n’est présent, la victime est redirigée vers l’OAuth.
Si le fragment existe, le jeton est retransmis au serveur via la query string.

Exploitation du jeton OAuth
Le jeton volé permet d’interroger l’endpoint /me du fournisseur OAuth :

La réponse contient les informations du compte administrateur, y compris la clé API :

Mis à jour