Cross-Site Scripting (XSS) is een bekende dreiging via invoervelden zoals reacties of zoekbalken. Een minder bekend, maar minstens zo gevaarlijk risico bevindt zich in het beheer van productgegevens zelf. Wanneer een aanvaller erin slaagt om toegang te krijgen totdat een account met lagere rechten (zoals een externe leverancier of een 'Shop Manager'), kan hij Stored XSS-malware injecteren via productattributen, variaties of labels. Deze code wordt vervolgens uitgevoerd in de browser van elke klant die het product bekijkt.

Het mechanisme van Attribuut-gebaseerde XSS

WooCommerce stelt winkeliers in staat om attributen (zoals "Materiaal" of "Afmetingen") aan te maken. Deze attributen worden vaak dynamisch weergegeven op de productpagina onder het tabblad "Extra informatie".

Als een Shop Manager-account wordt gekaapt via een zwak wachtwoord, kan de aanvaller een nieuw attribuut aanmaken met een kwaadaardige payload als naam of waarde: Materiaal: <svg onload=alert(document.cookie)>

Als het WordPress-thema de productattributen op de frontend weergeeft met behulp van een onveilige functie (zoals het direct printen van de ruwe data zonder escaping), zal de browser van elke bezoeker het script uitvoeren. Omdat de code is opgeslagen in de database, blijft het lek actief totdat het attribuut handmatig wordt verwijderd of gecorrigeerd.

Gevaren voor de Checkout en Klanten

Aangezien productattributen vaak ook worden meegestuurd naar de winkelwagen, de checkout-pagina en de PDF-facturen, kan het geïnjecteerde script zich verspreiden naar kritieke delen van de webshop. Eenmaal actief op de checkout-pagina, kan het script fungeren als een creditcard-skimmer (Magecart-aanval) en alle betalingsgegevens van klanten ongemerkt doorsturen naar de server van de hacker.

Hoe ontwikkelaars XSS in thema's voorkomen

Thema-ontwikkelaars moeten ervoor zorgen dat ze bij het aanpassen van WooCommerce-sjablonen (templates) altijd strikte output-escaping toepassen. Gebruik bij het weergeven van productattributen functies zoals esc_html() of wp_kses().

PHP
 
// ONVEILIGE WEERGAVE IN EEN CUSTOM THEMA
echo $attribute['value']; 

// VEILIGE WEERGAVE
echo esc_html($attribute['value']);

Als het attribuut HTML-opmaak moet bevatten (bijvoorbeeld een link naar een maattabel), gebruik dan wp_kses() met een specifieke array van toegestane tags:

PHP
 
$allowed_tags = array(
    'a' => array(
        'href'  => array(),
        'title' => array(),
    )
);
echo wp_kses($attribute['value'], $allowed_tags);

Aanbevelingen voor webshopeigenaren

  • Beperk de rechten van Shop Managers: Gebruik plug-ins zoals User Role Editor om de rechten van de rol 'Shop Manager' in te perken. Zorg ervoor dat zij geen unfiltered HTML mogen publiceren (unfiltered_html capaciteit moet uitstaan).

  • Bestandsintegriteit: Gebruik beveiligingsplug-ins die waarschuwen als er plotseling wijzigingen plaatsvinden in de database-tabellen die te maken hebben mit productopties en attributen (wp_woocommerce_attribute_taxonomies).