Server-Side Request Forgery (SSRF) is een kwetsbaarheid waarbij een aanvaller misbruik maakt van de serverinfrastructuur om verzoeken te sturen naar interne of externe netwerken. Binnen WooCommerce-omgevingen bevindt zich een specifieke vector in het beheer van Webhooks. Wanneer een beheerder of een gekaapte integratie een nieuwe webhook aanmaakt, biedt WooCommerce een functionaliteit om de doel-URL te testen via een zogeheten "Pingback". Als dit endpoint niet strikt is geïsoleerd, kan het fungeren als een gevaarlijke SSRF-vector.

Het mechanisme van Webhook SSRF

Wanneer een webhook wordt geconfigureerd in WooCommerce via Instellingen > Geavanceerd > Webhooks, voert het systeem een initiële validatie uit om te controleren of de opgegeven URL actief is en reageert. Dit proces wordt programmatisch afgehandeld via de klasse WC_Webhook.

Als een aanvaller met lagere dashboardrechten (zoals een Shop Manager) een webhook aanmaakt en de doel-URL manipuleert naar een intern IP-adres, zoals http://192.168.1.100:22 of http://127.0.0.1:3306, dwingt hij de WooCommerce-server om verbinding te maken met deze interne poorten (SSH en MySQL).

PHP
 
// Kwetsbare logica in klantspecifieke extensies die de core omzeilen:
$target_url = $_POST['webhook_delivery_url'];
$response = wp_remote_get($target_url); // ONVEILIG: Staat interne IP-adressen toe

De server zal proberen het verzoek uit te voeren. Aan de hand van de foutmeldingen (bijvoorbeeld een time-out versus een directe weigering) kan de aanvaller het volledige interne netwerk achter de firewall in kaart brengen. In cloudomgevingen kan dit worden misbruikt om de gevoelige metadata van de server op te vragen via het vaste IP-adres 169.254.169.254.

Hoe ontwikkelaars Webhook SSRF voorkomen

De WordPress-core bevat een specifieke functie die speciaal is ontworpen om SSRF bij uitgaande verzoeken te elimineren: wp_safe_remote_get() en wp_safe_remote_post(). Deze functies controleren de doel-URL en blokkeren resoluut elk verzoek dat gericht is op lokale of private IP-bereiken.

Ontwikkelaars die de webhook-functionaliteit van WooCommerce uitbreiden, moeten deze veilige functies consistent gebruiken:

PHP
 
// VEILIGE AANPAK
$target_url = esc_url_raw($_POST['webhook_delivery_url']);
$response = wp_safe_remote_get($target_url); // Veilig: blokkeert private IP's automatisch

if (is_wp_error($response)) {
    // Verzoek geweigerd of onbereikbaar
}

Advies voor site-beheerders

  • Beperk toegang tot webhook-beheer: Zorg ervoor dat de rol 'Shop Manager' geen rechten heeft om webhooks aan te maken of te wijzigen. Dit recht moet exclusief voorbehouden blijven aan de hoofd-Administrator.

  • Gebruik netwerk-firewalls: Configureer uw serverfirewall (iptables of ufw) zo dat de webservergebruiker (www-data) geen uitgaande verbindingen mag opzetten naar het lokale netwerk of de loopback-interface (127.0.0.1), tenzij strikt noodzakelijk voor de databasekoppeling.