Site WordPress infecté : les signes qui ne trompent pas

Un site WordPress infecté ne se trahit pas toujours par un message spectaculaire du style “hacked”. Le plus souvent, les premiers signaux sont discrets, presque gênants, puis ils s’additionnent jusqu’à devenir impossibles à ignorer. Et plus on attend, plus on laisse la porte ouverte à la propagation, au référencement empoisonné, ou à des actions qui échappent même à vos admins.

Dans cet article, je vais passer en revue les signes qui reviennent sans cesse lors d’investigations réelles, ceux qui méritent une vérification immédiate, et la façon de raisonner quand plusieurs hypothèses se disputent la même observation. L’objectif n’est pas de paniquer, c’est de détecter vite et de traiter proprement.

La première impression qui ne devrait jamais vous laisser tranquille

Quand un site est infecté, la première alerte n’est pas forcément technique. Elle peut être “métier”. Un jour, vous remarquez que les performances chutent, puis que certaines pages affichent un contenu bizarre, et enfin que votre trafic s’effondre. Sur WordPress, ce scénario se voit très souvent parce que l’infection ne se limite pas à une page truquée. Elle peut aussi ajouter des tâches cachées, des scripts de chargement distants, ou des appels réseau invisibles au premier coup d’œil.

J’ai déjà vu des sites qui semblaient “juste lents” pendant une semaine. Puis en ouvrant les logs d’erreurs, on tombait sur un mécanisme de redirection vers des pages externes. La lenteur était un effet secondaire, pas la cause. Si vous observez un changement de comportement, traitez-le comme un symptôme, pas comme un accident.

Ce qui doit alerter dans vos observations quotidiennes, ce sont les écarts. Une chute soudaine du trafic depuis un pays ou un navigateur précis, des formulaires qui “fonctionnent” mais envoient des données ailleurs, une surcharge CPU pendant des heures fixes. Un site WordPress infecté se comporte souvent comme s’il avait une routine.

Les signes côté visiteurs (ce que vous verrez, même sans outils)

Certains signaux sont très visibles. D’autres passent pour des bugs ordinaires. La frontière se fait sur la cohérence: si le problème apparaît de façon répétable et non aléatoire, c’est souvent un automatisme.

Parmi les indicateurs typiques, on trouve:

    des pages qui affichent du texte qui n’a jamais été rédigé, souvent en anglais ou dans un style très générique; des redirections en chaîne, parfois vers une URL “look-alike”, ou vers des pages d’ads; des scripts supplémentaires qui changent le comportement de la page (popups, click fraud, chargement de ressources externes); des contenus qui varient selon le profil (par exemple, un contenu différent selon l’agent utilisateur, l’IP, ou l’heure). Ce genre de ciblage indique souvent une mise en place d’injection.

Le piège, c’est de croire que tout vient d’un thème ou d’un plugin. Oui, un plugin peut casser une page. Mais un plugin légitime ne devrait pas, de lui-même, rediriger vers des domaines improbables, ni créer des “posts” ou “pages” sans explication, ni modifier des fichiers du noyau.

Si vous consultez votre site sur plusieurs navigateurs (et idéalement sur un réseau différent), vous gagnez un indice immédiat. Une infection réagit souvent de manière déterministe, alors qu’un problème de compatibilité est plus “bruyant” et variable.

image

https://gardewp.fr/

Les signes côté administration (ce que vous pouvez vérifier rapidement)

WordPress expose de nombreux points d’observation. Un site infecté laisse des traces, parfois discrètes.

Un signal très courant est l’apparition d’utilisateurs fantômes, ou de rôles qui n’ont aucun sens. Je parle de comptes créés sans que vous ne l’ayez demandé, avec des noms d’utilisateurs “génériques” ou des emails aléatoires. Même si ces comptes ne sont pas utilisés, leur présence suffit à dire que quelqu’un a obtenu un accès.

