Cross-Site Scripting (XSS) is een constante bedreiging voor e-commerce platformen. Een van de meest geraffineerde plekken waar Stored XSS zich kan verschuilen binnen WooCommerce, is in de Custom Data van winkelwagen-items. Wanneer plug-ins klanten toestaan om extra tekst (zoals een naam voor een gravure of een felicitatieboodschap) aan een product toe te voegen, wordt deze data opgeslagen in de sessie van de winkelwagen. Als deze gegevens onveilig worden gerenderd in de winkelmand of de checkout, ligt een XSS-aanval op de loer.

Het mechanisme van Cart XSS

Wanneer een klant tekst invoert op de productpagina, voegt WooCommerce dit item toe aan de winkelwagen via de array $cart_item_data. Deze data reist mee naar de winkelwagenpagina (/winkelmand/) en de checkout-pagina.

Als een aanvaller kwaadaardige JavaScript-code invoert in het tekstveld op de productpagina:

HTML
 
<script>alert(document.cookie)</script>

En de plug-in die verantwoordelijk is voor het tonen van deze custom data in het winkelwagenoverzicht gebruikt de volgende onveilige logica:

PHP
 
// Kwetsbare code in een thema-sjabloon:
echo '<div class="custom-cart-data">' . $cart_item['custom_engraving_text'] . '</div>';

Dan zal de browser van de klant (en later ook van de administrator in het orderbeheer) de code uitvoeren. Dit type XSS is bijzonder gevaarlijk omdat het direct invloed heeft op de betalingsomgeving. Een aanvaller kan het script gebruiken om de velden van de payment gateway te manipuleren of om creditcardgegevens te onderscheppen (skimming).

Hoe ontwikkelaars Cart XSS voorkomen

De invoer moet zowel bij het toevoegen aan de winkelwagen worden gesaniseerd, als bij het weergeven op de frontend worden ge-escaped.

Ontwikkelaars moeten gebruikmaken van de hook woocommerce_add_cart_item_data om de invoer op te schonen met sanitize_text_field():

PHP
 
add_filter('woocommerce_add_cart_item_data', 'sanitize_custom_text_input', 10, 3);

function sanitize_custom_text_input($cart_item_data, $product_id, $quantity) {
    if (isset($_POST['engraving_text'])) {
        // Saniseer de invoer rigoureus voordat het in de winkelwagen belandt
        $cart_item_data['custom_engraving_text'] = sanitize_text_field($_POST['engraving_text']);
    }
    return $cart_item_data;
}

Bij het renderen van de data in het winkelwagen-sjabloon moet altijd esc_html() worden gebruikt:

PHP
 
echo '<div class="custom-cart-data">' . esc_html($cart_item['custom_engraving_text']) . '</div>';

Aanbevelingen voor site-eigenaren

  • Test uw invulvelden: Typ handmatig HTML-code in de personalisatievelden van uw producten en controleer of deze code in de winkelwagen wordt uitgevoerd of netjes als platte tekst wordt weergegeven.

  • Implementeer een CSP: Een krachtige Content Security Policy voorkomt dat inline JavaScript-scripts die via dit soort lekken worden geïnjecteerd, zomaar data kunnen verzenden naar externe servers van hackers.