Désinfection WordPress : mettre en place un WAF après nettoyage

Après un nettoyage de malware WordPress, on respire enfin. Le site se rallume, les emails cessent d’affluer, les scans redeviennent verts, et l’administration ne renvoie plus de pages bizarres. Sauf que la plupart des incidents sérieux ne meurent pas avec le dernier fichier supprimé. Ils laissent derrière eux des portes encore un peu entrouvertes, des accès oubliés, des scripts qui n’étaient pas encore déclenchés au moment du diagnostic, ou simplement une configuration WordPress modifiée pour survivre.

C’est là que la mise en place d’un WAF (Web Application Firewall) prend tout son sens. Un WAF ne remplace pas un nettoyage propre, il prolonge le résultat. Il réduit la surface d’attaque, repère des patterns d’exploitation, et met un frein aux tentatives d’injection qui visent justement des sites “déjà compromis”. Sur WordPress, ce n’est pas un détail: la plateforme est très répandue, donc chaque lot d’exploits finit tôt ou tard par rebondir sur des cibles connues.

Le piège après désinfection: croire que tout est réglé

Dans les cas que j’ai vus, le “reste” après nettoyage est rarement spectaculaire. Plutôt une accumulation de petits signaux:

    des utilisateurs créés avec des rôles élevés, supprimés pendant l’urgence mais parfois réapparus via une persistance moins visible, des chemins d’injection dans des plugins ou thèmes, corrigés, puis reintroduits par un déploiement automatique, des requêtes d’exploration qui continuent d’attaquer l’URL de l’ancien shell, sans que cela n’entraîne forcément un symptôme immédiat, des comportements côté serveur qui ressemblent à du scraping et à des tentatives de brute force, avec des patterns qui reviennent jour après jour.

Le WAF agit justement sur ces tentatives récurrentes. Il ne vous “répare” pas le site, mais il rend plus difficile la prochaine tentative, celle qui ne fait pas forcément planter la page aujourd’hui, mais cherche à obtenir un point d’appui.

Il y a aussi une raison pratique. Le nettoyage se fait en général dans l’urgence, parfois avec des accès limités. Même si vous avez une bonne méthode, il existe toujours des zones grises: une base de données partiellement altérée, un plugin mis à jour mais pas reconfiguré à fond, une règle de sécurité qui a été contournée pendant l’incident. Un WAF, bien configuré, ajoute une couche de garde-fou pendant la période où l’équipe surveille “à l’œil” et ajuste.

Ce qu’un WAF peut vraiment apporter à un WordPress assaini

Un WAF se place devant votre application. Il inspecte des requêtes HTTP, et peut bloquer ou limiter celles qui ressemblent à des exploitations: injections de type SQL ou XSS, paramètres suspects, chemins inhabituels, ou comportements typiques de scans. Selon le produit, il combine des signatures, de la corrélation de règles et parfois du contrôle comportemental.

Sur WordPress, les apports concrets après un nettoyage se traduisent par trois bénéfices:

Réduction de la vitesse d’attaque

Les tentatives automatisées ne “tombent” pas toujours sur un fichier malveillant. Elles ratissent ensuite. Un WAF ralentit cette chasse, ce qui vous laisse du temps pour stabiliser.

Détection de patterns récurrents

image

Un malware laisse souvent des traces dans les requêtes observées: appels vers des endpoints précis, paramètres décorés, séquences répétées. Même si la charge utile a disparu, les requêtes peuvent continuer.

Mise en sécurité pendant la phase de durcissement

Après un incident, on harden souvent petit à petit: mises à jour, rotation des identifiants, réduction des plugins, durcissement Nginx ou Apache. Le WAF vous donne un “filet” en attendant que tout soit fini.

Le revers de la médaille, c’est la gestion des faux positifs. WordPress est assez “souple” côté requêtes: certains plugins utilisent des endpoints AJAX variés, des formulaires renvoient des champs inattendus, des systèmes de paiement ou de synchronisation appellent des routes spécifiques. Si vous activez des règles trop agressives d’un coup, vous risquez de casser un flux métier sans lien direct avec le malware.

C’est pour cela que la stratégie “WAF après nettoyage” doit être progressive, observée, puis durcie.

D’abord consolider: ce que vous devez avoir fait avant d’activer un WAF

Avant même de parler de WAF, je recommande de verrouiller les fondamentaux. Sinon, vous créez une protection, mais pas de base saine.

Dans une séquence réaliste, on fait en premier lieu le nettoyage (fichiers, base si besoin, plugins et thèmes contaminés), puis on traite les accès.