Autre observation fréquente: des fichiers ajoutés dans des dossiers inattendus, ou des modifications de fichiers qui ne devraient pas être touchés. Les scripts malveillants peuvent se glisser dans des répertoires où WordPress n’écrit pas de manière normale. Ils peuvent aussi se cacher derrière des noms trompeurs.

Vous pouvez aussi voir apparaître des tâches planifiées, via WP-Cron, qui exécutent des actions à des moments précis. Dans les cas d’injection, on observe parfois des requêtes réseau répétées toutes les minutes, ce qui finit par ralentir le serveur et dérégler le comportement global.

Enfin, un classique: le panneau d’administration devient moins stable. Il peut charger plus lentement, déclencher des erreurs PHP, ou afficher des formulaires “bizarres” lors de l’édition. Ce n’est pas une preuve absolue, mais c’est un signal fort quand cela s’accompagne d’autres anomalies.

Les indicateurs dans les emails et la console navigateur

Beaucoup d’attaques ciblent la couche “interaction”. Un formulaire qui envoie des messages à votre email comme d’habitude peut être en réalité un formulaire qui envoie aussi des copies vers une destination externe. Sans instrumenter, https://gardewp.fr/nettoyage-malware-wordpress/ vous ne verrez pas forcément l’export.

C’est là que les indices pratiques comptent. Si vous recevez des emails de notification que vous n’attendiez pas, ou si vos emails “sortants” changent de contenu, c’est suspect. Sans entrer dans des affirmations impossibles, on observe souvent que les campagnes malveillantes ont besoin de relais: elles s’appuient sur des formulaires, sur des plugins d’analytics “de substitution”, ou sur des injections qui masquent des traces.

Côté navigateur, regardez ce qui se charge. Les signes typiques, ce sont des scripts provenant de domaines que vous n’avez jamais ajoutés, ou des ressources qui apparaissent en cascade. Même si un site semble “propre” à l’écran, le réseau peut raconter l’histoire. Un site WordPress infecté peut charger une ressource externe qui se contente d’injecter du code après le rendu.

Le référencement qui déraille, et le moment où tout se mélange

Un autre point qui trompe: le référencement. Une infection peut viser le SEO de façon opportuniste. Le site peut commencer à apparaître pour des requêtes improbables, puis perdre ses positions habituelles. Parfois, la page servie aux robots n’est pas la page servie aux utilisateurs.

En pratique, les deux symptômes qui se ressemblent le plus sont la perte de trafic organique et l’apparition de pages inconnues. Vous pouvez aussi voir des “sitelinks” ou des pages de type “spammy” remonter, alors que vous ne les publiez pas.

Je recommande une approche simple: comparer vos pages indexées réelles à ce que vous publiez. Si vous voyez des URLs qui ne correspondent à aucun contenu, ou si vous observez des pages qui ne ressemblent à rien, considérez que l’infection a probablement manipulé l’indexation ou l’affichage.

Il y a aussi un cas que j’ai vu plusieurs fois: un site infecté qui redirige certains utilisateurs vers des pages “pub” pour revaloriser un domaine tiers. Vous pouvez croire que l’attaque est “légère” parce que vous ne voyez pas de defacement. Le SEO, lui, révèle le reste.

Vérifier les fichiers et le code: ce qui fait pencher la balance

On arrive au volet où la décision se joue dans le réel, pas dans l’intuition. Une infection se manifeste souvent par des modifications de fichiers, ou par la présence de code qui n’a aucun rôle légitime dans votre WordPress.

Les signaux classiques sont:

    fichiers ajoutés dans des dossiers non attendus (ou à des chemins très “propres” mais faux); codes conditionnels “bizarres” qui vérifient des en-têtes HTTP, des IP, ou la langue; appels à des URLs distantes pour télécharger des charges utiles; usage de fonctions PHP rarement légitimes dans votre contexte, ou de chargements de fichiers qui ne devraient pas exister.

