WordPress beschikt over een fantastische ingebouwde functie genaamd oEmbed. Hiermee kunnen beheerders en (afhankelijk van de instellingen) klanten eenvoudig media insluiten (zoals YouTube-video's, tweets of SoundCloud-fragmenten) door simpelweg de URL van de media in de teksteditor te plakken. WordPress stuurt vervolgens op de achtergrond een verzoek naar de provider van de media om de juiste embed-code op te halen. Dit mechanisme kan echter door geraffineerde aanvallers worden misbruikt voor Server-Side Request Forgery (SSRF), waardoor uw server als springplank dient voor aanvallen op interne netwerken.
Hoe oEmbed evolueert tot een SSRF-lek
Wanneer een gebruiker een URL plaatst, probeert de WordPress-core via het bestand class-wp-oembed.php de oEmbed-provider te achterhalen. Dit gebeurt op basis van een lijst met vertrouwde providers (zoals youtube.com). Echter, WordPress staat ook toe dat plug-ins en thema's nieuwe providers registreren, of dat er gezocht wordt naar oEmbed-links in de HTML-headers van de opgegeven URL (Discovery).
Als een WooCommerce-plug-in (bijvoorbeeld een geavanceerd reviewsysteem waarmee klanten video's bij hun beoordeling kunnen plaatsen) oEmbed Discovery heeft ingeschakeld zonder restricties, kan een aanvaller een URL opgeven die naar het interne netwerk van de server verwijst: https://localhost:8080/secret-rest-api
De webserver zal via zijn eigen interne IP proberen verbinding te maken met poort 8080 om de oEmbed-data te lezen. De aanvaller kan de reactietijd van de server of de foutmeldingen analyseren om te achterhalen welke poorten openstaan op de server (Port Scanning) of om interne cloud-metadata te exfiltreren.
Technische mitigatie voor ontwikkelaars
Sinds enkele jaren heeft WordPress de beveiliging rondom oEmbed aangescherpt, maar bij het bouwen van specifieke WooCommerce-extensies moeten ontwikkelaars alert blijven.
-
Schakel Discovery uit voor onbekende gebruikers: Zorg ervoor dat de parameter
wp_oembed_add_discovery_linksalleen actief is voor gebruikers met administratieve rechten. -
Gebruik HTTP-filtering: Maak gebruik van de filter
http_request_argsom te controleren of het oEmbed-verzoek niet naar een privaat IP-adres (zoals192.168.x.xof10.x.x.x) wordt gestuurd.
add_filter('http_request_args', 'restrict_oembed_internal_ips', 10, 2);
function restrict_oembed_internal_ips($r, $url) {
// Logica om te controleren of de URL naar een intern netwerk verwijst
// WordPress doet dit grotendeels al bij wp_safe_remote_get()
return $r;
}
Praktische stappen voor site-beheerders
-
Beperk invoervelden in reviews: Zorg ervoor dat klanten in productbeoordelingen geen rijke HTML of willekeurige URL's kunnen invoeren. Beperk het reviewveld tot platte tekst via de WooCommerce-instellingen.
-
Monitoor uitgaand verkeer: Configureer de firewall van uw server (of de beveiligingsregels van uw hostingprovider) zo dat de webserver geen uitgaande verbindingen mag opzetten naar ongebruikelijke poorten of interne IP-adressen.