Le point clé, c’est de considérer que l’accès est aussi une “surface” que le malware a tenté d’exploiter. Un WAF peut bloquer des injections, mais il ne révoque pas un jeton volé, ni n’empêche un utilisateur compromis d’agir via l’interface.

C’est pour ça que, juste après le nettoyage, il faut:

    supprimer ou neutraliser les comptes suspects, mettre à jour WordPress et les extensions restantes, vérifier les fichiers et configurations sensibles (routes anormales, scripts obfusqués, taches planifiées si vous en utilisez), sécuriser la session d’admin si nécessaire.

Je ne détaille pas ici une méthode de nettoyage complète, car votre question porte sur le WAF, mais je mentionne ces prérequis car, dans la pratique, un WAF mal activé sur un socle encore instable crée plus de bruit que de sécurité.

Choisir le bon mode de fonctionnement: “calme” puis “dur”

La majorité des WAF modernes permettent de choisir un niveau de blocage. Certains fonctionnent avec un mode “monitoring”, d’autres proposent un “learning mode” pour observer le trafic avant de bloquer.

Après un nettoyage, j’ai une règle assez simple: on commence par observer, on valide que le site continue de fonctionner correctement (y compris les flows moins visibles), puis on renforce.

Le “calme” initial sert à comprendre deux choses. D’abord, quels volumes de requêtes déclenchent des alertes. Ensuite, quelles règles sont réellement pertinentes pour votre profil. WordPress a des habitudes de trafic assez régulières: pages publiques, wp-admin, wp-login, appels admin-ajax, éventuellement REST. Si votre WAF commence à bloquer des routes légitimes, vous le voyez vite dans les logs.

En renforçant ensuite, vous pouvez graduellement activer des règles plus strictes, notamment sur:

    les patterns d’injection, les accès aux endpoints d’administration, les requêtes avec paramètres anormaux ou tailles incohérentes, certaines classes de trafic automatisé.

L’objectif n’est pas d’atteindre un “score parfait” instantanément. L’objectif est de garder votre site stable tout en réduisant la probabilité de nouvelle exploitation.

Configuration WAF orientée WordPress: où ça se joue

Sur un WordPress, les attaques se concentrent souvent sur quelques zones, même si l’infection initiale venait d’ailleurs.

Les zones qui retiennent l’attention dans un WAF sont généralement:

    wp-login.php et wp-admin Bruteforce, credential stuffing, tentatives de contournement. wp-json / REST Si un thème ou un plugin expose des endpoints, ils peuvent devenir un levier. admin-ajax.php Beaucoup de plugins l’utilisent, et il peut porter des paramètres que les règles WAF doivent apprendre. Pages et requêtes atypiques Chemins inventés, extensions inhabituelles, chaînes obfusquées.

Le WAF ne “sait” pas automatiquement ce qui est légitime dans votre configuration. C’est là que la phase d’observation est précieuse. Vous pourrez corriger des exceptions au bon endroit plutôt que d’assouplir “en vrac”.

Pour éviter l’approche au hasard, j’aime tenir une liste interne des endpoints qui doivent absolument rester fonctionnels (par exemple la connexion, les formulaires, les callbacks de paiement, le cron si visible via HTTP). Ensuite, quand le WAF bloque, on regarde si la requête appartient à un besoin réel, ou si elle relève d’une tentative d’exploration.

Un détail sous-estimé: le statut des erreurs et la visibilité

Dans beaucoup d’incidents, le WAF devient la source de nouveaux signaux: erreurs 403, 406 ou réponses “bloquées”. C’est utile, mais ça peut aussi masquer un autre problème si vous ne regardez pas les logs correctement.

Assurez-vous de disposer de:

    une journalisation des requêtes bloquées, avec l’URL et le motif de règle, une traçabilité suffisamment précise pour distinguer “incident” et “mauvais réglage”, un suivi sur la période post-activation, au moins les premières 48 à 72 heures.

C’est souvent la différence entre un WAF qui “a l’air efficace” mais vous gêne silencieusement, et un WAF qui vous protège réellement sans vous coûter en incidents opérationnels.

Exemple de stratégie en deux temps (sans casser votre site)

Prenons un scénario https://gardewp.fr/nettoyage-malware-wordpress/ fréquent. Après nettoyage, vous activez immédiatement un pack de règles “par défaut” en mode blocage strict. Dans la journée, tout semble aller jusqu’au moment où un formulaire d’inscription échoue, ou où le chargement d’un élément dépendant d’un plugin ne répond plus. Vous cherchez, vous suspectez le cache, vous fouillez le code, pendant que le vrai problème était un blocage WAF sur un pattern de requête AJAX.

