Nettoyage virus WordPress : corriger les erreurs après suppression du malware

Quand on parle de nettoyage virus WordPress, beaucoup pensent que le travail s’arrête le jour où le fichier malveillant est supprimé. Sur le terrain, ce n’est presque jamais aussi simple. La suppression d’un malware, c’est le moment où l’intrusion s’arrête. Mais les dégâts, eux, continuent souvent de produire des symptômes: pages qui n’affichent plus correctement, redirections impossibles, formulaires qui se mettent à renvoyer des erreurs, accès au back-office impossible, ou encore une fuite de réputation côté moteurs de recherche.

Dans cet article, je vais détailler ce qui se passe après une désinfection, pourquoi des “erreurs bizarres” apparaissent, et comment recadrer l’installation WordPress pour qu’elle redevienne stable. Je m’appuie sur des situations réelles: celles où le site semblait “nettoyé”, mais où l’on découvrait ensuite que le malware avait modifié des fichiers clés, injecté des chargeurs dans le thème, corrompu la base de données, ou laissé des traces dans le cache.

Ce qui reste après la suppression du malware

Un site infecté finit rarement dans un état “propre” au moment de la suppression. Un malware WordPress agit comme un cambrioleur organisé: il ne se contente pas d’entrer, il réarrange aussi des serrures, laisse des doubles des clés, et parfois abîme le mur pour faire passer un câble. Quand on retire l’intrus, le logement peut encore présenter des dysfonctionnements.

Les cas les plus fréquents après nettoyage sont:

    des fichiers “patched” qui gardent des modifications: un thème ou un plugin contient encore des ajouts invisibles, ou bien la suppression a cassé un bout de code indispensable à la page; une base de données modifiée: options changées, utilisateurs créés, entrées ajoutées dans les tables, paramètres de cron ou d’URL manipulés; des règles côté serveur ou de contrôle qui ont été écrasées: parfois, un script malveillant a modifié des fichiers de configuration, ou laissé un comportement inattendu au niveau du reverse proxy, du cache, ou du WAF; des dépendances cassées: en supprimant trop vite, on retire aussi des fichiers légitimes, ou on remplace un thème par une version incomplète.

L’erreur que vous voyez à l’écran est un indice, mais elle n’est pas toujours directement liée au point d’entrée. Parfois, l’erreur vient du nettoyage lui-même.

Les symptômes typiques et ce qu’ils racontent

Un site WordPress après désinfection peut présenter plusieurs types d’erreurs. L’idée n’est pas de deviner au hasard, mais de relier chaque symptôme à une cause probable.

Pages blanches, erreur 500, ou “résultat inattendu”

Un “white screen” ou une erreur 500 après nettoyage est souvent lié à une incohérence PHP. Le malware a pu remplacer une fonction, tronquer un fichier, ou vous avez peut-être supprimé un fichier dont dépendait réellement l’exécution. Le plus parlant, c’est le journal d’erreurs PHP.

Dans un contexte réel, j’ai déjà vu une équipe qui avait supprimé des lignes suspectes dans un plugin, mais sans vérifier la structure des accolades. Le résultat: une fatal error déclenchée dès que WordPress charge le plugin, donc rien ne s’affiche. La suppression était correcte sur le fond, mais la méthode a provoqué une casse.

image

Redirections vers des domaines bizarres

Les redirections sont un marqueur classique. Elles peuvent être écrites dans un thème (functions.php), dans un plugin de type “SEO” ou “social”, ou encore dans des champs de la base. Dans certains incidents, les redirections ne se déclenchent que pour des user-agents spécifiques, ce qui donne l’impression que “ça marche parfois”.

Quand la redirection disparaît après nettoyage, mais qu’elle revient quand même, c’est souvent parce qu’un autre point d’injection reste actif, ou parce que le cache du CDN ou du serveur conserve une réponse déjà empoisonnée.

Back-office inaccessible, ou identifiants qui ne fonctionnent plus

Si vous ne retrouvez plus l’accès à wp-admin, il faut penser à trois choses: des utilisateurs créés puis privés, des rôles modifiés, ou un fichier de verrouillage qui détourne l’authentification. Il arrive aussi que le malware ait remplacé un fichier de WordPress ou ajouté une couche de vérification qui bloque l’accès.

Après suppression, c’est aussi possible que vous ayez restauré un fichier partiellement, ce qui fait échouer l’initialisation. Dans ce cas, ce n’est pas l’accès “piraté”, c’est WordPress qui plante tôt.

Contenus qui “se mélangent” ou styles cassés

Un site peut rester accessible, mais les pages ressemblent à un patchwork. Là, le malware s’est probablement contenté d’injecter du code dans des zones de rendu. Le nettoyage peut avoir retiré l’injection, mais si le CSS ou le JS a été modifié en même temps, l’interface reste instable.

