De plus en plus souvent, je suis amené à corriger et sécuriser un site WordPress qui vient d'être piraté. Il était temps de faire un guide sur ce sujet. D'ailleurs, tous les conseils donnés ici doivent être appliqués pour sécuriser n'importe quel WordPress, même sans avoir un site piraté.
PS : mon article ne veut pas dire que WordPress est de plus en plus piraté. Bien souvent, c'est la faute de l'utilisateur et/ou du développeur d'un plugin ou du thème qui provoque le problème ;)
Ne pas paniquer
C'est sans doute la meilleure chose à faire. Ne paniquez pas lorsque votre site WordPress a été hacké. Cela peut arriver à n'importe quel site, et il n'y a pas mort d'hommes. Ce qui est important est d'être méthodique pour tout remettre en état et éviter que cela ne recommence.
En règle générale, c'est votre hébergeur qui va vous avertir du problème. Mieux encore, la plupart d'entre eux vont directement bloquer votre site. C'est sans doute la meilleure chose qui puisse vous arriver. Si le site est bloqué, le problème ne va pas augmenter et vous n'aller pas infecter d'autres sites ni les ordinateurs de vos visiteurs.
La 1ère étape réellement urgente est simple : changez vos mots de passe sur vos autres sites et comptes. Attention, ceci n'est vrai que dans le cas de figure où le mot de passe d'un de vos logins sur le site piraté (utilisateur, FTP ou base de données) est utilisé ailleurs sur le web, par exemple pour votre boite email, pour Facebook ou pour un autre site. Si vos mots de passe sont uniques, vous n'avez rien à craindre : le pirate ne pourra pas accéder ou hacker vos autres comptes, outils ou sites.
Trouver l'origine de la faille
C'est le point crucial. Il faut impérativement trouver l'origine de la faille. Puisque votre hébergeur a probablement bloqué votre site, vous ne risquez rien et vous ne devez pas vous précipiter. Le plus important, c'est de ne rien toucher au site (aucun ajout, modification et suppression de fichier). Repérez avec votre hébergeur la date et l'heure précise du blocage de votre site. Pourquoi ? Car vous allez chercher dans les logs du serveur pour comprendre ce qui s'est passé, et il vaut mieux avoir un ordre d'idée de l'heure du piratage pour vos recherches.
Par exemple, cette ligne m'indique qu'une requête a été faite sur le fichier admin-ajax.php à 2H:32.
213.189.2.48 shopmollon.fr - [13/Feb/2015:02:32:52 +0100] "GET /wp-admin/admin-ajax.php HTTP/1.1" 200 4 "-" "Mozilla/5.0 (Windows ; U ; Windows NT 5.1 ; en-US ; rv:1.9.2) Gecko/20100115 Firefox/3.6"
A vous de vérifier ensuite si cette requête et les autres ont provoqué le piratage. Vous devez donc aller fouiller dans les logs de votre serveur à partir du moment de la coupure ou de l'alerte de votre hébergeur, puis remonter ligne par ligne pour trouver ce qui a posé problème.
Prenons cet exemple, où l'on peut voir qu'à partir de la ligne 4 des fichiers étranges sont appelés juste après une requête sur admin-ajax. Bingo, ici le pirate vient d'utiliser la faille du plugin RevSlider qui n'était pas à jour sur ce site.
213.189.2.48 seomix.fr - [13/Feb/2015:02:32:52 +0100] "GET /wp-admin/admin-ajax.php HTTP/1.1" 213.189.2.48 seomix.fr - [13/Feb/2015:02:32:53 +0100] "GET /shop/wp-content/plugins/revslider/wp-admin/admin-ajax.php HTTP/1.1" 213.189.2.48 seomix.fr - [13/Feb/2015:02:32:53 +0100] "GET /wp-content/plugins/revslider/temp/update_extract/revslider/vito.php HTTP/1.1" 213.189.2.48 seomix.fr - [13/Feb/2015:02:32:54 +0100] "GET /wp-content/plugins/revslider/temp/update_extract/revslider/xxx.php HTTP/1.1" 213.189.2.48 seomix.fr - [13/Feb/2015:02:32:54 +0100] "GET /shop/wp-content/plugins/revslider/wp-content/plugins/revslider/temp/update_extract/revslider/vito.php HTTP/1.1 213.189.2.48 seomix.fr - [13/Feb/2015:02:32:54 +0100] "GET /shop/wp-content/plugins/revslider/wp-content/plugins/revslider/temp/update_extract/revslider/xxx.php HTTP/1.1" 213.189.2.48 seomix.fr - [13/Feb/2015:02:32:54 +0100] "GET /wp-content/plugins/revslider/temp/update_extract/revslider/love.php HTTP/1.1" 213.189.2.48 seomix.fr - [13/Feb/2015:02:32:54 +0100] "GET /shop/wp-content/plugins/revslider/wp-content/plugins/revslider/temp/update_extract/revslider/love.php HTTP/1.1"
Plus vous le ferez et plus vous lirez des logs, mieux vous les comprendrez. J'avoue que cet exercice peut parfois être difficile, mais il est très intéressant à faire. Autre cas de figure déjà rencontré, un pirate qui avait déjà volé le mot de passe de mon client quelques jours avant. Celui-ci s'est tout simplement connecté au site, puis via le menu " Apparence > Edition ", il a modifié les fichiers du thème pour insérer ses liens.
Préparer votre todoliste
Une fois la faille repérée, vous allez pouvoir commencer à travailler. A ce stade-là, le mieux est de se créer une checklist de toutes les tâches que vous devrez mener à bien pour sécuriser votre site WordPress. Nous allons détailler chaque point ensuite, mais voici en gros ce que vous devez faire :
- Restaurer la dernière sauvegarde propre de votre hébergeur ;
- Changez les mots de passe des utilisateurs, des accès FTP et de la base de données ;
- Corriger la faille si vous avez réussi à l'identifier ;
- Mettre à jour WordPress, vos thèmes et vos plugins ;
- Trier vos plugins ;
- Installer et paramétrer différents plugins de sécurité ;
- Sécuriser via Htaccess et via le fichier wp-config votre site ;
- Sécuriser vos utilisateurs ;
Remettre une sauvegarde en ligne
J'ai un backup
Si vous avez identifié la date du piratage, vous pouvez demander à votre hébergeur de restaurer votre site à J-1. Vous allez ainsi retrouver tous vos fichiers propres. C'est le moyen le plus simple de supprimer toute trace de piratage. Cela implique cependant que vous ayez mis en place des sauvegardes quotidiennes, ou que votre hébergeur le fasse pour vous.
Attention cependant, quand vous allez restaurer une sauvegarde de WordPress, vous allez perdre les données et les fichiers mis en ligne ou modifié depuis la date de sauvegarde. Dans le cas d'un site e-commerce par exemple, vous perdrez donc l'historique de vos dernières commandes et clients. Pensez donc à garder de côté ces données avant.
Je n'ai pas de backup
Si aucune sauvegarde n'est disponible, c'est là que cela se complique : il va falloir nettoyer un à un chaque fichier, en se basant sur les dates de dernière modification de ceux-ci. C'est un travail long et fastidieux, mais obligatoire.
Le mieux alors est de supprimer un par un chaque fichier et répertoire natif de WordPress pour les remplacer via FTP par des fichiers propres que vous aurez tout juste téléchargé sur le site officiel. Il s'agit des fichiers :
- fichiers WP à la racine (index.php et chaque fichier commençant par wp-) ;
- le répertoire wp-includes ;
- le répertoire wp-admin.
Répétez ensuite l'opération pour chaque thème et plugin présent sur votre site dans le répertoire wp-content (vous les supprimez, les re-téléchargez et les uploadez). Et ensuite, vous devrez nettoyer manuellement le reste des répertoires, à savoir :
- les répertoires ajoutés manuellement par vos soins ;
- le répertoire upload ;
- les éventuels répertoires de cache ;
- les éventuels répertoires ajoutés dans wp-content par vos plugins ;
- les éventuels fichiers rajoutés à la racine ou dans wp-content.
Corriger la faille de sécurité
Si elle est clairement identifiée, vous devez avant tout corriger la faille de sécurité présente sur votre site WordPress. Si c'est votre thème ou un plugin qui est en faute, faites immédiatement les corrections ou la mise à jour. Vous éliminez ainsi la principale problématique de sécurité de votre site.
Cependant, même après avoir réalisé cette étape, le travail est loin d'être terminé. En utilisant cette faille, le pirate a pu créer d'autres failles sur votre site, ou il a pu vous voler certaines données sensibles. Et même si ce n'est pas le cas, votre WordPress a peut-être tout simplement d'autres failles " en attente ". Vous devez donc nettoyer, mettre à jour et sécuriser votre CMS en suivant les étapes qui suivent.
Mots de passe
Normalement à ce stade-là, votre hébergeur bloque toujours l'accès à votre site, mais au moins vos fichiers sont propres. Commencez par :
- changer le mot de passe SQL (et pensez à modifier le fichier wp-config.php en conséquence) ;
- changer le mot de passe de chaque accès FTP à votre site (si ces informations sont contenues dans le fichier wp-config.php, supprimez-les).
Demandez ensuite à votre hébergeur de rétablir l'accès à votre site. Dès que celui-ci est en ligne, modifiez les mots de passe de chaque utilisateur, surtout chaque administrateur, éditeur, auteur et contributeur.
Mises à jour
Enchainez ensuite immédiatement avec les mises à jour de WordPress. Mettez à jour :
- le coeur de WordPress ;
- tous vos plugins ;
- tous vos thèmes.
Attention : ces mises à jour sont nécessaires pour la sécurité. Cependant, elles peuvent provoquer des incompatibilités. Vous devez donc bel et bien vérifier que chaque mise à jour ne provoque pas de bugs ni d'incompatibilités.
Si vous utilisez des mu-plugins, pensez à en vérifier le contenu et si une mise à jour est nécessaire.
Si votre thème vous fournit des plugins, pensez à vérifier que vous disposez d'une clé de licence valable. En fait, vous devez faire cette vérification pour chaque plugin premium de votre installation WordPress. Sans une clé de licence valable (par exemple pour RevSlider, MailPoet, WPRocket, ACF...), WordPress ne vous avertira jamais qu'une mise à jour est disponible.
Trier vos plugins
Profitez-en pour faire un petit tri dans vos plugins. Désactivez et supprimer définitivement tout plugin dont vous ne vous servez plus. Vérifiez aussi pour les plugins qui n'ont pas été mis à jour depuis longtemps si un autre plugin plus récent serait disponible.
Pensez aussi à installer Plugin Security Checker qui va vérifier si vos plugins ont été supprimés de WordPress.org (souvent pour non-respect de la licence GPL ou pour des problèmes de sécurité), vous avertissant d'une potentille faille.
Plugins de sécurité
Ensuite, je conseille d'installer certains plugins de sécurité qui vont combler certaines lacunes de WordPress ou de votre hébergeur :
- BBQ : pour bloquer certains types de requêtes ;
- Breach Avoider : pour supprimer la vulnérabilité HTTPS ;
- Login Lockdown : pour limiter le nombre de tentatives de connexion ;
- Akismet : pour éviter le spam.
HTaccess et WP-Config
Le fichier .htaccess situé à la racine de votre serveur (si vous utilisez Apache) peut contenir certaines règles de sécurité pour protéger la lecture de vos répertoires, l'accès au fichier htaccess lui-même ou au fichier wp-config.php de WordPress. Copiez/collez simplement le code suivant dedans :
# protect the htaccess file <files .htaccess> order allow,deny deny from all </files> # protection de la lecture des répertoires Options -Indexes # protect wpconfig.php <files wp-config.php> order allow,deny deny from all </files>
Le fichier wp-config.php peut également être amélioré. Ouvrez le fichier, et commencez par vérifier que les clés de salage sont bien remplies (AUTH_KEY, SECURE_AUTH_KEY...). Si ce n'est pas le cas, utilisez le lien suivant pour les générer et les remplacer dans votre fichier. Pour information, si vous changez ou remplissez ces champs, cela va vous déconnecter de WordPress : c'est normal.
Mais ce n'est pas terminé. Ajoutez toujours dans le même fichier les lignes suivantes pour encore un peu plus de sécurité :
/* Pas d'éditeur de fichier dans l'admin de WordPress*/ define( 'DISALLOW_FILE_EDIT', TRUE ) ; /* Filtrage obligatoire des uploads*/ define( 'ALLOW_UNFILTERED_UPLOADS', FALSE ) ;
Sécuriser vos utilisateurs
Ce point-là est crucial, et commence par l'installation de deux plugins obligatoires : SX User Name Security et SF Author URL Control. Le deuxième vous donne la possibilité de changer les URL de chaque utilisateur. Pour cela, rendez-vous dans le profil de chaque membre pour changer son adresse. Cela permettra de ne plus pouvoir deviner un login à partir de l'URL de la page Auteur.
Le premier plugin (que j'ai créé avec Julio Potier) va combler les autres failles de sécurité des utilisateurs, à savoir tout d'abord le nettoyage de la fonction body_class que votre thème utilise peut-être, et qui affiche de base le login et l'ID de chaque utilisateur.
Ensuite, ce plugin WordPress s'attaque à l'affichage public de votre login. De base, WordPress utilise le login comme nom d'affichage. Quand vous publiez un article ou commentez un autre, vous allez afficher en clair votre réel login. Le plugin SX User Name Security va forcer WordPress à utiliser un nom aléatoire (que vous devrez changer manuellement), et surtout il vous empêchera d'utiliser votre login comme nom public.
Bonnes pratiques
Pour terminer, voici quelques bonnes pratiques à appliquer, que vous soyez sur WordPress ou non :
- chaque utilisateur a uniquement les droits dont il aura besoin, et il n'a accès qu'aux menus qui le concerne ;
- chaque utilisateur a un login/mot de passe différent ;
- chaque mot de passe est unique, avec une suite de majuscules/minuscules/caractères spéciaux et accents ;
- chaque mot de passe est utilisé uniquement sur le site, par sur un autre ;
- vous n'installez que les plugins dont vous avez besoin ;
- vous installez des plugins et thèmes uniquement depuis les sites officiels ;
- si vous faites appel à des développeurs, ils respectent les standards de WordPress, notamment sur la validation des données ;
- votre site est toujours à jour.
Déjà, si tout les sites WordPress pouvaient suivre ces conseils, on aurait beaucoup moins de piratage. Et vous, vous avez d'autres conseils, codes ou plugins à partager pour améliorer la sécurité de WordPress ?