Une meilleure stratégie, c’est de procéder par étapes:

Activez en mode observation ou en blocage “modéré”, Surveillez les logs, corrigez les exceptions ciblées, Augmentez la sévérité sur les règles à haut intérêt, Gardez quelques jours de monitoring avant d’aller plus loin.

Je le dis avec un peu de franchise: la meilleure configuration WAF n’est pas celle qui bloque le plus de requêtes, c’est celle qui bloque les requêtes qui comptent, sans casser la mécanique habituelle de votre WordPress.

Les réglages qui posent le plus souvent problème (et comment les gérer)

Les faux positifs ne sont pas une fatalité, mais ils ont des causes récurrentes. Voici celles que je rencontre le plus après désinfection, quand on “renforce” vite.

1) Règles trop générales sur l’input utilisateur

Certains formulaires acceptent des champs avec des caractères “bruyants” (espaces, guillemets, balises HTML volontairement, champs de recherche, ou retours ligne). Une règle trop stricte peut bloquer ces requêtes en pensant à une injection.

La bonne approche est de créer une exception ciblée sur le type de endpoint et la règle, plutôt que de supprimer toute protection.

2) Compatibilité AJAX et plugins

Admin-ajax.php est un point névralgique. De nombreux plugins utilisent des paramètres qui peuvent ressembler à des séquences d’attaque (par exemple des identifiants encodés, des JSON dans un champ, ou des valeurs longues). Un WAF peut interpréter ça comme suspect.

Ici, le travail se fait au niveau observabilité: vous repérez la règle qui bloque, vous regardez l’URL exacte, vous vérifiez si le plugin a un endpoint attendu dans votre site, puis vous ajustez.

3) Authentification et sessions

Certains environnements ont des comportements particuliers: SSO, redirection, gestion des cookies, ou durcissement applicatif. Si le WAF renvoie des codes inattendus, vous pouvez créer une boucle de déconnexion ou un échec de login.

Le WAF n’est pas seulement un “blocage”. Il peut modifier des comportements (challenge, captcha, headers). C’est pour cela que je privilégie le mode monitor au début, pour valider le flux login.

4) Géoblocage ou réputation mal calibrés

Les blocages par pays ou par réputation peuvent sembler utiles après un malware, mais si votre audience est internationale, vous allez vite rencontrer des blocages légitimes. En plus, les attaques peuvent venir de proxys, ce qui rend le “pays” peu fiable.

Mon conseil: gardez les blocs de géolocalisation comme une mesure secondaire, pas comme la base de votre défense.

Mise en place concrète: une check rapide juste après activation

Voici une check courte, pensée pour la première phase post-déploiement. Elle évite de découvrir un problème deux semaines plus tard, quand le trafic aura bougé.

    Vérifiez la connexion admin (wp-login), déconnexion et reconnexion, sans erreur ni redirection anormale Testez les formulaires publics et les actions basées sur admin-ajax Contrôlez les pages clés à fort engagement (accueil, page de vente, espace client si présent) Examinez les logs WAF pendant 48 à 72 heures et regroupez les blocages par endpoint Corrigez les exceptions seulement quand vous pouvez prouver que l’endpoint est légitime (pas sur une supposition)

Cette discipline paraît basique, mais c’est exactement ce qui fait la différence entre “on a activé un WAF” et “on a un WAF opérationnel”.

“Après nettoyage” ne veut pas dire “plus de surveillance”

Le WAF vous aide, mais il ne remplace pas la surveillance. Après une désinfection, je traite les semaines suivantes comme une période de consolidation.

Ce que je surveille en priorité:

    les tentatives répétées sur wp-login et wp-admin (fréquence, IPs, patterns), les blocages WAF qui touchent des endpoints inattendus, toute nouvelle anomalie d’intégrité côté fichiers (même si vous n’avez pas de symptôme), les modifications de configuration (plugins activés, thèmes modifiés, tâches planifiées).

Un WAF peut aussi vous donner un avantage de diagnostic. Si vous remarquez des blocages sur une route précise que vous n’attendiez pas, c’est un indice. Parfois le malware revient sous une forme différente, parfois c’est juste un bot. La différence se fait par le recoupement des logs et de votre historique.

Cas limites: quand le WAF n’est pas suffisant

