Het administratieve dashboard van WooCommerce bevat krachtige zoekfuncties waarmee shopmanagers snel specifieke bestellingen kunnen terugvinden op basis van klantnaam, adres of bestelnummer. Omdat deze zoekfuncties diep in de database moeten graven (in tabellen zoals wp_posts, wp_postmeta, en wp_woocommerce_order_items), maken ontwikkelaars soms gebruik van complexe, handgeschreven SQL-queries. Als deze invoer niet correct wordt gesaniseerd, ontstaat er een risico op SQL-injectie binnen de beheeromgeving.

Waarom SQLi in het dashboard een reëel gevaar is

Veel site-eigenaren denken dat kwetsbaarheden in het beheerpaneel (wp-admin) minder erg zijn omdat "alleen vertrouwde medewerkers daar toegang toe hebben". Dit is een gevaarlijke misvatting.

  1. Privilege Escalation: Een aanvaller die via een eerdere Cross-Site Scripting (XSS) aanval of een zwak wachtwoord toegang heeft gekregen tot een account met lage rechten (zoals een stagiair met de rol 'Klantenservice'), kan het SQLi-lek misbruiken om zijn rechten te escaleren naar Administrator.

  2. Geautomatiseerde exploits: Als een medewerker per ongeluk op een kwaadaardige link klikt terwijl hij is ingelogd, kan een CSRF-aanval op de achtergrond de zoekfunctionaliteit misbruiken om SQL-commando's uit te voeren.

Stel dat een custom plug-in voor orderbeheer de zoekterm als volgt verwerkt:

PHP
 
$search_term = $_GET['order_search'];
$query = "SELECT * FROM wp_posts WHERE post_type = 'shop_order' AND post_title LIKE '%" . $search_term . "%'";
$results = $wpdb->get_results($query);

Een aanvaller kan de zoekterm manipuleren naar: test%' UNION SELECT user_pass FROM wp_users --. Hierdoor zal de database de wachtwoordhashes van alle administrators retourneren in het overzicht van de bestellingen.

Hoe ontwikkelaars veilige zoekfuncties bouwen

WordPress biedt uitstekende abstractielagen zoals WP_Order_Query en esc_like(). Ontwikkelaars moeten handgeschreven SQL-queries vermijden en in plaats daarvan de officiële WooCommerce API's gebruiken.

Als het absoluut noodzakelijk is om een handmatige query met LIKE te schrijven, moet $wpdb->prepare() worden gecombineerd met esc_like():

PHP
 
$search_term = $_GET['order_search'];

// Bereid de zoekterm veilig voor op een LIKE query
$wildcard_search = '%' . $wpdb->esc_like( $search_term ) . '%';

$query = $wpdb->prepare(
    "SELECT * FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_title LIKE %s",
    $wildcard_search
);
$results = $wpdb->get_results($query);

Maatregelen voor site-beheerders

  • Beperk zoekrechten: Zorg ervoor dat medewerkers alleen toegang hebben tot de specifieke schermen die ze nodig hebben voor hun dagelijkse werk.

  • Gebruik sterke authenticatie: Schakel tweestapsverificatie (2FA) verplicht in voor alle accounts die toegang hebben tot het WordPress-dashboard, om te voorkomen dat aanvallers toegang krijgen tot de beheeromgeving.