Host Header Injection is een kwetsbaarheid waarbij de webserver of de applicatie de waarde van de HTTP Host header blindelings vertrouwt om absolute URL's te genereren. Binnen de WooCommerce checkout-omgeving introduceert dit een specifiek en zeer gevaarlijk risico: het manipuleren de retour-URL's (Return URL's) die naar betalingsproviders (zoals Mollie, PayPal of Stripe) worden verzonden. Dit kan door aanvallers worden misbruikt om klanten na een succesvolle betaling om te leiden naar een phishing-website.

Hoe het checkout-lek werkt

Wanneer een klant op de knop "Bestelling plaatsen" klikt, communiceert WooCommerce met de geselecteerde betaalprovider via een API-verzoek. WooCommerce moet de provider vertellen waar de klant naartoe moet worden gestuurd zodra de betaling is afgerond. Veel plug-ins genereren deze retour-URL dynamisch op basis van de huidige host-omgeving:

PHP
 
$return_url = 'https://' . $_SERVER['HTTP_HOST'] . '/checkout/order-received/';

Als de webserver niet correct is geconfigureerd en verzoeken met een gemanipuleerde HTTP Host-header accepteert, kan een aanvaller de checkout-procedure starten met een valse header: Host: phishing-shop.com

De betaal-plug-in stuurt de klant door naar de legitieme bankomgeving (bijv. iDEAL of creditcard-omgeving). De klant voert zijn betaling veilig uit. Echter, zodra de betaling is voltooid, stuurt de bank de klant terug naar de opgegeven retour-URL: https://phishing-shop.com/checkout/order-received/. De klant belandt op de website van de hacker, die daar een melding toont zoals: "Fout bij verwerking van de betaling. Vul uw gegevens opnieuw in om annulering te voorkomen".

Hoe ontwikkelaars retour-URL's beveiligen

Ontwikkelaars van WooCommerce betaalmodules moeten vermijden om $_SERVER['HTTP_HOST'] rechtstreeks te gebruiken. WordPress heeft een ingebouwde functie die altijd de betrouwbare, in de database geconfigureerde site-URL retourneert: home_url() of site_url().

PHP
 
// ONVEILIGE AANPAK
$return_url = 'https://' . $_SERVER['HTTP_HOST'] . '/checkout/order-received/';

// VEILIGE AANPAK
$return_url = wc_get_endpoint_url( 'order-received', '', wc_get_checkout_url() );

De functie wc_get_checkout_url() gebruikt intern home_url(), wat betekent dat de gegenereerde link altijd gebaseerd is op de hardcoded instellingen van de webshop en immuun is voor Host Header manipulatie.

Maatregelen voor site-beheerders

  • Fixeer uw site-URL: Zorg ervoor dat de URL's van uw webshop hardcoded zijn vastgelegd in uw wp-config.php via define('WP_HOME', '...') en define('WP_SITEURL', '...').

  • Serverbeveiliging: Configureer uw webserver (Nginx of Apache) zo dat deze uitsluitend reageert op verzoeken die exact overeenkomen met uw legitieme domeinnaam. Alle verzoeken met een onbekende Host-header moeten direct worden geweigerd met een 400 of 444 statuscode.