Sécurité · WordPress

WordPress piraté ? Repérer un nouvel administrateur ou un fichier modifié

Quand un WordPress est piraté, l’attaquant laisse presque toujours deux traces : un compte administrateur qu’il s’est créé, et des fichiers ajoutés ou modifiés pour garder la main. Voici comment les repérer depuis l’administration, puis avec WP-CLI en comparant vos fichiers aux originaux de WordPress, et quoi faire dans l’ordre pour reprendre le contrôle sans effacer les preuves.

Illustration : la cloche rouge de Tocsin24 sonne au-dessus d'une liste de comptes dont le dernier, surligné en bleu, vient d'apparaître, à côté de fichiers examinés à la loupe.

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-checksums et wp plugin verify-checksums --all comparent 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.

  1. Connectez-vous à l’administration de WordPress, menu Comptes > Tous les comptes.
  2. Au-dessus de la liste, cliquez sur le filtre Administrateur/administratrice.
  3. 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.
  4. 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/uploads ne doit contenir que des images, des documents et des vidéos. Un fichier .php y 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).
/var/www/site/wp-content/uploads/2026/10
NomTailleModifié
..
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
Exemple. Un fichier PHP au milieu des médias du mois : il n’a rien à faire là.

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Remettez les fichiers d’origine, dans la même version que celle installée : WordPress conseille de remplacer wp-admin et wp-includes en entier, puis de traiter extensions et thèmes un par un. Vérifiez aussi les fichiers .htaccess.
  6. 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.
  7. Changez les mots de passe une seconde fois, une fois le site propre.
Message à votre hébergeur ou à votre agence

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 :

  1. faire une copie complète du site et de la base de données, à garder pour l’analyse ;
  2. lancer « wp core verify-checksums » et « wp plugin verify-checksums –all », et nous transmettre le résultat ;
  3. chercher les fichiers PHP présents dans wp-content/uploads ;
  4. lister les comptes administrateurs directement dans la base de données ;
  5. 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.

  1. Le cœur de WordPress. wp core verify-checksums té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.

    Terminal
    sudo -u www-data wp core verify-checksums --path=/var/www/site

    Sur 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 test
    Warning: 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-root ajoute les fichiers inconnus de la racine du site. Si votre WordPress est dans une autre langue, ajoutez --locale=fr_FR en cas de doute.

  2. Les extensions. wp plugin verify-checksums --all fait la même chose pour chaque extension publiée sur WordPress.org.

    Terminal
    sudo -u www-data wp plugin verify-checksums --all --path=/var/www/site
    Résultat sur un site de test
    Warning: 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.

  3. 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 de mu-plugins se chargent quand même.

    Terminal
    sudo -u www-data wp user list --role=administrator --fields=ID,user_login,user_email,user_registered --skip-plugins --skip-themes --path=/var/www/site
    Résultat sur un site de test
    ID 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:11

    Pour contourner tout filtre, lisez la base directement. Cette requête liste les comptes dont les droits contiennent administrator. Remplacez wp_ par le préfixe de vos tables, que donne wp 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.

  4. Les fichiers exécutables dans uploads.

    Terminal
    find /var/www/site/wp-content/uploads -type f \( -name '*.php*' -o -name '*.phtml' -o -name '*.phar' \) -print

    La 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 :

    Terminal
    find /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 particulier AddHandler, AddType, SetHandler ou php_value, sert à faire exécuter du code dans uploads : copiez le fichier pour l’analyse, puis retirez-le.

  5. Les extensions toujours chargées.

    Terminal
    sudo -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.

Terminal
Retirer ses droits au compte suspect, sans le supprimer sudo -u www-data wp user set-role 2 subscriber --path=/var/www/site Fermer toutes ses sessions sudo -u www-data wp user session destroy 2 --all --path=/var/www/site Renouveler les clés de wp-config.php : tout le monde est déconnecté sudo -u www-data wp config shuffle-salts --path=/var/www/site Remettre le cœur d'origine, même version, sans toucher à wp-content sudo -u www-data wp core download --force --skip-content --version=$(sudo -u www-data wp core version --path=/var/www/site) --path=/var/www/site Remettre une extension d'origine, même version (ici akismet 5.7.2) sudo -u www-data wp plugin install akismet --force --version=5.7.2 --path=/var/www/site Vérifier à nouveau sudo -u www-data wp core verify-checksums --path=/var/www/site
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
E-mail
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.

Portrait de Cédric Michel

Cédric Michel

Cédric développe des boutiques Magento depuis 18 ans et détient la certification Adobe Commerce Developer Expert. Il a créé Tocsin24 pour surveiller la sécurité et la santé des boutiques Magento 2 et des sites WordPress.

Badge Adobe Commerce Developer Expert Adobe Commerce Developer Expert
Vérifier la certification sur le site d’Adobe

Sources

  1. WordPress : FAQ My site was hacked
  2. WordPress : Hardening WordPress (surveillance des fichiers)
  3. WordPress : wp-config.php, clés de sécurité
  4. WordPress : rôles et capacités
  5. WordPress : filtre pre_user_query
  6. CNIL : notifier une violation de données personnelles
  7. WP-CLI : wp core verify-checksums
  8. WP-CLI : wp plugin verify-checksums
  9. WP-CLI : wp user list
  10. WP-CLI : wp user set-role
  11. WP-CLI : wp user session destroy
  12. WP-CLI : wp config shuffle-salts
  13. WP-CLI : wp core download
  14. WP-CLI : wp plugin install
  15. WP-CLI : paramètres globaux (--skip-plugins, --skip-themes)
  16. WP-CLI : problèmes courants (ne pas lancer WP-CLI en root)
  17. WP-CLI : installation