Session Fixation (sessiefixatie) is een aanvalstechniek waarbij een kwaadwillende de sessie-identificator (Session ID) van een slachtoffer vooraf bepaalt (fixeert). Als een WooCommerce-webshop kwetsbaar is voor sessiefixatie, kan een aanvaller een geldige sessie aanmaken, zorgen dat het slachtoffer deze sessie gaat gebruiken, en vervolgens direct toegang krijgen tot het account van het slachtoffer zodra deze inlogt of zijn creditcardgegevens invoert.
Het verloop van een Session Fixation aanval
Het basisscenario van een sessiefixatie-aanval verloopt in drie stappen:
-
De fixatie: De aanvaller bezoekt de WooCommerce-webshop en krijgt van de server een anoniem sessie-cookie toegewezen (bijvoorbeeld
session_id=abc123xyz). -
De valstrik: De aanvaller construeert een link naar de webshop en dwingt via een URL-parameter of een klein XSS-script af dat de browser van het slachtoffer ditzelfde sessie-cookie gaat gebruiken. De aanvaller stuurt het slachtoffer naar de inlogpagina:
https://uwshop.nl/mijn-account/. -
De overname: Het slachtoffer typt zijn gebruikersnaam en wachtwoord in en logt succesvol in. Als de kwetsbare WooCommerce-extensie bij het inloggen het anonieme sessie-cookie niet vernieuwt, wordt de status van de sessie
abc123xyzop de server nu veranderd naar "Geauthenticeerd als Klant X".
Omdat de aanvaller de waarde abc123xyz al wist, verfrist hij simpelweg zijn eigen browser met dit cookie. Hij is nu direct ingelogd als het slachtoffer, zonder dat hij het wachtwoord hoeft te weten.
Gevaren voor de winkelwagen en checkout
Binnen WooCommerce kan sessiefixatie er ook toe leiden dat een aanvaller de winkelwagen van een slachtoffer kan inzien en manipuleren. De aanvaller kan dure producten aan de mand toevoegen of het afleveradres inzien zodra het slachtoffer naar de checkout gaat.
Hoe ontwikkelaars Session Fixation voorkomen
De absolute verdediging tegen sessiefixatie is het verplichten van sessie-regeneratie bij elke statusverandering van de gebruiker. Dit betekent dat op het exacte moment dat een gebruiker inlogt, uitlogt of zijn wachtwoord wijzigt, het oude sessie-cookie onmiddellijk ongeldig moet worden gemaakt en er een gloednieuw cookie moet worden gegenereerd.
WordPress regelt dit standaard uitstekend voor de core-inlogfuncties via de PHP-functie wp_set_auth_cookie(). Echter, als u als ontwikkelaar een aangepast sessie-systeem bouwt voor een WooCommerce-koppeling of een extern klantportaal, moet u dit handmatig afdwingen:
// Zodra de gebruiker succesvol is geauthenticeerd
if ( $user_authenticated ) {
// Vernietig de oude anonieme sessie
WC()->session->destroy_session();
// Genereer een gloednieuwe, veilige sessie voor de ingelogde gebruiker
WC()->session->set_customer_session_cookie(true);
}
Advies voor site-beheerders
-
Controleer cache-instellingen: Soms veroorzaken slecht geconfigureerde server-caches (zoals Varnish of Nginx FastCGI cache) onbedoeld sessiefixatie doordat ze de
Set-Cookieheaders van de ene bezoeker cachen en serveren aan de volgende bezoeker. Zorg ervoor dat pagina's zoals/mijn-account/en/checkout/strikt zijn uitgesloten van elke vorm van server-caching.