Il existe des scénarios où un WAF, même bien configuré, ne protège pas complètement. Je pense notamment à:

    un accès interne déjà obtenu, par exemple un admin compromis ou une clé API exposée, des modifications légitimes mais dangereuses, comme un plugin installé dont la logique permet des actions sans injection classique, une persistance via des mécanismes côté serveur qui ne passent pas par des requêtes “atypiques” (ou qui les masquent).

Dans ces cas, le WAF est un rempart, mais pas un bouclier absolu. La stratégie reste: durcir l’application, réduire la surface (plugins utiles uniquement), et gérer les identifiants avec rigueur.

C’est aussi pour ça que le WAF après nettoyage est un complément, pas un ticket “résolu une fois pour toutes”.

Fréquence de durcissement: quand passer en mode plus strict

En pratique, je recommanderais de ne pas brusquer la montée en sévérité. Les bons réglages se trouvent par itérations.

Un repère raisonnable, si votre trafic est stable: commencer “soft”, observer, corriger les exceptions si besoin, puis durcir par paliers sur une période courte. Dans le meilleur des cas, vous pouvez atteindre un niveau protecteur au bout de quelques jours. Dans des environnements plus compliqués (beaucoup de plugins, personnalisation forte, intégrations), ça peut prendre plus longtemps, car il faut valider le bon fonctionnement des fonctions métiers.

La clé, c’est votre capacité à lire les logs et à relier un blocage à un endpoint concret. Sans cette lecture, vous durcissez à l’aveugle et vous finissez par dégrader l’expérience utilisateur.

Performance et latence: le sujet qu’on oublie souvent

Un WAF peut ajouter une latence. Sur WordPress, la latence se ressent surtout lors des requêtes dynamiques, ou si votre configuration examine trop de détails.

Après désinfection, les serveurs sont parfois déjà sous contrainte: vous avez pu augmenter les ressources pendant l’incident, puis vous avez diminué. Activer un WAF agressif et observer seulement “à l’œil” peut masquer des effets sur les temps de réponse.

Ce que je conseille: surveiller les tendances (pas forcément chaque seconde). Si vous voyez une hausse durable de latence ou des erreurs 5xx, ce n’est pas forcément un blocage WAF, mais il faut investiguer, car un WAF qui challenge en série peut aussi déclencher des comportements inattendus côté clients.

Le WAF comme signal de retour d’expérience, pas seulement comme barrière

Quand tout fonctionne, on a tendance à oublier le WAF. Pourtant, il est un excellent outil de retour d’expérience après un nettoyage malware WordPress.

Les blocages répétés vous renseignent sur:

    les vecteurs d’attaque qui continuent d’être utilisés contre votre domaine, les périodes de pic (par exemple après publication d’un article, ou après un changement de DNS), l’efficacité de vos autres mesures (mises à jour, durcissement).

Après l’incident, cette boucle est précieuse. Elle évite de se contenter d’un nettoyage, puis de repartir dans l’ancien rythme. Vous construisez une défense progressive, et c’est souvent ce qui empêche la “deuxième infection” de se produire.

Une bonne pratique simple: documenter les règles d’exception

Quand vous ajustez une règle pour éviter un faux positif, documentez-le. Pas un document administratif massif, une trace interne suffit: endpoint concerné, règle, raison (plugin ou flux métier), date, responsable, et date de revalidation.

Pourquoi c’est important? Parce que, quelques semaines plus tard, vous allez peut-être changer de plugin, modifier un thème, ou upgrader WordPress. Les exceptions trop larges redeviennent des failles. Avoir une trace permet de recontrôler.

Je l’ai vu plusieurs fois: une exception créée en urgence après un incident, puis oubliée. Le WAF protège moins, pas parce qu’il est inefficace, mais parce qu’on a assoupli “localement” et qu’on a laissé s’installer cet assouplissement.

image

Conclusion opérationnelle: WAF après nettoyage, oui, mais avec méthode

Mettre un WAF après nettoyage est l’une des décisions les plus rationnelles pour limiter le risque de récidive. Le WAF n’annule pas les erreurs de fond, mais il renforce la période de transition, ralentit les attaques automatisées et donne des signaux utiles.

image

Le point central, c’est la manière de déployer: commencer en observation ou en blocage modéré, vérifier les flux WordPress essentiels, analyser les logs par endpoint, puis durcir progressivement. Si vous faites ça, vous transformez le WAF en allié. Sinon, vous vous retrouvez avec un outil qui “bloque un peu” et qui complique la maintenance.

Après un incident, l’objectif n’est pas seulement de revenir à la normale. C’est de rendre votre WordPress moins prévisible, plus résistant, et plus dur à réinfecter, même quand les attaquants recommencent à scanner dès le lendemain.