Le problème, c’est que tout changement n’est pas une infection. Un plugin peut ajouter un fichier, un thème peut ajouter du PHP, un framework peut charger des dépendances. La clé, c’est la comparaison avec une base saine.

Si vous avez des sauvegardes, même vieilles, servez-vous-en. Comparez les fichiers modifiés récents à l’état précédent. Si vous n’avez pas de sauvegarde utilisable, vous pouvez encore avancer, mais avec plus de prudence: prenez des copies, documentez, et ne “nettoyez” pas à l’aveugle en supprimant des choses au hasard. Supprimer sans comprendre peut casser votre site et compliquer la preuve technique.

La checklist de signaux immédiats à traiter en priorité

Quand vous suspectez un site WordPress infecté, il faut trier. Tout n’a pas le même impact, et tout ne requiert pas la même urgence. Voici les vérifications que je privilégie en premier, parce qu’elles donnent souvent une réponse nette, ou au moins une piste solide.

Vérifiez l’existence d’utilisateurs créés récemment, et contrôlez leurs rôles. Examinez les fichiers récemment modifiés via votre panneau d’hébergement ou via un diff avec une sauvegarde antérieure. Contrôlez les plugins et thèmes ajoutés ou mis à jour juste avant l’apparition des anomalies. Analysez les pages qui affichent du contenu différent selon le navigateur ou la géolocalisation, en testant sur plusieurs contextes. Consultez les logs (erreurs PHP, logs du serveur, et éventuellement logs de votre WAF) pour repérer des requêtes répétitives vers des endpoints inconnus.

Cette checklist ne remplace pas une investigation complète. Elle sert à accélérer le triage, surtout quand vous devez agir pendant que l’infection est active.

Pourquoi “ça marche” peut quand même vouloir dire “c’est compromis”

C’est l’un des aspects les plus frustrants. Votre site peut être accessible, vos pages peuvent s’afficher, vos formulaires peuvent envoyer des données, et pourtant l’attaque être réelle.

Le compromis peut être orthogonal à votre visibilité. Un attaquant peut installer une porte dérobée qui attend une condition précise, par exemple une heure précise, une session, un type de navigateur, ou un paramètre GET. Il peut aussi se contenter de maintenir une boucle d’exfiltration discrète sans afficher de contenu.

Autre scénario: l’infection affecte uniquement les visiteurs “non humains”, robots d’indexation ou navigateurs spécifiques. À l’écran, vous ne voyez rien. C’est souvent ce qui rend la détection tardive: vous testez avec votre navigateur habituel, et vous voyez un site normal.

D’où l’intérêt de ne pas se limiter à “est-ce que c’est affiché?”. Regardez aussi “est-ce que ça se comporte comme avant”, au niveau performance, réseau, et logs.

Le piège des faux positifs: erreurs, cache, et plugins qui changent tout

Toutes les anomalies ne signifient pas intrusion. Un plugin de cache peut provoquer des comportements étranges. Un CDN peut servir une version obsolète. Un thème mal mis à jour peut casser des pages, et l’écran peut sembler “infecté” alors que c’est un bug.

image

Pour ne pas vous tromper, je fais souvent une séparation mentale entre symptômes “visuels” et symptômes “systémiques”.

    Si le problème est uniquement visuel, localisé à quelques pages, et stable après purge du cache, c’est possiblement une configuration ou une compatibilité. Si le problème s’accompagne de comportements récurrents dans les logs, de modifications de fichiers, ou de chargements réseau inattendus, alors l’hypothèse d’un site WordPress infecté devient beaucoup plus plausible.

Il existe aussi des cas hybrides, où un plugin compromis ne provoque pas forcément de defacement. Il ajoute des scripts, mais l’utilisateur ne voit rien. Dans ce cas, le “faux positif” n’est plus un confort, c’est une perte de temps.

