Si votre site WordPress héberge des fichiers malveillants, redirige vos visiteurs ou envoie du spam, il a probablement été compromis. Cet article décrit la marche à suivre, dans l'ordre, en ligne de commande avec WP-CLI via votre accès SSH.
L'ordre des étapes compte. Mettre à jour WordPress avant d'avoir constaté les dégâts efface les traces de l'intrusion sans supprimer la porte dérobée. Suivez les étapes dans l'ordre indiqué.
| # |
Étape |
Objectif |
| 1 |
Reconnaître la compromission |
Confirmer qu'il s'agit bien d'un piratage |
| 2 |
Préserver l'état actuel |
Sauvegarder les preuves, mettre le site hors ligne |
| 3 |
Constater l'étendue |
Savoir ce qui a été modifié |
| 4 |
Nettoyer |
Restaurer les fichiers, purger la base |
| 5 |
Reprendre les accès |
Couper l'attaquant du site |
| 6 |
Mettre à jour |
Fermer la faille d'entrée |
| 7 |
Renforcer |
Éviter la récidive |
En bref : sauvegardez le site tel qu'il est et mettez-le hors ligne, constatez les dégâts (wp core verify-checksums), restaurez le cœur avec wp core download --force, reprenez les accès (wp config shuffle-salts), et seulement ensuite mettez à jour.
1. Comment reconnaître une compromission ?
- Redirections inattendues, pages injectées, ou contenu qui n'apparaît que pour les visiteurs venant d'un moteur de recherche
- Pics de trafic sur des URL que vous ne connaissez pas
- Fichiers malveillants signalés par votre hébergeur ou par votre navigateur
- Comptes administrateurs que vous n'avez pas créés
- Envoi de spam depuis le domaine, ou domaine placé sur une liste noire
2. Avant toute chose : préserver l'état actuel
- Sauvegardez le site tel qu'il est, fichiers et base de données, même infecté. C'est votre seule copie des preuves, et votre filet si le nettoyage casse quelque chose. Depuis la console Apanel, une archive téléchargeable rassemble les fichiers et les bases en un seul fichier : voir Sauvegarder ou exporter votre site dans une archive téléchargeable.
- Ne lancez aucune mise à jour pour l'instant (voir l'avertissement ci-dessus).
- Rendez le site indisponible le temps de l'intervention, pour ne plus servir de contenu malveillant à vos visiteurs. Si votre serveur la propose, préférez la Maintenance du site de la console Apanel (Gestion de l'hébergement > carte Site web > Maintenance du site) : la page d'indisponibilité est servie sans passer par le code de WordPress, que l'attaquant a pu modifier. À défaut, utilisez WP-CLI :
wp maintenance-mode activate
3. Comment constater l'étendue des dégâts ?
Connectez-vous en SSH sur votre compte, puis placez-vous dans le répertoire du site.
Fichiers du cœur de WordPress
wp core verify-checksums
Compare votre installation aux fichiers officiels. Tout fichier modifié, ajouté ou manquant est signalé.
Extensions
wp plugin verify-checksums --all
Portée limitée. Cette vérification s'appuie sur les sommes de contrôle publiées par WordPress.org. Les extensions premium, sur mesure ou installées manuellement ne peuvent pas être vérifiées ainsi : contrôlez-les à la main ou réinstallez-les depuis leur source d'origine. Les thèmes ne disposent d'aucune vérification équivalente.
Fichiers PHP là où il ne devrait pas y en avoir
Le dossier uploads ne doit contenir que des médias. Un fichier PHP qui s'y trouve est un signal fort :
find wp-content/uploads -type f -name "*.php"
Repérez aussi les fichiers modifiés récemment, en gardant à l'esprit qu'une intrusion peut être ancienne :
find . -type f -name "*.php" -mtime -30
Emplacements de persistance classiques
Une porte dérobée survit souvent à un nettoyage superficiel en se cachant ici :
| Emplacement |
Pourquoi c'est un point sensible |
wp-content/mu-plugins/ |
Extensions chargées automatiquement, invisibles dans la liste des extensions |
wp-content/object-cache.php advanced-cache.php db.php |
Fichiers « drop-in », chargés très tôt par WordPress |
wp-config.php .htaccess |
Code ou règles de redirection ajoutés en fin de fichier |
Comptes et tâches planifiées
wp user list --role=administrator
wp cron event list
Un compte administrateur inconnu, ou une tâche planifiée dont le nom ne correspond à aucune extension installée, sont des indices sérieux.
4. Nettoyer
Restaurer le cœur de WordPress
wp core download --force
N'utilisez pas wp core update pour cela. Si votre site est déjà dans la dernière version, wp core update considère qu'il n'y a rien à faire et laisse en place les fichiers modifiés par l'attaquant. Seul wp core download --force réécrit les fichiers existants dans tous les cas. Cette commande ne touche ni à wp-content, ni à wp-config.php, ni à votre base de données.
Extensions et thèmes
- Supprimez tout ce qui n'est pas utilisé : un thème ou une extension inactive reste exécutable
- Réinstallez depuis la source officielle les éléments signalés comme modifiés
- Supprimez toute extension qui n'est plus maintenue par son auteur
Base de données
Recherchez les injections les plus courantes :
wp db search "<script" --all-tables
wp db search "base64_decode" --all-tables
À ne pas confondre. wp db check et wp db repair vérifient l'intégrité technique des tables MySQL. Ils ne détectent ni ne suppriment aucun contenu malveillant et n'ont pas leur place dans un nettoyage de piratage.
5. Comment reprendre le contrôle des accès ?
Tant que cette étape n'est pas faite, l'attaquant peut revenir avec les identifiants ou la session qu'il possède déjà.
wp user delete <ID> --reassign=<ID_d_un_compte_légitime>
wp user reset-password <utilisateur> --show-password
Puis invalidez toutes les sessions ouvertes en régénérant les clés de sécurité, l'étape la plus souvent oubliée :
wp config shuffle-salts
Tous les utilisateurs, attaquant compris, sont immédiatement déconnectés.
N'oubliez pas les accès hors WordPress : mot de passe de votre console Apanel, accès FTP/SFTP et SSH, et utilisateur de la base de données (à répercuter dans wp-config.php).
6. Mettre à jour, maintenant seulement
Le constat est fait et les accès sont repris : les mises à jour peuvent être appliquées.
wp core update
wp plugin update --all
wp theme update --all
7. Réduire le risque de récidive
wp config set DISALLOW_FILE_EDIT true --raw
wp config set FORCE_SSL_ADMIN true --raw
La première commande désactive l'éditeur de fichiers de l'administration, qui permet à un compte compromis de modifier du code sans accès au serveur. La seconde force l'administration en HTTPS.
Complétez avec :
- l'authentification à deux facteurs sur les comptes administrateurs
- la limitation des tentatives de connexion
- une extension de sécurité reconnue, ou un pare-feu applicatif (WAF)
- des mises à jour régulières : la grande majorité des compromissions exploitent une faille corrigée depuis des mois
Puis remettez le site en ligne : désactivez la Maintenance du site dans la console Apanel, ou, si vous avez utilisé WP-CLI :
wp maintenance-mode deactivate
Quand se faire aider ?
Un nettoyage réussi ne laisse aucun fichier modifié à la seconde vérification. Si wp core verify-checksums continue de signaler des fichiers, si les injections réapparaissent, ou si vous n'êtes pas à l'aise avec ces manipulations, ne laissez pas le site en production : ouvrez une demande auprès de notre support en précisant ce que vous avez déjà tenté.
Voir aussi : Gérer un site WordPress en ligne de commande (WP-CLI).
Pour aller plus loin