Session Fixation (sessiefixatie) is een gevaarlijke aanvalstechniek waarbij een hacker de sessie-identificator (Session ID) van een slachtoffer vooraf bepaalt. Veel WooCommerce-websites maken gebruik van aangepaste inlogformulieren via shortcodes (zoals [woocommerce_my_account]) op specifieke landingspagina's. Als de onderliggende inloglogica de anonieme sessie niet vernieuwt op het moment dat een gebruiker inlogt, kan een aanvaller de controle over het klantaccount overnemen.

Het verloop van sessiefixatie bij shortcodes

Wanneer een anonieme bezoeker uw WooCommerce-shop bezoekt, genereert het systeem een unieke sessie om bijvoorbeeld de winkelwagen bij te houden. Deze sessie is gekoppeld aan een cookie in de browser.

  1. De fixatie: De aanvaller opent de webshop en kopieert zijn eigen sessie-cookie (bijv. wp_woocommerce_session_abc123).

  2. De valstrik: De aanvaller stuurt een link naar het slachtoffer waarbij dit specifieke sessie-ID via een script of URL-manipulatie wordt afgedwongen.

  3. De authenticatie: Het slachtoffer klikt op de link en logt in via het formulier dat door de WooCommerce-shortcode wordt gegenereerd.

Als de code de sessie-ID niet vernieuwt bij een succesvolle inlogpoging, wordt de bestaande sessie abc123xyz op de server simpelweg geüpgraded naar "Ingelogd als Klant X". Omdat de aanvaller deze ID al in zijn bezit had, heeft hij direct toegang tot alle accountgegevens, bestellingen en creditcard-tokens van het slachtoffer.

Hoe ontwikkelaars sessiefixatie voorkomen

De absolute remedie tegen sessiefixatie is het vernietigen van de oude sessie en het genereren van een gloednieuwe sessie op het exacte moment van authenticatie. Binnen WordPress wordt dit automatisch geregeld via de core, maar bij het gebruik van aangepaste AJAX-inlogfuncties in thema's moeten ontwikkelaars dit expliciet afdwingen:

PHP
 
function custom_ajax_login_handler() {
    // Valideer inloggegevens...
    $user = wp_authenticate($_POST['username'], $_POST['password']);

    if (!is_wp_error($user)) {
        // CRUCIAL: Vernietig de oude sessie om sessiefixatie te voorkomen
        WC()->session->destroy_session();

        // Stel de nieuwe authenticatie-cookies in
        wp_set_current_user($user->ID);
        wp_set_auth_cookie($user->ID, true);

        // Genereer een nieuwe WooCommerce-sessie voor de ingelogde klant
        WC()->session->set_customer_session_cookie(true);
        
        wp_send_json_success();
    }
}

Advies voor site-beheerders

  • Beperk caching op inlogpagina's: Zorg ervoor dat pagina's die het inlogformulier of de "/mijn-account/" shortcode bevatten, strikt zijn uitgesloten van elke vorm van paginacaching (zoals Varnish of e-commerce cache-plug-ins). Dit voorkomt dat sessie-headers per ongeluk tussen verschillende bezoekers worden gedeeld.