L’injection SQL (ou SQLi, pour SQL Injection) est l’une des techniques d’attaque les plus répandues sur le web. Elle consiste à insérer du code SQL malveillant dans un champ de formulaire, une URL ou tout autre paramètre transmis à la base de données, afin d’en modifier le comportement.
Comment fonctionne une injection SQL
Lorsqu’une application web construit une requête SQL en concaténant directement des données saisies par l’utilisateur sans les valider, elle est potentiellement vulnérable. Un attaquant peut injecter des instructions SQL arbitraires pour modifier la logique de la requête : contourner l’authentification, extraire des données sensibles, modifier des enregistrements ou supprimer des tables entières.
La classe $wpdb de WordPress intègre une méthode prepare() qui protège contre ce type d’attaque en paramétrant les requêtes. Les développeurs de plugins qui la contournent exposent leurs utilisateurs.
WordPress et les injections SQL : les points d’entrée courants
Même avec WordPress core protégé, des plugins ou thèmes tiers mal codés peuvent introduire des failles :
- Formulaires de recherche personnalisés passant des paramètres non filtrés dans WP_Query
- Plugins de filtrage (WooCommerce, LMS) avec des paramètres GET construits en concaténation directe
- Champs de tri et de pagination non validés dans les requêtes de listing
- API REST custom avec des endpoints qui acceptent des paramètres SQL sans préparation
Comment protéger son WordPress contre les injections SQL
La protection passe par plusieurs niveaux complémentaires :
- Mises à jour régulières : la majorité des failles SQLi connues sont corrigées dans les updates de plugins
- Utiliser
$wpdb->prepare()dans tout code personnalisé accédant à la base - Activer un WAF (Web Application Firewall) qui filtre les payloads SQL avant qu’ils atteignent la base de données
- Restreindre les privilèges MySQL : l’utilisateur DB WordPress ne doit pas avoir les droits
DROPouFILE - Scanner régulièrement les plugins installés pour détecter les vulnérabilités connues (CVE)