SSRF via l’enregistrement dynamique de client OpenID

SSRF via OpenID dynamic client registration

Objectif du laboratoire

Ce laboratoire exploite une fonctionnalité d’enregistrement dynamique de clients OpenID. Certaines données fournies par le client sont utilisées de manière non sécurisée par le service OAuth, ce qui ouvre la porte à une SSRF.

L’objectif est d’exploiter cette faille pour accéder à l’endpoint interne suivant et récupérer la clé secrète d’accès cloud du fournisseur OAuth :

Accès initial

On peut se connecter avec un compte utilisateur standard :

  • Identifiant : wiener

  • Mot de passe : peter

Découverte OpenID

En analysant le flux OAuth, on identifie l’endpoint de configuration OpenID standard :

Cette ressource expose l’ensemble des endpoints utilisés par le fournisseur OAuth, notamment :

  • authorization_endpoint

  • token_endpoint

  • userinfo_endpoint

  • registration_endpoint

Le champ clé ici est :

Il permet l’enregistrement dynamique de nouveaux clients.

Enregistrement d’un client OAuth

On intercepte une requête vers /reg et on la transforme en requête POST avec le header :

Un enregistrement minimal fonctionne avec un JSON très simple :

Le serveur répond en créant une nouvelle application OAuth et retourne notamment :

  • client_id

  • client_secret

  • registration_client_uri

  • registration_access_token

Cela confirme que l’enregistrement dynamique est actif et peu restrictif.

Injection SSRF via logo_uri

Le champ logo_uri, destiné à charger une image associée au client, est particulièrement intéressant. Il est récupéré côté serveur sans validation stricte de l’URL.

On enregistre alors un nouveau client avec un logo_uri pointant vers l’IP interne AWS :

Le serveur accepte la requête et retourne un nouveau client_id.

Accès au logo du client

Chaque client dispose d’un endpoint permettant de récupérer son logo :

En utilisant le client_id obtenu précédemment :

Exfiltration des métadonnées AWS

La réponse ne contient pas une image, mais directement les credentials IAM internes :

Le SecretAccessKey correspond à la valeur attendue pour valider le laboratoire.

Mis à jour