Pourquoi la désinfection déclenche parfois de nouvelles erreurs

Un point important: si vous corrigez un malware sans corriger l’état d’origine, vous pouvez créer des effets secondaires. Je l’ai vu à maintes reprises lors de restaurations à moitié.

Trois mécanismes reviennent souvent:

1) Restauration incomplète

Si vous restaurez uniquement quelques fichiers, tout en gardant des thèmes ou plugins corrompus, WordPress exécute encore le comportement modifié, mais de manière différente, donc vous voyez “des erreurs” au lieu d’une infection visible.

2) Suppression de code utile par erreur

Le malware est parfois noyé dans un fichier, sans commentaire explicite. Quand on retire des lignes “au jugé”, on peut casser un morceau légitime. Même si le site était infecté, il ne faut pas confondre “zone suspecte” et “zone indispensable à la fonctionnalité”.

3) Cache et CDN

Après désinfection, si vos pages sont servies par un cache persistant (cache de serveur, cache applicatif, CDN), vous pouvez continuer à voir des anciennes réponses. Et si le cache a été “empoisonné” par le contenu malveillant, vous aurez l’impression que le malware réapparaît.

Dans certains environnements, la purge doit être faite à plusieurs niveaux, et pas seulement “effacer le cache” depuis WordPress.

La première règle: évaluer avant de toucher

Avant d’ouvrir l’éditeur de fichiers ou de relancer un téléchargement de thème, prenez le temps d’orienter l’enquête. L’objectif, c’est d’identifier ce qui casse et pourquoi. Sur un incident réel, ça change complètement la vitesse d’intervention.

Commencez par regarder les erreurs disponibles. Selon votre hébergeur, vous aurez des journaux dans le panneau de contrôle, ou un accès via SSH à des fichiers comme les logs PHP ou Nginx/Apache. Si vous ne voyez rien, ce n’est pas forcément un bon signe, mais ce n’est pas bloquant.

Ensuite, vérifiez l’état des fichiers et de la base. Une différence entre “ce que vous avez supprimé” et “ce que WordPress exécute encore” est le cœur du problème.

image

Voici un cadre de diagnostic simple, utile quand vous devez remettre le site au propre sans vous perdre:

Vérifier le journal d’erreurs PHP et identifier la ligne/fichier à l’origine du crash Contrôler les thèmes et plugins réellement actifs, puis comparer avec une version connue saine Inspecter l’utilisateur administrateur et les comptes récents, vérifier les rôles et dates de création Examiner la base de données pour les options modifiées, ainsi que les entrées de contenu suspectes Purger tous les caches (WordPress, serveur, CDN) et tester en navigation privée

Cette approche évite de “courir après” un symptôme. Elle vous ramène à la cause.

Réparer proprement le code: fichiers thème, plugins, et chargements

Une fois le site stable ou au moins lisible, vous pouvez passer à la réparation. Je privilégie une stratégie en deux temps: corriger ce qui empêche WordPress de fonctionner, puis reconstruire ce qui doit être “d’origine”.

Thèmes: comparer, restaurer, et surtout valider functions.php

Le thème actif est un endroit fréquent pour l’injection. Quand le malware a modifié functions.php, le nettoyage doit être plus rigoureux que juste supprimer des fragments.

En pratique, je fais souvent une comparaison avec une version saine du même thème. Si le thème est commercial, je prends la version depuis le vendor, mais je m’assure que c’est bien la même branche, pas une version plus récente, sinon vous introduisez des différences inconnues.

Si vous utilisez un child theme, vérifiez-le aussi. Le malware peut avoir été injecté dans le parent, mais le comportement peut être déclenché par le child.

Plugins: même logique, mais avec attention aux dépendances

Les plugins sont l’autre terrain. Certains incidents injectent un chargement dans un plugin “faisant semblant” d’être SEO, cache, formulaire, ou traduction. La suppression peut suffire, mais si le plugin est devenu partiellement cassé, WordPress peut afficher des erreurs.

La règle que j’applique systématiquement: si un plugin est supprimé, mais que le site s’améliore seulement après remplacement complet, alors le plugin n’était pas seulement “suspect”, il était la cause du crash. Dans ce cas, je restaure la version saine depuis un source officielle ou je réinstalle depuis zéro.

WordPress core: restaurer proprement quand des fichiers ont été touchés

Quand le malware touche le core, vous ne devriez pas bricoler. Le bon réflexe est de restaurer les fichiers WordPress en respectant la version exacte que vous aviez au moment de l’incident.

Le compromis, c’est que restaurer le core peut écraser des modifications légitimes (par exemple, une personnalisation manuelle). Mais ce risque est généralement acceptable comparé à l’incertitude d’un core déjà modifié.

