Sécurité PHP expliquée · défensif
SSRF en PHP : de quoi s’agit-il et comment corriger
Aperçus de liens, webhooks, import d’images ou génération de PDF font récupérer une URL par le serveur. Si le visiteur contrôle cette URL, il peut viser des endroits qu’il ne peut pas atteindre lui-même.
Dernière mise à jour
De quoi s’agit-il
Votre serveur se trouve généralement dans un réseau de confiance. Ses requêtes atteignent bases de données, interfaces d’administration, autres microservices et services de métadonnées cloud qui délivrent des identifiants. La SSRF transforme toute fonction de récupération d’URL en proxy vers ce réseau. MITRE la classe en CWE-918 et l’OWASP lui consacre une fiche de prévention.
Comment le détecter
- Cherchez
curl_setopt(... CURLOPT_URL ...),file_get_contents($var),fopen($var),get_headers()et les clients HTTP comme Guzzle qui prennent une URL issue d’une entrée. - Listez toutes les fonctions qui récupèrent du contenu distant : webhooks, import d’avatar ou d’image, aperçus de liens, lecteurs de flux, rendu PDF ou capture, XML avec entités externes.
- Examinez le trafic sortant du serveur web ; des requêtes inattendues vers
169.254.169.254,localhostou des plages privées sont un signal d’alerte.
Comment le corriger
- N’autorisez que les hôtes et schémas réellement nécessaires (souvent uniquement
https) et refusez le reste. - Résolvez vous-même l’hôte, refusez les adresses privées, de bouclage et link-local, puis connectez-vous à cette IP résolue pour que le DNS ne change pas entre contrôle et usage.
- Désactivez le suivi des redirections (
CURLOPT_FOLLOWLOCATIONà false) et limitez les protocoles avecCURLOPT_PROTOCOLS. - Dans le cloud, exigez des jetons de session pour les métadonnées d’instance (par exemple AWS IMDSv2) et filtrez le trafic sortant.
Vérifications en lecture seule et modèles sûrs
# Find server-side fetches that may take a user-supplied URL (read-only)
grep -rnE "(curl_setopt.*CURLOPT_URL|file_get_contents\s*\(\s*\$|fopen\s*\(\s*\$)" --include=*.php . | grep -v /vendor/
// Allowlist hosts and schemes before fetching
$u = parse_url($url);
$allowed = ['api.example.com'];
if (($u['scheme'] ?? '') !== 'https' || !in_array($u['host'] ?? '', $allowed, true)) {
throw new RuntimeException('URL not allowed');
}
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);Bloquer 127.0.0.1 suffit-il ?
Non. Notations d’IP alternatives, IPv6, noms DNS pointant vers des adresses privées et redirections contournent les listes noires simples. L’OWASP recommande les listes blanches.
Un WAF arrête-t-il la SSRF ?
Il repère certains motifs mais ignore quels hôtes internes comptent pour vous. Corrigez dans le code.
Autres classes de vulnérabilités PHP
- Injection d’objets PHP : de quoi s’agit-il et comment corrigerL’injection d’objets PHP survient quand une entrée contrôlée par l’utilisateur atteint unserialize(), qui peut instancier des objets dont les méthodes magiques exécutent une logique choisie par l’attaquant.
- Inclusion de fichiers PHP (LFI/RFI) : de quoi s’agit-il et comment corrigerL’inclusion de fichiers survient quand une entrée utilisateur contrôle le chemin passé à include ou require, ce qui permet de lire des fichiers locaux (LFI) ou, avec allow_url_include activé, d’exécuter du code distant (RFI).
- XSS en PHP : de quoi s’agit-il et comment s’en protégerLe cross-site scripting (XSS) survient quand une page PHP affiche dans du HTML des données contrôlées par l’utilisateur sans échappement, si bien que le script d’un attaquant s’exécute dans le navigateur d’autres visiteurs.
- Exposition de phpinfo() : pourquoi c’est important et comment corrigerUne page phpinfo() publique révèle la version exacte de PHP, les modules chargés, les chemins et souvent des variables d’environnement ou des secrets, ce qui aide les attaquants à cibler des failles comme PHP2Shell.
Sources
Les liens externes quittent ce site. Nous n’hébergeons aucun code d’exploitation.
- CWE-918: Server-Side Request Forgery (SSRF) — MITRE CWE
- Server-Side Request Forgery Prevention Cheat Sheet — OWASP Cheat Sheet Series