WordPress maakt gebruik van de krachtige klasse WP_Query om database-inhoud op te halen en weer te geven. WooCommerce bouwt hierop voort om producten, bestellingen en klantgegevens te beheren. Hoewel WP_Query ingebouwde bescherming biedt tegen SQL-injectie, schuilt het gevaar in de logica van de code. Wanneer ontwikkelaars invoer van gebruikers rechtstreeks koppelen aan 'meta queries' (filters op basis van aangepaste databasevelden), kunnen aanvallers de query manipuleren om verborgen, gevoelige informatie boven water te halen.
Wat is een Meta Query lek?
In WooCommerce worden veel gevoelige gegevens opgeslagen als 'post meta' in de tabel wp_postmeta. Denk aan transactie-ID's van PayPal, interne opmerkingen van de klantenservice, of licentiesleutels van digitale producten.
Stel dat een plug-in een geavanceerd zoekfilter biedt waarmee gebruikers producten kunnen zoeken op basis van aangepaste specificaties. De plug-in accepteert een array via een POST-verzoek en geeft dit direct door aan de meta_query parameter van WP_Query:
$search_criteria = $_POST['meta_filter'];
$args = array(
'post_type' => 'product',
'meta_query' => $search_criteria
);
$query = new WP_Query($args);
Een aanvaller kan de structuur van het POST-verzoek zo aanpassen dat de query niet zoekt naar een productkleur, maar naar de meta-key _billing_phone of _order_total met een vergelijking zoals NOT IS NULL. Als de webshop de resultaten (zelfs gedeeltelijk) op het scherm toont, kan de aanvaller systematisch achterhalen welke data in de database staat.
De impact op e-commerce privacy
Dit type kwetsbaarheid leidt zelden tot een totale server-overname, maar het is een directe schending van de privacywetgeving (AVG/GDPR). Aanvallers kunnen hiermee:
-
Klantenlijsten en telefoonnummers exfiltreren.
-
Zien welke kortingscodes zijn gekoppeld an specifieke e-mailadressen.
-
Financiële statistieken van de webshop inzien door besteldata te analyseren via gemanipuleerde zoekfilters.
Hoe ontwikkelaars query-manipulatie voorkomen
De gouden regel bij het bouwen van zoek- en filterfuncties is: Sta nooit toe dat de gebruiker de database-kolommen of meta-keys bepaalt.
Ontwikkelaars moeten een strikte 'whitelist' hanteren van toegestane filteropties. De invoer van de gebruiker mag alleen de waarde bepalen, nooit de sleutel (key) of de vergelijkingsoperator (LIKE, =, NOT IN).
// VEILIGE AANPAK
$allowed_colors = array('rood', 'blauw', 'groen');
$chosen_color = sanitize_text_field($_POST['color']);
if (in_array($chosen_color, $allowed_colors)) {
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'product_color', // Hardcoded, niet door gebruiker bepaald
'value' => $chosen_color,
'compare' => '='
)
)
);
$query = new WP_Query($args);
}
Wat kan een webshopeiger doen?
-
Beperk publieke zoekfuncties: Gebruik uitsluitend de standaard zoekfunctie van WordPress/WooCommerce of vertrouwde, veelgebruikte filter-plug-ins (zoals FacetWP of de ingebouwde WooCommerce-blokken). Avoid op maat gemaakte, slecht geteste zoekscripts van freelancers.
-
Audit van metadata: Zorg ervoor dat gevoelige plug-ins die creditcardtokens of klantinformatie opslaan, deze data versleutelen voordat ze in de
wp_postmetatabel worden geplaatst. Hierdoor is de data onleesbaar, zelfs als een meta-query-lek optreedt.
