Essentiels de la sécurité Web : SSRF, CSRF et CORS expliqués
Dans le paysage Web moderne, la sécurité n’est pas seulement une fonctionnalité, c’est une fondation. À mesure que les applications deviennent plus interconnectées, comprendre les nuances de la gestion des requêtes à travers différents origines et serveurs est crucial pour tout développeur.
Aujourd’hui, nous plongeons dans trois concepts critiques que chaque développeur Web devrait maîtriser : SSRF, CSRF et CORS. Bien qu’ils puissent ressembler à une soupe à l’alphabet, ils représentent les premières lignes de la sécurité des applications Web.
1. SSRF (Server-Side Request Forgery)
La SSRF est une vulnérabilité où un attaquant peut forcer une application côté serveur à effectuer des requêtes HTTP vers un domaine arbitraire de son choix.
Comment ça marche
Imaginez une application Web qui prend une URL en entrée (par exemple, pour récupérer une photo de profil ou prévisualiser un lien) et effectue ensuite une requête vers cette URL depuis le serveur. Si l’application ne valide pas correctement cette URL, un attaquant pourrait fournir une adresse IP interne ou une adresse de bouclage (127.0.0.1).
Le serveur, agissant comme un proxy, pourrait alors récupérer des données sensibles à partir de services internes qui ne sont pas exposés sur l’Internet public, tels que :
- Métadonnées Cloud : Accès à
169.254.169.254sur AWS/GCP pour récupérer les identifiants IAM. - Panneaux d’administration internes : Accès à des outils internes comme Jenkins ou des tableaux de bord Kubernetes.
- Scan de ports : Découverte d’autres services fonctionnant sur le réseau interne.
Prévention
- Liste d’autorisation (Allowlisting) : N’autorisez que les requêtes vers une liste prédéfinie de domaines de confiance.
- Validation des entrées : Assurez-vous que l’URL utilise des protocoles autorisés (par exemple,
https://uniquement) et ne pointe pas vers des plages d’adresses IP internes. - Ségrégation du réseau : Assurez-vous que le serveur Web a un accès restreint aux ressources internes.
2. CSRF (Cross-Site Request Forgery)
La CSRF est une attaque qui trompe le navigateur d’une victime pour lui faire effectuer une action non souhaitée sur un autre site Web où la victime est actuellement authentifiée.
Comment ça marche
Cette attaque exploite le fait que les navigateurs incluent automatiquement les identifiants ambiants — comme les cookies de session — avec chaque requête vers un domaine.
- Un utilisateur se connecte à
bank.com. - L’utilisateur visite un site malveillant
evil.comdans un autre onglet. evil.comcontient un formulaire caché qui soumet une requêtePOSTàbank.com/transfer?amount=1000&to=attacker.- Le navigateur envoie la requête accompagnée du cookie de session
bank.comde l’utilisateur. bank.comvoit une session valide et traite le transfert.
Prévention
- Jetons Anti-CSRF : Incluez un jeton unique, secret et imprévisible dans chaque requête modifiant l’état. Le serveur vérifie ce jeton avant le traitement.
- Cookies SameSite : Définissez l’attribut
SameSitesur les cookies àStrictouLaxpour empêcher leur envoi lors de requêtes intersites. - En-têtes personnalisés : Pour les requêtes AJAX, exigez un en-tête personnalisé (par exemple,
X-Requested-With) qui ne peut pas être défini par un formulaire HTML standard.
3. CORS (Cross-Origin Resource Sharing)
Contrairement à SSRF et CSRF, le CORS n’est pas une vulnérabilité en soi, mais un mécanisme de sécurité. C’est un moyen pour les serveurs de dire au navigateur : “C’est d’accord pour que cette origine externe spécifique accède à mes ressources.”
Pourquoi il existe
Par défaut, les navigateurs appliquent la Politique de même origine (SOP), qui empêche un script sur un site de lire des données d’un autre site. Cela empêche evil.com de lire vos e-mails sur gmail.com.
Le CORS permet aux serveurs d’assouplir cette politique en toute sécurité. Lorsqu’une application Web effectue une requête cross-origin, le navigateur envoie un en-tête Origin. Le serveur répond avec Access-Control-Allow-Origin.
Mauvaises configurations courantes
- Origine générique (
*) : Autoriser toutes les origines. Bien que cela soit acceptable pour les API publiques, c’est dangereux si combiné avecAccess-Control-Allow-Credentials: true. - Reflet de l’origine : Définir dynamiquement l’origine autorisée en fonction de l’en-tête
Originsans validation. Cela contourne effectivement complètement la SOP.
Bonnes pratiques
- Soyez spécifique : N’autorisez que les domaines spécifiques qui ont besoin d’un accès.
- Évitez les identifiants si possible : Si votre API n’a pas besoin de cookies ou d’en-têtes d’autorisation, ne les autorisez pas.
- Utilisez un middleware de sécurité : Utilisez des bibliothèques bien testées pour gérer la configuration CORS au lieu de gérer les en-têtes manuellement.
Résumé comparatif
| Caractéristique | SSRF | CSRF | CORS |
|---|---|---|---|
| Cible | Ressources côté serveur | Actions côté client | Accès aux données via navigateur |
| Exploite | Confiance réseau du serveur | Comportement des cookies | Politique de même origine (mauvaise conf.) |
| Défense principale | Liste d’autorisation et validation | Jetons et Cookies SameSite | Configuration correcte des en-têtes |
Comprendre ces trois piliers de la sécurité Web est essentiel pour créer des applications modernes et robustes. En mettant en œuvre des stratégies de défense en profondeur, vous pouvez protéger à la fois l’infrastructure interne de votre serveur et les données privées de vos utilisateurs.
Restez en sécurité et bon codage !