Corriger la base de données sans perdre ce qui est légitime

La base de données est le point le plus “dangereux” à manipuler, parce que c’est là que se cachent les réglages persistants. Certains malwares créent un utilisateur administrateur pour se réintroduire plus tard. D’autres modifient des options qui déclenchent des redirections ou injectent du contenu.

Après nettoyage, si vous voyez des erreurs liées à des options, ou si des pages ont changé sans explication, c’est souvent un signe que la base contient encore des paramètres malveillants.

Je recommande de travailler avec prudence:

    privilégier des requêtes ciblées plutôt que des suppressions massives; garder une sauvegarde de la base avant toute manipulation; tester l’effet immédiatement sur le site, pour savoir si vous êtes en train de corriger ou d’aggraver.

Vérifier les utilisateurs et les rôles

Un utilisateur créé après l’incident est un gros drapeau rouge, surtout s’il n’y a pas de raison légitime. Mais l’edge case, c’est que des intégrations peuvent créer des comptes techniques. Par exemple, certains outils de monitoring ou de déploiement créent des utilisateurs, mais dans un cadre documenté.

Donc, je m’appuie sur des indices concrets: date de création, login, rôle, et comportement (activité récente, tentative de connexion). Si vous avez un journal côté serveur ou un outil de sécurité, c’est encore mieux.

Chercher des contenus injectés ou des champs qui provoquent des rendus

L’injection peut viser la table des articles, mais aussi des champs d’options. Parfois, le malware ne modifie rien visuellement au début, puis se déclenche selon des conditions.

Quand vous suspectez des options, vous cherchez les clés modifiées, puis vous comparez avec un état standard. Comme WordPress évolue, certains paramètres changent selon les versions, donc il faut être cohérent avec votre version.

Repenser l’authentification et la sécurité après coup

Un site désinfecté, mais qui reste vulnérable, n’est pas “réparé”, c’est juste temporairement apaisé. Après suppression du malware, les erreurs peuvent aussi refléter un problème de sécurité latente: accès trop permissif, fichiers modifiables, ou mots de passe faibles.

Là, je n’empile pas des mesures au hasard. Je cherche la cohérence entre ce qui s’est passé et ce que vous pouvez prouver aujourd’hui.

Quelques actions qui, en pratique, empêchent la récidive sans rendre le site injouable:

    changer tous les mots de passe liés à WordPress, y compris les comptes administrateur et les comptes utilisés par des intégrations; vérifier les rôles, et supprimer les comptes inconnus; contrôler la configuration d’accès au répertoire wp-admin et wp-login si vous l’utilisez; vérifier les droits sur les dossiers du site, surtout ceux liés aux uploads, au thème et aux plugins.

Selon votre hébergement, vous pouvez aussi ajuster des règles au niveau du pare-feu ou des limitations de requêtes. Le point clé est de ne pas bloquer des actions légitimes, sinon vous remettez votre équipe dans une situation de dépannage permanente.

Le piège du cache: quand le malware “revient” alors qu’il est parti

Le cache est l’une des pages spam malware WordPress causes les plus frustrantes de “je croyais que c’était nettoyé”. Vous purgez le plugin, mais sur certaines pages, vous voyez encore les redirections ou le contenu injecté.

Pourquoi? Parce que le cache peut conserver des versions anciennes, surtout si le comportement malveillant a été rendu une fois et stocké. Le CDN peut garder l’ancienne réponse pendant une durée qui n’a rien à voir avec votre perception.

Sur ces cas, la démarche est simple, mais elle demande méthode: purge complète à tous les niveaux, puis test depuis un contexte propre (navigation privée, ou autre appareil, ou autre réseau). Si l’erreur disparaît, vous avez surtout un problème de cache. Si elle persiste, vous avez encore un point d’injection.

Quand les erreurs viennent d’un “sur-nettoyage”

Parfois, ce n’est pas le malware qui crée l’erreur après coup, mais la manière dont on l’a supprimé.

Voici des scénarios typiques:

    Un fichier suspect a été supprimé, alors qu’il faisait partie d’un bundle de thème indispensable. Des lignes ont été retirées d’un fichier sans vérifier la syntaxe PHP, donc fatal error. Un plugin a été désinstallé, puis remplacé, mais avec une configuration oubliée, donc appels à des classes absentes. La restauration des fichiers s’est faite sans correspondance entre versions, donc incompatibilités.

Le signal, c’est que l’erreur pointe un fichier “qui ne devrait plus exister” ou une ligne qui ne correspond pas au thème ou plugin actuel. Dans ce cas, le diagnostic consiste à aligner exactement la version des composants.