L’accès: comment l’attaque s’installe, et ce que cela change pour la suite

Quand on parle d’infection, on pense souvent à un fichier. Pourtant, la majorité des compromissions commence par un accès. Ça peut être un mot de passe réutilisé, une faille dans un plugin, une permission trop large, ou une session qui a été détournée.

Pourquoi c’est important? Parce que votre réponse doit être proportionnelle. Si la compromission vient d’un plugin vulnérable, nettoyer le code injecté ne suffit pas, il faut aussi combler la faille et surveiller les vecteurs.

J’ai déjà vu des équipes réinstaller WordPress propre, puis constater que l’infection revient. Le nettoyage avait retiré l’effet, pas la cause. La cause était une mise à jour non appliquée, ou un thème obsolète, ou une règle de firewall absente.

Comment décider de votre prochaine action: réparer, restaurer, ou repartir de zéro

Il y a un point de bascule mental qu’on atteint plus souvent qu’on ne le croit: “on nettoie” versus “on restaure”.

Si vous avez une sauvegarde antérieure fiable, et si le code compromis est localisable, restaurer et corriger les causes est souvent le chemin le plus sûr. Si vous n’avez pas de sauvegarde, vous pouvez quand même procéder, mais le coût augmente: vous devrez analyser plus finement, vérifier l’intégrité, et accepter une part d’incertitude tant que vous ne pouvez pas comparer à un état sain.

Un autre facteur est la surface. Un site simple avec peu de plugins se récupère plus vite qu’un site complexe avec une dizaine de dépendances et des customizations. L’infection peut aussi toucher la base de données. Dans ce cas, un nettoyage de fichiers ne suffira pas, parce que le comportement injecté peut provenir de contenus stockés en base.

Je ne peux pas vous donner une règle universelle. Sur le terrain, je tranche en combinant trois éléments: evidence de modification, capacité à restaurer, et probabilité que l’accès initial soit encore actif.

Les signes qui reviennent après le “nettoyage” (et qui indiquent que ce n’est pas fini)

Le nettoyage n’est pas un bouton, c’est une période de validation.

Si, après restauration ou suppression de fichiers, vous voyez rapidement revenir:

    des utilisateurs réapparaître, des fichiers réémerger, des pages inconnues redevenir indexées, des scripts réseau réapparaître,

Alors l’infection n’était pas éliminée à la racine. Dans certains cas, c’est aussi une question de persistance: l’attaquant garde un mécanisme en place, ou vous restaurez partiellement sans repasser par un état sain.

C’est pour cette raison que je conseille systématiquement une “fenêtre de surveillance” après la correction. Sur quelques jours, vous observez les logs, les modifications, et vous gardez un œil sur les performances. Le but n’est pas de vivre dans l’anxiété, c’est de confirmer que le problème ne rebondit pas.

Un mini guide de lecture des indices (sans transformer la détection en superstition)

Vous avez peut-être remarqué que beaucoup de signes possibles se recoupent. C’est normal, car une infection est un ensemble d’effets et de symptômes. Ce qui compte, c’est la convergence des preuves.

Si un seul symptôme apparaît, comme un “contenu bizarre” sur une page, je ne saute pas directement à “hacker”. Je cherche d’abord la source: un plugin? Un thème? Un cache? Ensuite seulement je passe à la vérification du code et des utilisateurs.

En revanche, dès que vous combinez au moins deux catégories de preuves, par exemple “utilisateurs créés” plus “fichiers modifiés”, vous êtes très proche d’une réponse claire. Ce n’est pas une certitude absolue, mais c’est un signal fort.

La meilleure attitude consiste à documenter chaque observation. Notez la date de début, la version de WordPress, les plugins récemment ajoutés, et ce que vous avez changé. Cette traçabilité évite de réparer en aveugle et rend la détection plus rationnelle.

Ce que j’ai tendance à regarder en premier, quand le stress monte

