Sommaire
WordPress propulse plus de 43% des sites web dans le monde. Cette popularité en fait une cible de choix pour les attaquants : un exploit fonctionnel sur WordPress peut potentiellement compromettre des millions de sites. Lors de nos tests d’intrusion, nous constatons régulièrement les mêmes types de vulnérabilités sur les sites WordPress de nos clients.
Voici les cinq failles les plus fréquemment exploitées et les mesures concrètes pour s’en protéger.
1. Injection SQL via les plugins
Comment les attaquants l’exploitent
L’injection SQL (SQLi) reste l’une des vulnérabilités les plus critiques sur WordPress, et elle provient presque toujours des plugins tiers. Le cœur de WordPress est relativement bien sécurisé grâce à l’utilisation systématique de requêtes préparées via la classe $wpdb. En revanche, de nombreux plugins développés par des tiers ne suivent pas les mêmes bonnes pratiques.
L’attaque fonctionne ainsi : un plugin accepte une entrée utilisateur (un paramètre d’URL, un champ de formulaire, un cookie) et l’intègre directement dans une requête SQL sans la nettoyer ni utiliser de requête paramétrée. L’attaquant injecte alors du code SQL malveillant pour :
- Extraire la base de données complète (utilisateurs, mots de passe hashés, données clients)
- Contourner l’authentification en modifiant les requêtes de login
- Modifier ou supprimer des données dans la base
- Lire des fichiers sur le serveur via des fonctions SQL comme
LOAD_FILE()
Des plugins populaires ont été concernés par ce type de faille : WP Statistics, Ultimate Member, GiveWP, LayerSlider — pour n’en citer que quelques-uns. La base WPScan recense des centaines de CVE liées à des injections SQL dans des plugins WordPress.
Comment s’en protéger
- Utilisez toujours
$wpdb->prepare()pour les requêtes SQL dans vos développements custom - Mettez à jour vos plugins dès qu’un correctif de sécurité est disponible
- Limitez le nombre de plugins installés au strict nécessaire
- Supprimez les plugins inactifs — même désactivé, un plugin vulnérable peut être exploité
- Installez un WAF (Web Application Firewall) comme Wordfence ou Sucuri qui bloque les tentatives d’injection SQL courantes
- Vérifiez la réputation des plugins avant installation : nombre d’installations actives, fréquence des mises à jour, dernier changelog
2. Cross-Site Scripting (XSS) dans les thèmes et plugins
Comment les attaquants l’exploitent
Le Cross-Site Scripting (XSS) est la vulnérabilité la plus répandue dans l’écosystème WordPress. Elle survient lorsqu’un thème ou un plugin affiche des données utilisateur sans les échapper correctement, permettant l’injection de code JavaScript malveillant dans les pages du site.
Il existe trois types de XSS :
- XSS réfléchi (Reflected) : le code malveillant est inclus dans un lien piégé. Lorsqu’un utilisateur clique, le script s’exécute dans son navigateur
- XSS stocké (Stored) : le code malveillant est enregistré dans la base de données (via un commentaire, un formulaire, un profil) et s’exécute pour chaque visiteur qui consulte la page
- XSS basé sur le DOM : le code malveillant manipule le DOM côté client sans passer par le serveur
Les conséquences d’une XSS peuvent être dévastatrices :
- Vol de session administrateur : l’attaquant récupère le cookie de session et prend le contrôle du back-office
- Redirection vers un site de phishing pour voler les identifiants des visiteurs
- Injection de contenu malveillant : cryptomineur, malware, pages de phishing
- Défacement du site : modification du contenu visible par les visiteurs
Comment s’en protéger
- Échappez systématiquement les sorties avec les fonctions WordPress dédiées :
esc_html(),esc_attr(),esc_url(),wp_kses_post() - Validez et sanitizez les entrées avec
sanitize_text_field(),sanitize_email(), etc. - Implémentez une Content Security Policy (CSP) qui limite les sources de scripts autorisées
- Activez le flag HttpOnly sur les cookies de session pour empêcher leur lecture par JavaScript
- Maintenez vos thèmes à jour et privilégiez les thèmes reconnus (GeneratePress, Astra, Kadence)
3. Attaque par force brute sur wp-login.php
Comment les attaquants l’exploitent
La page de connexion WordPress (/wp-login.php) est accessible par défaut sur tous les sites WordPress et ne dispose d’aucune protection native contre les attaques par force brute. Les attaquants utilisent des outils automatisés comme WPScan, Hydra ou Burp Suite pour tester des milliers de combinaisons identifiant/mot de passe par minute.
Les techniques courantes incluent :
- Dictionnaire de mots de passe : utilisation de listes comme RockYou (14 millions de mots de passe réels) ou SecLists
- Credential stuffing : réutilisation de couples identifiant/mot de passe provenant de fuites de données (haveibeenpwned.com)
- Énumération d’utilisateurs : WordPress révèle les noms d’utilisateurs via l’API REST (
/wp-json/wp/v2/users), les pages d’archives auteur (/?author=1) ou les messages d’erreur de connexion
Une fois un compte administrateur compromis, l’attaquant a un accès complet : modification du code PHP via l’éditeur de thèmes, installation de backdoors, accès à la base de données, etc.
Comment s’en protéger
- Imposez des mots de passe robustes : minimum 16 caractères, complexes, uniques
- Activez l’authentification multi-facteur (MFA) avec un plugin comme WP 2FA ou Wordfence Login Security
- Limitez les tentatives de connexion : plugins comme Limit Login Attempts Reloaded (3-5 tentatives avant blocage)
- Changez l’URL de connexion avec un plugin comme WPS Hide Login (remplacez
/wp-login.phppar une URL personnalisée) - Désactivez l’énumération des utilisateurs : bloquez l’API REST pour les utilisateurs non authentifiés et les pages d’archives auteur
- Renommez le compte « admin » : ne jamais utiliser « admin » comme identifiant
- Implémentez un CAPTCHA sur la page de connexion
4. Abus de XML-RPC
Comment les attaquants l’exploitent
XML-RPC (xmlrpc.php) est un protocole de communication qui permet aux applications externes d’interagir avec WordPress. Historiquement utilisé par les applications mobiles WordPress et certains outils de publication, il est devenu un vecteur d’attaque majeur car il offre une surface d’attaque alternative à la page de connexion classique.
Les principales attaques via XML-RPC :
- Amplification de force brute : la méthode
system.multicallpermet de tester des centaines de mots de passe en une seule requête HTTP, contournant ainsi les protections de rate-limiting sur wp-login.php - Attaques DDoS par pingback : la méthode
pingback.pingpeut être détournée pour transformer votre site en participant involontaire d’une attaque DDoS contre un tiers - Énumération d’informations : certaines méthodes XML-RPC exposent des informations sur la configuration du site
L’abus de XML-RPC est particulièrement sournois car de nombreux administrateurs protègent wp-login.php mais oublient complètement xmlrpc.php.
Comment s’en protéger
- Désactivez XML-RPC si vous n’en avez pas besoin (ce qui est le cas pour la majorité des sites) :
- Via un plugin comme Disable XML-RPC
- Via le fichier
.htaccess:<Files xmlrpc.php> Order Deny,Allow Deny from all </Files> - Via un filtre WordPress :
add_filter('xmlrpc_enabled', '__return_false');
- Si vous devez le garder actif, limitez les méthodes autorisées et restreignez l’accès par IP
- Surveillez les logs d’accès pour détecter les requêtes suspectes vers xmlrpc.php
5. Bypass d’upload de fichiers
Comment les attaquants l’exploitent
WordPress permet l’upload de fichiers (images, documents) via la médiathèque et via certains plugins (formulaires de contact, portfolios, etc.). Si ces mécanismes d’upload ne sont pas correctement sécurisés, un attaquant peut télécharger un fichier PHP malveillant (webshell) sur le serveur et obtenir une exécution de code à distance (RCE).
Les techniques de contournement courantes :
- Double extension : upload d’un fichier nommé
image.php.jpg— certains serveurs exécuteront le PHP - Manipulation du Content-Type : le navigateur envoie
image/jpegdans l’en-tête HTTP mais le fichier contient du code PHP - Null byte injection : injection d’un caractère nul (
image.php%00.jpg) pour tronquer le nom de fichier - Bypass de validation côté client : la validation JavaScript est facilement contournable avec un proxy comme Burp Suite
- Exploitation de failles dans les bibliothèques de traitement d’images : injection de code PHP dans les métadonnées EXIF d’une image
Une fois le webshell uploadé, l’attaquant dispose d’un accès shell sur le serveur et peut :
- Lire tous les fichiers du serveur (dont
wp-config.phpcontenant les identifiants de la base de données) - Modifier les fichiers du site pour injecter du code malveillant
- Pivoter vers d’autres sites hébergés sur le même serveur
- Exfiltrer des données sensibles
Comment s’en protéger
- Validez le type de fichier côté serveur en vérifiant le contenu réel du fichier (magic bytes), pas seulement l’extension
- Restreignez les types de fichiers autorisés via le filtre
upload_mimesde WordPress - Stockez les uploads en dehors du webroot ou dans un répertoire avec exécution PHP désactivée
- Désactivez l’exécution PHP dans le répertoire uploads via
.htaccess:<Directory /wp-content/uploads/> php_admin_flag engine off </Directory> - Limitez la taille des fichiers uploadés
- Scannez les fichiers uploadés avec un antivirus ou un outil comme ClamAV
Recommandations générales de durcissement WordPress
Au-delà des protections spécifiques à chaque vulnérabilité, voici les mesures générales essentielles :
- Mettez à jour WordPress, les plugins et les thèmes dès qu’un correctif est disponible. Activez les mises à jour automatiques pour les correctifs de sécurité mineurs
- Supprimez tout ce qui n’est pas utilisé : plugins inactifs, thèmes par défaut (TwentyTwenty*), fichiers readme.html et license.txt
- Protégez wp-config.php : déplacez-le au-dessus du webroot et restreignez ses permissions (chmod 400)
- Désactivez l’éditeur de fichiers intégré :
define('DISALLOW_FILE_EDIT', true);dans wp-config.php - Implémentez des en-têtes de sécurité HTTP : X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, Content-Security-Policy
- Utilisez HTTPS partout avec un certificat SSL/TLS valide (Let’s Encrypt est gratuit)
- Effectuez des sauvegardes régulières et testez-les : base de données et fichiers, stockées hors du serveur
- Surveillez l’intégrité des fichiers avec un plugin comme Wordfence qui détecte les modifications suspectes
La sécurité WordPress n’est pas un état figé mais un processus continu. Un test d’intrusion régulier permet de valider l’efficacité de vos mesures de protection et d’identifier les vulnérabilités qui auraient échappé aux outils automatisés.
Chez Expert Intrusion, nous réalisons des tests d’intrusion spécialisés sur les sites WordPress, incluant l’évaluation des plugins, des thèmes, de la configuration serveur et des mécanismes d’authentification. Contactez-nous pour sécuriser votre site WordPress.