L'énumération des utilisateurs est une technique de reconnaissance que les attaquants utilisent pour découvrir les noms d'utilisateurs valides sur votre site WordPress. C'est généralement la première étape avant une attaque par force brute. Si un attaquant connaît votre nom d'administrateur, il n'a plus qu'à deviner le mot de passe. S'il ne connaît pas le nom d'utilisateur, la surface d'attaque est nettement plus grande. Bloquer l'énumération oblige les attaquants à deviner à la fois le nom d'utilisateur et le mot de passe, ce qui rend une attaque réussie beaucoup moins probable.
Comment les attaquants énumèrent les noms d'utilisateurs WordPress
Il existe plusieurs méthodes que les attaquants utilisent pour découvrir les noms d'utilisateurs sur un site WordPress. Comprendre chacune d'elles vous aide à savoir contre quoi vous protéger.
- URL d'archives d'auteur : par défaut, WordPress crée des archives d'auteur à
/author/username/. Un attaquant peut visiter?author=1,?author=2, et ainsi de suite. WordPress redirige ces requêtes vers l'URL d'archive d'auteur correspondante, qui contient le nom d'utilisateur en clair. Des scripts automatisés peuvent parcourir les ID d'auteur très rapidement pour constituer une liste complète de noms d'utilisateurs. - Endpoint utilisateurs de l'API REST : l'API REST de WordPress expose un endpoint
/wp-json/wp/v2/usersqui renvoie un tableau JSON de tous les utilisateurs ayant publié des articles. Cela inclut les noms d'utilisateurs, les noms d'affichage et les ID utilisateur. Aucune authentification n'est requise pour accéder à cet endpoint par défaut. - Messages d'erreur de connexion : lorsque vous saisissez un nom d'utilisateur invalide sur la page de connexion WordPress, le message d'erreur indique quelque chose comme « Le nom d'utilisateur X n'est pas enregistré. » Lorsque vous saisissez un nom d'utilisateur valide mais un mauvais mot de passe, il indique « Le mot de passe que vous avez entré pour le nom d'utilisateur X est incorrect. » Cette différence indique à l'attaquant si un nom d'utilisateur existe.
- Réponses oEmbed : les liens de découverte oEmbed de WordPress dans le code source de la page peuvent révéler des informations sur l'auteur lorsque d'autres sites tentent d'intégrer votre contenu.
- XML-RPC : l'endpoint
xmlrpc.phppeut être utilisé pour tester des combinaisons nom d'utilisateur/mot de passe via la méthodewp.getUsersBlogs. Bien qu'il s'agisse plutôt d'un vecteur de force brute, il confirme les noms d'utilisateurs valides via différentes réponses d'erreur.
Pourquoi l'énumération des utilisateurs est importante pour la sécurité
En soi, connaître un nom d'utilisateur ne compromet pas votre site. Mais cela facilite tout le reste pour un attaquant. Considérez une attaque par force brute : si l'attaquant doit deviner à la fois le nom d'utilisateur et le mot de passe, le nombre de combinaisons possibles est énorme. S'il sait déjà que le nom d'utilisateur est « admin » ou « john », il n'a qu'à se concentrer sur le mot de passe. Combinée à des listes de mots de passe courants, cela peut conduire à une compromission réussie en quelques minutes plutôt qu'en plusieurs années.
De plus, les noms d'utilisateurs découverts peuvent être utilisés dans des attaques de phishing ciblées. Si un attaquant sait que votre compte administrateur est « sarah.johnson », il peut élaborer des e-mails d'ingénierie sociale plus convaincants.
Bloquer l'énumération via les archives d'auteur
Ajoutez ce code au functions.php de votre thème ou à une extension personnalisée. Il intercepte les requêtes contenant le paramètre ?author=N et les redirige vers la page d'accueil au lieu de révéler le nom d'utilisateur :
/**
* Bloquer l'énumération des utilisateurs via le paramètre author
*/
function block_author_enumeration() {
if (is_admin()) return;
if (isset($_REQUEST['author']) && is_numeric($_REQUEST['author'])) {
wp_redirect(home_url(), 301);
exit;
}
}
add_action('init', 'block_author_enumeration');Ceci gère la méthode d'énumération la plus courante. La vérification is_admin() garantit que les fonctionnalités du backend ne sont pas affectées. La redirection utilise un code de statut 301, qui indique aux moteurs de recherche de mettre à jour leur index (au cas où les URL d'archives d'auteur auraient été précédemment indexées).
Désactiver l'endpoint utilisateurs de l'API REST
Le code suivant supprime l'endpoint utilisateurs de l'API REST pour les visiteurs non connectés. Les utilisateurs authentifiés (comme les administrateurs et les éditeurs) peuvent toujours y accéder, ce qui préserve les fonctionnalités de l'éditeur de blocs et d'autres outils d'administration :
/**
* Supprimer l'endpoint utilisateurs de l'API REST pour les requêtes non authentifiées
*/
add_filter('rest_endpoints', function($endpoints) {
if (!is_user_logged_in()) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P[\d]+)']);
}
}
return $endpoints;
}); Après avoir ajouté ce code, les requêtes non authentifiées vers /wp-json/wp/v2/users renverront une erreur 404 au lieu de lister vos utilisateurs.
Uniformiser les messages d'erreur de connexion
WordPress affiche des messages d'erreur différents pour les scénarios « nom d'utilisateur invalide » et « mauvais mot de passe ». Cela révèle si un nom d'utilisateur donné existe sur le site. La solution est simple : renvoyer le même message générique pour tous les échecs de connexion :
/**
* Utiliser un message d'erreur de connexion générique
*/
add_filter('login_errors', function() {
return 'Nom d\'utilisateur ou mot de passe invalide.';
});Avec ce changement, un attaquant ne peut pas déterminer si une tentative de connexion a échoué à cause d'un mauvais nom d'utilisateur ou d'un mauvais mot de passe. Les deux cas produisent la même réponse.
Supprimer les liens de découverte oEmbed
WordPress inclut des liens de découverte oEmbed dans le head HTML de vos pages. Ces liens peuvent exposer des informations sur l'auteur lorsque d'autres sites tentent d'intégrer votre contenu. Supprimez-les avec une seule ligne :
remove_action('wp_head', 'wp_oembed_add_discovery_links');Cela n'affecte pas votre capacité à intégrer du contenu provenant d'autres sites. Cela empêche uniquement d'autres sites de découvrir automatiquement le contenu intégrable sur votre site.
Bloquer l'énumération d'auteur via .htaccess
Si vous utilisez Apache, vous pouvez ajouter une redirection au niveau du serveur qui bloque l'énumération d'auteur avant même que WordPress ne se charge. C'est plus efficace qu'une solution basée sur PHP car cela ne nécessite pas de traitement PHP :
# Bloquer l'énumération des utilisateurs via le paramètre author
RewriteCond %{QUERY_STRING} ^author=\d+ [NC]
RewriteRule .* /? [R=301,L]Placez ceci dans votre fichier .htaccess avant les règles de réécriture WordPress. Cela attrape toute requête avec un paramètre de requête author= contenant un nombre et redirige vers la page d'accueil.
Solutions basées sur des extensions
Si vous préférez ne pas ajouter de code manuellement, plusieurs extensions de sécurité gèrent la prévention de l'énumération des utilisateurs :
- Stop User Enumeration : une extension ciblée et légère qui bloque spécifiquement les scans d'auteur et le listing des utilisateurs de l'API REST. Fait une seule chose et la fait bien.
- iThemes Security (Solid Security) : une suite de sécurité complète qui inclut la protection contre l'énumération des utilisateurs aux côtés de fonctionnalités comme l'authentification à deux facteurs, la détection des changements de fichiers et la protection contre la force brute. Le blocage de l'énumération se trouve dans la section « WordPress Tweaks ».
- Wordfence : principalement un pare-feu et un scanner de logiciels malveillants, mais ses règles de pare-feu peuvent bloquer les tentatives d'énumération. La version gratuite inclut une protection de base ; la version premium ajoute des règles de pare-feu en temps réel.
- All In One WP Security : une extension gratuite et conviviale pour les débutants avec une option de prévention de l'énumération des utilisateurs sous User Accounts > WP Username. Elle propose également un pare-feu et des fonctionnalités de verrouillage de connexion.
Tester l'énumération sur votre propre site
Avant et après la mise en œuvre de ces protections, vous devez tester si l'énumération fonctionne toujours. Voici comment :
- Test des archives d'auteur : ouvrez une fenêtre de navigation privée et visitez
https://votresite.com/?author=1. Si la protection fonctionne, vous devriez être redirigé vers la page d'accueil au lieu de voir une page d'archive d'auteur avec le nom d'utilisateur dans l'URL. - Test de l'API REST : ouvrez
https://votresite.com/wp-json/wp/v2/usersdans votre navigateur sans être connecté. Vous devriez voir une erreur 404 ou une réponse vide, et non une liste d'utilisateurs avec leurs noms d'utilisateurs. - Test de la page de connexion : essayez de vous connecter avec un nom d'utilisateur qui n'existe pas, puis essayez avec un vrai nom d'utilisateur mais un mauvais mot de passe. Les deux devraient produire le même message d'erreur.
- Analyse InspectWP : lancez une nouvelle analyse InspectWP de votre site. La section sécurité vérifie les vulnérabilités d'énumération des utilisateurs et indiquera si vos protections fonctionnent correctement.
Conseils de durcissement supplémentaires
La prévention de l'énumération des utilisateurs fonctionne mieux dans le cadre d'une stratégie de sécurité plus large. Envisagez ces mesures complémentaires :
- Évitez « admin » comme nom d'utilisateur : si votre compte administrateur s'appelle encore « admin », créez un nouveau compte administrateur avec un nom d'utilisateur unique, attribuez-lui tout le contenu, puis supprimez l'ancien compte « admin ».
- Utilisez des mots de passe forts et uniques : même si un attaquant découvre un nom d'utilisateur, un mot de passe fort rend les attaques par force brute impraticables. Utilisez un gestionnaire de mots de passe pour générer et stocker des mots de passe complexes.
- Activez l'authentification à deux facteurs : la 2FA ajoute une seconde couche de protection. Même si le nom d'utilisateur et le mot de passe sont compromis, l'attaquant ne peut toujours pas se connecter sans le second facteur.
- Limitez les tentatives de connexion : des extensions comme Limit Login Attempts Reloaded ou Loginizer peuvent verrouiller les adresses IP après un nombre défini de tentatives de connexion échouées.