Sur un projet récent, j’ai vu une installation où l’équipe avait restauré le dossier uploads, mais pas les fichiers de thème. Résultat: le site affichait des médias, mais la logique d’affichage plantait. Le correctif a été de restaurer aussi le thème à l’identique de la version saine.

Sécuriser le futur: réduire la surface d’attaque

Après incident, vous voulez éviter la répétition. La meilleure approche est celle qui réduit la surface d’attaque sans complexifier inutilement la maintenance.

Je recommande généralement de traiter trois axes: mises à jour, hygiène des plugins, et durcissement de l’accès.

    Mises à jour: WordPress, thèmes et plugins. L’idée n’est pas d’automatiser aveuglément, mais d’avoir un rythme d’actualisation. Plugins: moins il y a d’extensions, mieux c’est. Les plugins “multi-fonctions” attirent parfois plus d’attention malveillante. Accès: limiter les identifiants exposés, utiliser des mots de passe solides et mettre en place des protections raisonnables contre les tentatives répétées.

On peut aussi ajouter une surveillance. Pas forcément un outil coûteux, mais au moins une capacité à détecter une hausse de 404, des changements de fichiers, ou des erreurs PHP soudaines.

Plan d’action concret quand “ça ne marche plus” après désinfection

Quand le site est instable après nettoyage, il faut une séquence qui évite de vous enfermer. Je la résume ici sous forme de raisonnement, pas de procédure figée, parce que chaque hébergeur et chaque configuration change les chemins possibles.

D’abord, rétablir la capacité à afficher une page. S’il y a un crash PHP, la priorité est de stopper le chargement du fichier fautif. Ensuite seulement, vous cherchez l’origine dans le thème, le plugin, ou le core.

Ensuite, stabiliser les composants. Si vous avez un doute sur un fichier, remplacez-le par une version connue saine, plutôt que de continuer à “nettoyer” à la main. Le temps gagné au début se perd souvent quand une autre partie est aussi corrompue.

Enfin, une fois stable, vous repartez sur un contrôle de cohérence: base de données, utilisateurs, options, cache, et configuration serveur. C’est cette couche de vérification qui transforme une désinfection temporaire en réparation durable.

Cas particuliers qui demandent plus de prudence

Il existe des situations où la correction après suppression du malware doit être plus méthodique.

Sites avec forte personnalisation

Si vous avez beaucoup de code custom (custom post types, shortcodes, overrides de templates), il est plus risqué de restaurer un thème à l’identique. Dans ce cas, la comparaison de fichiers est essentielle, et le nettoyage doit être ciblé.

Multisite WordPress

En multisite, un malware peut toucher un site du réseau plutôt que tous. Les symptômes peuvent donc varier selon l’URL. Il faut vérifier quels sites ont des utilisateurs ajoutés, quelles tables ont des options modifiées, et quel niveau est réellement corrompu.

Sites derrière un reverse proxy ou un WAF

Si votre site passe par un CDN, un WAF, ou un reverse proxy, le comportement peut être modifié par ces couches indépendamment de WordPress. Des erreurs “après désinfection” peuvent en réalité venir d’une règle de sécurité trop agressive, déclenchée pendant l’incident, ou d’une purge incomplète.

Dans ce contexte, le diagnostic doit inclure les journaux du proxy ou du WAF si vous y avez accès.

Ce que j’attends d’un nettoyage “terminé”

Un nettoyage virus WordPress n’est pas terminé quand vous ne voyez plus de redirection. Il est terminé quand:

    le site se charge sans erreurs, y compris pour wp-admin et les pages publiques; les menus, styles et scripts reviennent à un état cohérent; la base de données ne contient plus d’éléments évidents de persistance (comptes suspects, options modifiées); le cache n’affiche plus de contenu ancien; des contrôles de sécurité de base sont en place, pour éviter de retomber dans le même scénario.

Le plus difficile, ce n’est pas la suppression du malware, c’est la vérification. Et la vérification, c’est souvent là que les erreurs “après coup” se règlent.

Dernier point: testez comme un visiteur, pas comme un administrateur

Un site peut paraître correct pour un administrateur connecté, parce que le rendu ou les redirections diffèrent selon le rôle. Pour être sûr que la désinfection est réellement effective, testez avec au moins deux contextes distincts: un navigateur privé sans cookies actifs, et un autre appareil ou réseau.

Ce détail change la donne, surtout quand le malware utilisait des conditions: user-agent, langue, géolocalisation approximative, ou absence de certains cookies.

Si vous me donnez les symptômes exacts (erreur 500, redirection, page blanche, message PHP, fichier cité, et ce que vous avez supprimé ou restauré), je peux vous aider à dresser un plan de correction cohérent, sans toucher à des zones inutiles.