Cross-Site Request Forgery (CSRF) is een aanvalsmethode waarbij een administrator wordt misleid om onbewust een administratieve actie uit te voeren op zijn eigen website, aangestuurd vanaf een externe, kwaadaardige pagina. Binnen het WooCommerce-beheerpaneel vormen de schakelopties voor betaalmethoden (zoals het in- of uitschakelen van PayPal of Stripe via AJAX) een geliefd doelwit voor CSRF als de ontwikkelaar heeft nagelaten om Nonces te implementeren.

Hoe een CSRF-aanval op betaalinstellingen verloopt

WooCommerce maakt in het instellingenscherm intensief gebruik van AJAX-schakelaars om instellingen direct op te slaan zonder de pagina te herladen. Een onveilig gecodeerde plug-in voor een betaalmethode kan een AJAX-handler registreren die luistert naar een verzoek om de gateway te deactiveren of om de instellingen te wijzigen:

PHP
 
add_action('wp_ajax_toggle_my_gateway', 'toggle_gateway_callback');

function toggle_gateway_callback() {
    // ONVEILIG: Geen controle op Nonce!
    $status = $_POST['status'];
    update_option('woocommerce_my_gateway_settings', array('enabled' => $status));
    wp_send_json_success();
}

Als een administrator is ingelogd op de webshop en in een ander tabblad een gecompromitteerde website bezoekt, kan die externe site een onzichtbaar JavaScript-verzoek (via een verborgen formulier of fetch-opdracht) naar uw webshop sturen. Omdat de administrator is ingelogd, voert de server het verzoek uit en schakelt de veilige betaalmethode uit. De aanvaller kan dit misbruiken om de shop plat te leggen of om de webshop te dwingen terug te vallen op een onveiligere betaalmethode.

Hoe ontwikkelaars CSRF in AJAX voorkomen

Elk administratief verzoek in WordPress dat instellingen wijzigt, moet verplicht worden beveiligd met een cryptografisch token, een zogenaamde Nonce.

PHP
 
function toggle_gateway_callback() {
    // VEILIG: Controleer altijd de Nonce vóór verwerking
    check_ajax_referer('my_gateway_security_nonce', 'security');

    if (!current_user_can('manage_woocommerce')) {
        wp_send_json_error('Niet geautoriseerd', 403);
    }

    $status = sanitize_text_field($_POST['status']);
    // Update instellingen...
    wp_send_json_success();
}

Tips voor webshopeigenaren

  • Log uit bij inactiviteit: Laat uw WordPress-dashboard niet onnodig openstaan in uw browser als u andere websites bezoekt.

  • Gebruik een firewall: Een Web Application Firewall (WAF) herkent vaak cross-site verzoeken die gericht zijn op administratieve WordPress-paden (/wp-admin/admin-ajax.php) en blokkeert deze verdachte verzoeken automatisch.