Server-Side Request Forgery (SSRF) is een kwetsbaarheid waarbij een aanvaller de server van een website kan dwingen om HTTP-verzoeken te sturen naar een willekeurige bestemming. Binnen WooCommerce komt dit risico vaak voor bij plug-ins die afbeeldingen via een URL importeren, webhooks configureren of communiceren met externe API's van verzenddiensten. Omdat het verzoek afkomstig is van de vertrouwde server zelf, kan een aanvaller hiermee de beveiliging omzeilen en toegang krijgen tot systemen die normaal gesproken achter een firewall verborgen zijn.
Het mechanisme van SSRF
Stel dat een WooCommerce-plug-in een functie heeft waarmee winkeliers een productafbeelding kunnen toevoegen door de URL van de afbeelding op te geven:
$image_url = $_POST['image_url'];
$response = wp_remote_get($image_url);
Een aanvaller kan in plaats van een legitieme afbeelding-URL een intern IP-adres opgeven, zoals http://127.0.0.1:8080/admin of http://192.168.1.50/internal-api. De server zal het verzoek braaf uitvoeren. Als er op de achtergrond een onbeveiligde database of beheerpaneel draait op de server (die alleen via localhost toegankelijk hoort te zijn), kan de aanvaller via de webshop commando's uitvoeren op dat interne systeem.
In cloudomgevingen (zoals AWS, Google Cloud of DigitalOcean) is SSRF extra gevaarlijk. Aanvallers kunnen hiermee het speciale metadata-endpoint van de cloudprovider aanroepen om tijdelijke API-sleutels en server-tokens te stelen.
SSRF voorkomen in WordPress-code
WordPress biedt uitstekende ingebouwde functies om SSRF-aanvallen tegen te gaan. In plaats van standaard PHP-functies of generieke wp_remote_get() aanroepen op ongecontroleerde invoer, moeten ontwikkelaars gebruikmaken van de functie wp_safe_remote_get().
De functie wp_safe_remote_get() controleert de doel-URL vóórdat het verzoek wordt verzonden. Het blokkeert automatisch verzoeken naar lokale IP-adressen (127.0.0.1, localhost) en private subnetten (zoals 10.0.0.0/8 of 192.168.0.0/16).
// ONVEILIG
$response = wp_remote_get($user_input_url);
// VEILIG
$response = wp_safe_remote_get($user_input_url);
Daarnaast is het raadzaam om invoer-URL's te valideren met esc_url_raw() en de toegestane poorten te beperken tot uitsluitend poort 80 (HTTP) en 443 (HTTPS).
Maatregelen voor site-beheerders
-
Netwerksegmentatie: Zorg ervoor dat uw webserver zich in een geïsoleerd netwerk bevindt en geen directe toegang heeft tot andere kritieke bedrijfssystemen of interne databases, tenzij strikt noodzakelijk.
-
Gebruik een cloud-firewall: Configureer de firewall van uw cloudprovider zo dat de webserver geen toegang heeft tot het interne metadata-endpoint, tenzij de applicatie dit specifiek vereist.
-
WAF-bescherming: Moderne Web Application Firewalls detecteren en blokkeren HTTP-parameters die overduidelijk verwijzen naar interne IP-adressen of cloud-metadata URL's.
