En bref
- Un WordPress piraté garde presque toujours un administrateur créé par l’attaquant ou des fichiers ajoutés ou modifiés, souvent les deux.
- Depuis l’administration, Comptes > Tous les comptes, filtre Administrateur/administratrice : chaque compte doit avoir un nom et une personne derrière.
- Avec WP-CLI,
wp core verify-checksumsetwp plugin verify-checksums --allcomparent vos fichiers aux originaux de WordPress.org. - Ne supprimez rien tout de suite : retirez les droits, faites une copie, puis nettoyez. Une réinstallation ne retire pas les fichiers ajoutés.
Sommaire
Les deux traces les plus fréquentes d’un WordPress piraté
Un attaquant qui entre dans un WordPress veut pouvoir revenir. Même si la faille qu’il a utilisée est corrigée demain. Pour cela, il laisse en général l’une de ces deux portes, ou les deux :
- un compte administrateur : il se connecte ensuite comme n’importe quel gestionnaire du site ;
- un fichier ajouté ou modifié : une porte dérobée dans le cœur de WordPress, dans une extension, dans un thème, ou un fichier PHP glissé dans le dossier des médias.
La documentation de WordPress cite justement la création de nouveaux comptes parmi les signes clairs d’un piratage, et rappelle qu’une attaque laisse toujours des traces dans les logs ou dans les fichiers.
Les signes visibles (redirections, pages ajoutées, alerte de Google ou de l’hébergeur) arrivent souvent plus tard. Ces deux traces, elles, se vérifient tout de suite.
Repérer un administrateur inconnu dans WordPress
Pas besoin de terminal pour ce premier contrôle.
- Connectez-vous à l’administration de WordPress, menu Comptes > Tous les comptes.
- Au-dessus de la liste, cliquez sur le filtre Administrateur/administratrice.
- Pour chaque compte, demandez-vous : qui est-ce, et qui l’a créé ? Un identifiant générique (« admin2 », « support », « wpadmin »), une adresse e-mail que personne ne reconnaît ou un compte d’un ancien prestataire sont à traiter.
- Faites de même pour les rôles Éditeur/éditrice et, sur une boutique, Gestionnaire de boutique (rôle ajouté par WooCommerce) : ils peuvent modifier le contenu du site.
Le rôle Administrateur donne accès à tout : extensions, thèmes, comptes et réglages. Un compte de trop à ce niveau suffit pour tout reprendre.
Repérer un fichier modifié ou ajouté dans WordPress
Chaque version de WordPress, et chaque version d’une extension publiée sur WordPress.org, a une liste officielle d’empreintes : une sorte d’identifiant unique de chaque fichier. Si un seul caractère d’un fichier change, son empreinte change. Comparer vos fichiers à cette liste dit exactement lesquels ont été modifiés, et lesquels n’ont rien à faire là.
Cette comparaison se lance avec WP-CLI, l’outil en ligne de commande de WordPress (détail plus bas). Sans terminal, vous pouvez déjà faire deux vérifications avec votre client FTP :
- le dossier
wp-content/uploadsne doit contenir que des images, des documents et des vidéos. Un fichier.phpy est presque toujours une porte dérobée ; - le dossier
wp-content/mu-plugins, s’il existe : ces extensions se chargent toujours et n’apparaissent pas dans la liste habituelle des extensions. Chaque fichier doit avoir une explication (votre hébergeur ou votre agence en installe parfois).
| Nom | Taille | Modifié |
|---|---|---|
| .. | ||
| affiche-soldes.jpg | 412 Ko | 06/10/2026 |
| catalogue-automne.pdf | 2,1 Mo | 09/10/2026 |
| image-cache.php | 3 Ko | 21/10/2026 |
| logo-blanc.png | 18 Ko | 06/10/2026 |
La date de modification d’un fichier ne prouve rien : un attaquant peut la changer. C’est pour cela que la comparaison des empreintes est la vérification de référence.
Votre WordPress est piraté : que faire, dans l’ordre
La documentation de WordPress insiste sur un point : rester calme et tout noter avant d’agir. Ce que vous avez vu, à quelle heure, ce qui a changé récemment (nouvelle extension, mise à jour, nouveau prestataire). C’est le début du rapport d’incident, utile à votre assureur et à votre prestataire. Si des données de clients sont en jeu, la CNIL demande une notification dans les meilleurs délais, si possible dans les 72 heures après la découverte, quitte à la compléter ensuite.
- Ne supprimez rien. Un compte, un fichier ou un log effacé, c’est une preuve perdue. Faites faire une copie complète du site et de la base, même infectée.
- Coupez les accès de l’attaquant : retirez ses droits au compte inconnu (rôle Abonné / abonnée) au lieu de le supprimer, et fermez ses sessions.
- Changez tous les mots de passe : administrateurs de WordPress, FTP ou SFTP, espace client de l’hébergeur, base de données. Tous les accès, pas seulement le vôtre.
- Renouvelez les clés de sécurité de
wp-config.php. Tous les comptes connectés sont déconnectés, y compris celui de l’attaquant. - Remettez les fichiers d’origine, dans la même version que celle installée : WordPress conseille de remplacer
wp-adminetwp-includesen entier, puis de traiter extensions et thèmes un par un. Vérifiez aussi les fichiers.htaccess. - Trouvez la porte d’entrée (extension vulnérable, mot de passe volé), corrigez-la, puis mettez à jour WordPress, les extensions et les thèmes.
- Changez les mots de passe une seconde fois, une fois le site propre.
Bonjour,
Nous pensons que notre site WordPress a été piraté : [décrivez ce que vous avez vu, avec la date et l’heure].
Pouvez-vous, sans rien supprimer pour l’instant :
- faire une copie complète du site et de la base de données, à garder pour l’analyse ;
- lancer « wp core verify-checksums » et « wp plugin verify-checksums –all », et nous transmettre le résultat ;
- chercher les fichiers PHP présents dans wp-content/uploads ;
- lister les comptes administrateurs directement dans la base de données ;
- nous transmettre les logs d’accès du serveur web des 30 derniers jours.
Merci de nous dire aussi si d’autres sites hébergés sur le même serveur sont touchés.
Merci.
Vous gérez le serveur : vérifier l’intégrité de WordPress avec WP-CLI
WP-CLI s’installe en un fichier (voir son guide d’installation). Lancez-le toujours avec l’utilisateur propriétaire des fichiers du site, ici www-data, jamais en root : le projet WP-CLI rappelle que tout le code du site, extensions comprises, aurait alors les pleins pouvoirs sur le serveur. Sur un site piraté, ce code est justement suspect.
Les exemples supposent un site dans /var/www/site ; remplacez le chemin par le vôtre.
-
Le cœur de WordPress.
wp core verify-checksumstélécharge les empreintes officielles de votre version et les compare à vos fichiers. Il ne charge pas WordPress pour le faire, donc aucun code du site ne s’exécute.Terminalsudo -u www-data wp core verify-checksums --path=/var/www/siteSur un site sain :
Success: WordPress installation verifies against checksums.Sur notre site de test, après avoir modifié un fichier du cœur et ajouté un autre :Résultat sur un site de testWarning: File doesn't verify against checksum: wp-includes/functions.php Warning: File should not exist: wp-includes/class-wp-cache-helper.php Error: WordPress installation doesn't verify against checksums.doesn't verify: fichier modifié.should not exist: fichier ajouté dans un dossier du cœur. L’option--include-rootajoute les fichiers inconnus de la racine du site. Si votre WordPress est dans une autre langue, ajoutez--locale=fr_FRen cas de doute. -
Les extensions.
wp plugin verify-checksums --allfait la même chose pour chaque extension publiée sur WordPress.org.Terminalsudo -u www-data wp plugin verify-checksums --all --path=/var/www/siteRésultat sur un site de testWarning: Could not retrieve the checksums for version 1.0 of plugin mon-extension-maison, skipping. plugin_name file message akismet akismet.php Checksum does not match Error: Only verified 1 of 3 plugins (1 failed, 1 skipped).Une extension achetée ou développée sur mesure n’a pas d’empreintes sur WordPress.org : elle est ignorée (
skipped). Comparez-la à l’archive fournie par son éditeur. WP-CLI n’a pas de commande équivalente pour les thèmes. -
Les comptes administrateurs.
--skip-plugins --skip-themesévite de charger les extensions et le thème, donc le code qui pourrait masquer un compte. Attention : les extensions demu-pluginsse chargent quand même.Terminalsudo -u www-data wp user list --role=administrator --fields=ID,user_login,user_email,user_registered --skip-plugins --skip-themes --path=/var/www/siteRésultat sur un site de testID user_login user_email user_registered 2 assistance assistance@example.net 2026-10-23 00:58:28 1 gerant gerant@example.com 2026-10-23 00:58:11Pour contourner tout filtre, lisez la base directement. Cette requête liste les comptes dont les droits contiennent
administrator. Remplacezwp_par le préfixe de vos tables, que donnewp db prefix:Client MySQL ou MariaDB, ou « wp db query »SELECT u.ID, u.user_login, u.user_email, u.user_registered FROM wp_users u JOIN wp_usermeta m ON m.user_id = u.ID WHERE m.meta_key = 'wp_capabilities' AND m.meta_value LIKE '%administrator%';Un compte présent ici mais absent de Comptes > Tous les comptes est caché : c’est une intrusion.
-
Les fichiers exécutables dans
uploads.Terminalfind /var/www/site/wp-content/uploads -type f \( -name '*.php*' -o -name '*.phtml' -o -name '*.phar' \) -printLa commande ne doit rien afficher. Chaque ligne affichée est à copier pour l’analyse, puis à retirer.
Les fichiers
.htaccess, eux, sont souvent légitimes : Contact Form 7 et WooCommerce en déposent un dans leurs dossiers (wpcf7_uploads,woocommerce_uploads,wc-logs,wc-imports) justement pour en interdire l’accès. Affichez-les avec leur contenu :Terminalfind /var/www/site/wp-content/uploads -type f -name '.htaccess' -exec sh -c 'echo "== $1"; cat "$1"' _ {} \;Un fichier légitime ne fait qu’interdire l’accès : « Deny from all » ou « Require all denied », parfois entourés de lignes
<IfModule>. Toute autre instruction, en particulierAddHandler,AddType,SetHandlerouphp_value, sert à faire exécuter du code dansuploads: copiez le fichier pour l’analyse, puis retirez-le. -
Les extensions toujours chargées.
Terminalsudo -u www-data wp plugin list --status=must-use --skip-plugins --skip-themes --path=/var/www/site sudo -u www-data wp plugin list --status=dropin --skip-plugins --skip-themes --path=/var/www/site
Remettre WordPress en état avec WP-CLI
Une fois la copie de sauvegarde faite, ces commandes appliquent la marche à suivre. L’exemple traite le compte n° 2 de notre site de test.
Pour les développeurs
wp core verify-checksums s’exécute avant le chargement de WordPress : c’est la seule de ces commandes qui ne lance aucun code du site. wp plugin verify-checksums, wp user list et les commandes de remise en état chargent WordPress. Sur un site très atteint, faites ces vérifications sur une copie isolée du site, ou lisez la base avec la requête SQL plutôt qu’avec WP-CLI.
Ces vérifications ont leur équivalent sur Magento : voir repérer un compte administrateur suspect et que faire quand Magento 2 est piraté.
Tocsin24 surveille votre WordPress entre deux vérifications
WP-CLI donne une photo à un instant donné. Avec l’extension Tocsin24 installée, la surveillance continue, indépendamment de vos extensions de sécurité : l’extension relève l’état du site, et Tocsin24 l’analyse sur ses propres serveurs.
Les comptes. Tocsin24 signale tout nouveau compte administrateur, et un compte à droits sensibles présent dans la base mais caché de la liste des comptes (« Compte administrateur masqué »).
Les fichiers. L’extension relève les fichiers du cœur, des extensions, des extensions must-use et des thèmes toutes les heures. Au premier passage complet, Tocsin24 garde ce relevé comme référence. Il signale ensuite tout fichier modifié, ajouté ou supprimé en dehors d’une mise à jour reconnue, ainsi que les fichiers malveillants connus. Il surveille aussi les fichiers inattendus dans uploads, en alerte critique pour un fichier PHP ou un script.
Les extensions. Une nouvelle extension, un nouveau thème, une extension retirée de WordPress.org ou abandonnée sont signalés.
Tocsin24 ne bloque rien et ne nettoie rien : il complète votre extension de sécurité, comme expliqué sur la page WordPress. La référence étant prise à l’installation de l’extension, lancez une fois wp core verify-checksums à ce moment-là pour partir d’un site sain.
Critique Ouvert #318
Nouveau — compte administrateur : assistance
Sécurité · détecté le 23 octobre 2026 à 01:04 · 1 occurrence
Traiter l'incident
Compte concerné Relevé du 23 octobre 2026 à 01:04
Compte administrateur inconnu du référentiel, apparu sur l'instance. Vérifiez qui l'a créé avant de le valider.
- Identifiant
- assistance
- Nom
- Assistance technique
- assistance@example.net
- Rôles
- administrator
- Liste des utilisateurs
- présent
- Inscrit le
- 23 oct. 00:58
Critique Ouvert #319
Nouveau — fichier uploads : 2026/10/image-cache.php
Sécurité · détecté le 21 octobre 2026 à 14:37 · 1 occurrence
Traiter l'incident
Fichier concerné Relevé du 21 octobre 2026 à 14:37
Fichier PHP ou script présent dans un dossier de téléversement : webshell probable.
- Chemin
- wp-content/uploads/2026/10/image-cache.php
- Extension
- php
- Taille
- 3 Ko
- Modifié le
- 21 oct. 14:32
- Empreinte
- 9f2c…41d7
Preuve détaillée dans « Historique et preuves ».
Écrans de l’application avec des valeurs d’exemple.
Questions fréquentes
Comment savoir si mon site WordPress a été piraté ?
Les signes visibles : redirections vers d’autres sites, contenus ajoutés, alerte de Google ou de votre hébergeur. Les signes discrets : un administrateur que personne ne connaît, et des fichiers qui ne correspondent plus aux originaux. wp core verify-checksums et wp plugin verify-checksums --all les repèrent en quelques secondes.
Faut-il supprimer tout de suite un administrateur inconnu ?
Retirez-lui d’abord ses droits (rôle Abonné / abonnée) et fermez ses sessions : il ne peut plus rien faire, et vous gardez la trace de sa création pour l’enquête. Supprimez-le une fois l’intrusion comprise.
Un fichier PHP dans wp-content/uploads, est-ce grave ?
Oui. Ce dossier ne doit contenir que des médias. Un fichier PHP y est presque toujours une porte dérobée déposée par un attaquant. Faites-en une copie pour l’analyse avant de le retirer, et considérez le site comme compromis.
Réinstaller WordPress suffit-il à nettoyer un site piraté ?
Non. Une réinstallation remplace les fichiers existants mais laisse les fichiers ajoutés : vérifiez à nouveau avec wp core verify-checksums. Il faut aussi changer tous les mots de passe et les clés de wp-config.php, et trouver la faille utilisée, sinon l’attaquant revient.
Mon extension de sécurité n’a rien vu. Est-ce normal ?
Cela arrive. Une extension tourne dans WordPress, comme le code de l’attaquant, qui peut la contourner. Une vérification faite de l’extérieur (WP-CLI, comparaison aux originaux, surveillance séparée) complète utilement l’extension.
Sources
- WordPress : FAQ My site was hacked
- WordPress : Hardening WordPress (surveillance des fichiers)
- WordPress : wp-config.php, clés de sécurité
- WordPress : rôles et capacités
- WordPress : filtre pre_user_query
- CNIL : notifier une violation de données personnelles
- WP-CLI : wp core verify-checksums
- WP-CLI : wp plugin verify-checksums
- WP-CLI : wp user list
- WP-CLI : wp user set-role
- WP-CLI : wp user session destroy
- WP-CLI : wp config shuffle-salts
- WP-CLI : wp core download
- WP-CLI : wp plugin install
- WP-CLI : paramètres globaux (--skip-plugins, --skip-themes)
- WP-CLI : problèmes courants (ne pas lancer WP-CLI en root)
- WP-CLI : installation