Rappel théorique

Une faille SSRF (Server-Side Request Forgery) survient lorsqu'une application effectue une requête réseau vers une URL fournie ou influencée par l'utilisateur, sans en contrôler la destination. Le serveur agit alors comme un proxy involontaire pour l'attaquant : celui-ci peut faire interroger par le serveur des ressources normalement inaccessibles depuis l'extérieur (réseau interne, services d'administration, métadonnées cloud, localhost...).

Exemple de code vulnérable

// "Aperçu d'URL" ou "import depuis une URL"
$contenu = file_get_contents($_GET['url']);
echo $contenu;

Un attaquant peut alors fournir ?url=http://127.0.0.1/admin pour faire afficher par le serveur une page d'administration interne qu'il ne pourrait pas atteindre directement.

Cibles classiques d'une SSRF

Mesures de protection

Démo vulnérable

Un "lecteur d'URL" qui récupère et affiche le contenu de n'importe quelle URL avec file_get_contents($_GET['url']).

Accéder à la démo vulnérable

Démo sécurisée

Même fonctionnalité, mais l'URL est validée : protocole autorisé, et adresse IP résolue vérifiée pour exclure les plages privées/réservées.

Accéder à la démo sécurisée

Service interne simulé

internal_admin.php simule un service d'administration interne (jeton d'API, statistiques). Dans ce TP local, il est servi par le même Apache que le reste de l'application - en production, il serait sur un hôte/port non exposé sur Internet, mais atteignable par le serveur applicatif via 127.0.0.1 ou le réseau interne.