Sécurité web

SSRF

Définition

Une faille SSRF (Server-Side Request Forgery, falsification de requête côté serveur) permet à un attaquant de faire envoyer par le serveur des requêtes vers l’adresse de son choix : services internes, adresse de métadonnées du cloud ou le serveur lui-même, normalement inaccessibles depuis Internet.

SSRF, Sécurité web

Dans une faille SSRF, l’attaquant ne vise pas directement la machine qui l’intéresse : il se sert du site comme intermédiaire. Le serveur web se trouve souvent dans un réseau où il peut joindre des services que personne ne devrait atteindre depuis Internet. Si une fonction du site télécharge une adresse fournie par l’utilisateur sans vérifier la destination, l’attaquant peut lui faire interroger ces services à sa place. L’OWASP a fait de la SSRF une catégorie à part de son Top 10 2021 (A10), et le MITRE la référence sous CWE-918.

Comment fonctionne une attaque SSRF

Les fonctions concernées sont celles qui vont chercher une URL : importer une image depuis une adresse, générer un aperçu de lien, appeler un webhook, vérifier un flux. L’attaquant y glisse une adresse interne au lieu d’une adresse publique :

  • l’adresse de métadonnées du cloud 169.254.169.254, utilisée par AWS, Azure et Google Cloud, qui peut révéler des identifiants et des jetons d’accès ;
  • le serveur lui-même (localhost, 127.0.0.1), par exemple un panneau d’administration ou une base de données qui n’écoute qu’en local ;
  • le réseau privé (10.0.0.0/8, 192.168.0.0/16…), pour cartographier les machines et les ports ouverts ;
  • d’autres protocoles que HTTP, comme file:// ou gopher://, quand la bibliothèque utilisée les accepte.
Déroulement d’une attaque SSRF en cinq étapes, l’attaquant fournit l’adresse de métadonnées du cloud à une fonction d’import d’image par URL, le serveur émet la requête depuis l’intérieur du réseau, le service interne répond avec métadonnées ou jetons, la réponse revient à l’attaquant directement ou par un message d’erreur, et la parade consiste à valider la destination (liste d’hôtes autorisés, http et https seulement, adresses privées refusées, redirections contrôlées)
Le site devient un relais : la requête part de l’intérieur du réseau, là où les pare-feu réseau laissent souvent tout passer.

La réponse ne revient pas toujours en clair : on parle de SSRF « aveugle » quand l’attaquant ne voit qu’un message d’erreur ou un temps de réponse, ce qui suffit pourtant à savoir si un port est ouvert.

Vidéo (en anglais) : « SSRF in 100 seconds » (Intigriti)

Comment s’en protéger

  • Liste d’autorisation : quand les destinations sont connues (une API précise), n’acceptez qu’elles.
  • http et https seulement, sur des ports standards.
  • Refuser les adresses internes après résolution DNS, et vérifier aussi chaque redirection : un nom de domaine public peut pointer vers une adresse privée.
  • Côté hébergement : segmentation réseau et, sur AWS, passage à IMDSv2, que l’OWASP recommande pour limiter le vol de métadonnées.

Pour WordPress : wp_safe_remote_get et les pingbacks

WordPress fournit les bons outils, à condition de les utiliser. wp_safe_remote_get() et ses variantes valident l’URL et chaque URL de redirection avec wp_http_validate_url() : seuls http et https passent, les identifiants dans l’URL sont refusés, les adresses de bouclage et privées sont rejetées, et un port explicite doit être 80, 443 ou 8080. À l’inverse, wp_remote_get() ne fait pas cette validation par défaut : une extension qui l’utilise avec une adresse fournie par un visiteur s’expose. Le filtre http_request_host_is_external permet d’autoriser un hôte interne précis ; l’ouvrir à tout annule la protection.

$reponse = wp_safe_remote_get( esc_url_raw( $url_fournie ), array( 'timeout' => 5 ) );
if ( is_wp_error( $reponse ) ) {
    return; // URL refusée ou injoignable
}

Le cœur lui-même a connu ce problème : avant WordPress 3.5.1, le pingback de XML-RPC permettait d’envoyer des requêtes vers des serveurs internes et de scanner des ports (CVE-2013-0235). Le pingback utilise désormais wp_safe_remote_get(), mais il reste une fonction qui fait émettre des requêtes par votre serveur à la demande d’un tiers. Si vous ne vous en servez pas, le module Durcissement de WP Masquerade bloque gratuitement les pingbacks et XML-RPC ; notre article sur XML-RPC aide à vérifier qu’aucun service n’en dépend. Pour le reste, la SSRF se corrige dans le code de l’extension concernée, et un pare-feu applicatif peut filtrer les adresses internes les plus évidentes en attendant.

Pour aller plus loin

  • Article Comment désactiver XML-RPC sur WordPress : risques, usages et bonne méthode
  • Page Durcissement de WordPress

Sources

  1. OWASP Cheat Sheet Series : Server-Side Request Forgery Prevention (lien externe, nouvel onglet)
  2. MITRE CWE-918 : Server-Side Request Forgery (SSRF) (lien externe, nouvel onglet)
  3. WordPress Developer Resources : wp_http_validate_url() (lien externe, nouvel onglet)
  4. CVE Record : CVE-2013-0235 (lien externe, nouvel onglet)

Toutes les définitions

La sécurité WordPress, sans le bruit

Un e-mail quand ça compte : nouvelles attaques observées, mises à jour de l’extension et guides pratiques. Pas de spam, désinscription en un clic.

Commencez gratuitement, passez à Pro quand vous êtes prêt

La version gratuite masque déjà WordPress et déplace la page de connexion. Pro ajoute alias, double authentification et surveillance.