Quand on intervient en urgence, le temps manque et les décisions doivent être prises sans erreurs grossières. Dans ce contexte, je privilégie des actions qui réduisent le risque.

Je commence par limiter les accès tant que l’on n’a pas compris. Ensuite, j’évalue la cohérence de votre environnement: base de données, fichiers, scripts ajoutés. Et je compare avec un état sain si possible.

Voici une seconde liste, plus opérationnelle, qui peut aider à cadrer un plan d’action immédiat. Elle reste volontairement courte.

    Mettre le site en mode maintenance ou limiter l’accès pour empêcher la propagation pendant l’analyse. Désactiver temporairement les plugins récemment installés ou mis à jour, si vous pouvez le faire sans perdre l’accès. Réaliser une copie forensique (au minimum, une sauvegarde complète et horodatée) avant de supprimer ou remplacer des fichiers. Restaurer depuis une sauvegarde connue saine si la compromission touche la base de données ou si vous ne pouvez pas identifier proprement la persistance. Mettre à jour WordPress, thèmes et plugins après assainissement, puis vérifier que l’accès initial n’est plus possible.

Renforcer le site après nettoyage, sans créer un nouveau problème

Assainir un site WordPress infecté, c’est aussi remettre le système dans un état où l’infection n’a pas trop d’occasions de revenir.

Au-delà des mises à jour, il y a des points de rigueur qui font une vraie différence en pratique: mots de passe uniques, limitation des tentatives, durcissement des rôles, réduction des permissions des comptes, et contrôle de la liste des plugins réellement nécessaires. Plus votre WordPress est “minimal”, moins vous avez de surface d’attaque.

Attention toutefois aux “super protections” qui cassent le site. Si vous activez une règle trop agressive à la hâte, vous pouvez bloquer des fonctionnalités légitimes, ou rendre la maintenance impossible. Le bon équilibre, c’est une protection par étapes, avec test.

Je recommande aussi une politique simple pour les fichiers: surveiller les changements et empêcher les écritures non prévues. WordPress a besoin d’écrire, mais pas n’importe où, ni n’importe quand.

Le cas concret qui résume tout: trois symptômes, une même origine

Je termine avec un exemple typique, anonymisé, parce qu’il illustre la logique.

Sur un site vitrine, l’équipe a d’abord remarqué que la vitesse variait, puis que deux pages affichaient parfois des encarts publicitaires. Ensuite, via un outil de sécurité, ils ont vu des URLs non publiées dans l’index. En examinant les fichiers, on a trouvé un petit script ajouté dans un répertoire pas fait pour cela, et un utilisateur créé avec un rôle trop élevé. Le plugin récemment mis à jour contenait une faiblesse exploitable, et c’est ce vecteur qui avait permis de déposer la charge.

Le nettoyage à lui seul aurait laissé la porte ouverte. Le vrai traitement consistait à restaurer depuis un état sain, supprimer la persistance, corriger le plugin, puis durcir les accès. Trois symptômes, une cohérence. C’est ce que vous cherchez, quand vous évaluez si vous êtes face à un site WordPress infecté, ou à un simple bug.

Ce que vous pouvez faire dès maintenant, si vous suspectez une infection

Si vous êtes au stade “je ne suis pas sûr”, ne restez pas dans le flou. Commencez par des vérifications concrètes: utilisateurs, modifications de fichiers, plugins récemment changés, et comportement réseau. Une fois que vous avez un faisceau d’indices, l’action devient moins subjective.

Et surtout, gardez une règle qui évite beaucoup de dégâts: avant de supprimer, sauvegardez et documentez. Les infections ne demandent pas qu’on soit intraitable, elles demandent qu’on soit méthodique.

Votre site peut redevenir fiable, mais il faut traiter le problème correctement, pas seulement l’effet visible. Les signes ne trompent pas, à condition de les lire comme un ensemble cohérent, et pas comme des alertes isolées.