SQL-injectie is een van de oudste bekende kwetsbaarheden, maar de variant genaamd Blind SQL-injectie (BSQLi) is het meest verraderlijk. In tegenstelling till reguliere SQLi, waarbij database-fouten direct op het scherm verschijnen, geeft een website bij BSQLi geen duidelijke foutmeldingen. Binnen WooCommerce-sites zijn geavanceerde productfilters (zoals filters op basis van attributen, prijs en populariteit) een geliefd doelwit voor deze complexe aanvalsmethode.

Hoe Blind SQL-injectie in filters werkt

Wanneer een klant producten filtert op de frontend, genereert WooCommerce een dynamische query. Als een extensie van een derde partij deze filters afhandelt via een op maat gemaakte database-architectuur en de invoer niet correct verwerkt, ontstaat het lek.

Bij Blind SQL-injectie stelt de aanvaller de database een reeks "ja/nee" vragen op basis van logische operators (AND/OR). De aanvaller analyseert vervolgens hoe lang de pagina erover doet om te laden (Time-based) of controleert of de productlijst wel of niet verandert (Boolean-based).

Stel dat een onveilig filterverzoek er zo uitziet: https://uwshop.nl/?filter_attr=1 AND (SELECT SLEEP(5) FROM wp_users WHERE ID=1)

Als de database-server er exact 5 seconden langer over doet om de pagina te laden, weet de aanvaller dat de voorwaarde (ID=1 bestaat) waar is. Door deze methode duizenden keren geautomatiseerd te herhalen, kan een hacker karakter voor karakter de administrator-wachtwoordhashes uit de database exfiltreren, zonder dat er ooit een foutmelding in de logboeken verschijnt.

Hoe ontwikkelaars Blind SQLi voorkomen

Het risico op Blind SQL-injectie wordt volledig geëlimineerd door het gebruik van prepared statements via de $wpdb->prepare() methode. Dit dwingt de SQL-parser om gebruikersinvoer strikt als data te behandelen en nooit als uitvoerbare code.

PHP
 
// ONVEILIGE AANPAK IN FILTERS
$attribute_id = $_GET['filter_attr'];
$results = $wpdb->get_results("SELECT * FROM my_custom_table WHERE attr_id = " . $attribute_id);

// VEILIGE AANPAK
$attribute_id = intval($_GET['filter_attr']); // Typecasting naar integer
$query = $wpdb->prepare("SELECT * FROM my_custom_table WHERE attr_id = %d", $attribute_id);
$results = $wpdb->get_results($query);

Praktisch advies voor site-eigenaren

  • Gebruik een WAF met anomaliedetectie: Een Web Application Firewall (zoals Cloudflare of Wordfence) herkent de patronen van SQL-functies (zoals SLEEP(), BENCHMARK() of UNION) binnen URL-parameters en blokkeert deze verzoeken onmiddellijk.

  • Houd MySQL/MariaDB up-to-date: Moderne database-engines bevatten optimalisaties en beveiligingspatches die de impact en uitvoering van kwaadaardige database-operaties helpen inperken.