Trouver et supprimer une backdoor WordPress
Une backdoor, c'est la porte que le pirate garde ouverte pour revenir après chaque nettoyage. Voici où elles se cachent dans WordPress et comment les débusquer pour de bon.
Vous avez nettoyé le spam, supprimé les fausses pages, viré le compte admin inconnu, et trois jours plus tard tout est revenu. C’est le scénario typique d’une backdoor WordPress toujours en place. Une backdoor (porte dérobée) est un bout de code que le pirate laisse derrière lui pour reprendre la main quand il veut, sans avoir besoin de votre mot de passe. Tant qu’elle est là, votre site n’est pas nettoyé, il est en sursis.
Pourquoi supprimer le spam visible ne suffit jamais
Le spam que vous voyez (pages casino, redirections, injections SEO) n’est que la sortie. La backdoor est l’entrée. Quand vous supprimez les pages parasites mais laissez le fichier .php malveillant, le pirate exécute simplement à nouveau son script et régénère tout en quelques secondes. Souvent c’est même automatisé : un cron ou une tâche planifiée recrée le contenu après chaque suppression.
C’est exactement pour ça que savoir si votre site est piraté ne suffit pas : il faut localiser le mécanisme de persistance, pas seulement constater les dégâts. Une intrusion sérieuse laisse rarement une seule backdoor. Il y en a souvent plusieurs, disséminées à des endroits différents, justement pour survivre à un nettoyage partiel.
Les cachettes classiques d’une backdoor
Un pirate place son code là où vous ne regardez pas et là où WordPress ne vérifie rien.
Les fichiers .php dans wp-content/uploads
Le dossier uploads ne devrait contenir que des médias : images, PDF, vidéos. Jamais de PHP. Un fichier .php qui traîne dans wp-content/uploads/2024/03/ est un signal quasi certain de compromission. Les pirates aiment cet emplacement parce qu’il est inscriptible par WordPress et rarement inspecté.
Les faux fichiers qui imitent le cœur
WordPress a des noms de fichiers bien connus : wp-load.php, wp-blog-header.php, wp-settings.php. Les pirates créent des copies au nom presque identique pour passer inaperçu : un wp-load.php placé dans le mauvais répertoire, un wp-conftig.php, un wp-cron-php.php, ou un fichier légitime du cœur dont le contenu a été modifié. À l’œil nu dans un client FTP, ces noms semblent normaux.
Le dossier wp-content/mu-plugins
Les « must-use plugins » sont exécutés automatiquement par WordPress, sans apparaître dans la liste des extensions de l’admin et sans pouvoir être désactivés depuis l’interface. C’est une cachette de choix. Si vous n’avez jamais créé ce dossier vous-même, tout .php qui s’y trouve mérite une inspection immédiate.
Le code injecté dans functions.php et wp-config.php
Plutôt que d’ajouter un fichier, le pirate insère son code en haut (ou en bas) d’un fichier légitime. Le functions.php du thème actif et le wp-config.php à la racine sont les cibles favorites, parce qu’ils sont chargés à chaque requête. Repérez les longues lignes illisibles, le code encodé, ou un bloc collé après la balise ?> de fin.
Les fichiers aux noms aléatoires
x7f3a9.php, wp-jx82.php, lock360.php… Un fichier au nom qui ne ressemble à rien de standard, surtout à la racine ou dans wp-includes, est suspect par défaut. WordPress a une liste finie de fichiers ; tout ce qui en sort doit être justifié.
Les motifs de code à rechercher
Le code de backdoor est presque toujours obfusqué pour échapper à la lecture et aux antivirus. Quelques fonctions reviennent constamment :
eval(— exécute une chaîne comme du code PHP. Rarissime dans du code légitime, omniprésent dans les backdoors.base64_decode(— décode une charge utile cachée en base64, souvent passée ensuite àeval.gzinflate(,gzuncompress(,str_rot13(— autres couches d’obfuscation, fréquemment empilées.assert(— exécute du code commeevaldans les anciennes versions de PHP.$_POST,$_REQUEST,$_GET,$_COOKIEpassés directement à une fonction d’exécution — c’est le canal par lequel le pirate envoie ses commandes.preg_replaceavec le modificateur/e— détournement classique pour exécuter du code via une expression régulière.create_function(,call_user_func,system(,shell_exec(,passthru(— exécution dynamique ou accès au shell système.
Aucune de ces fonctions n’est interdite en soi, mais leur combinaison avec de l’encodage et une entrée utilisateur ne laisse pas de place au doute.
Chercher concrètement en SSH
Si vous avez un accès SSH, la recherche est bien plus rapide qu’à la main. Placez-vous à la racine du site puis lancez ces commandes.
Lister les fichiers contenant les motifs d’obfuscation les plus courants :
grep -rEl "eval\(|base64_decode\(|gzinflate\(|str_rot13\(" wp-content/
Trouver tout fichier PHP qui n’a rien à faire dans le dossier des médias :
find wp-content/uploads -name '*.php'
Repérer les fichiers PHP modifiés récemment (utile si vous connaissez la date approximative de l’intrusion) :
find . -name '*.php' -mtime -15 -ls
Inspecter le contenu du dossier must-use plugins :
ls -la wp-content/mu-plugins/
Chercher l’exécution directe d’entrées utilisateur :
grep -rEl "\\\$_(POST|REQUEST|GET|COOKIE)\[" wp-content/ wp-includes/
Pour chaque fichier remonté, ouvrez-le et lisez-le avant de supprimer. Certains résultats seront de faux positifs (des plugins légitimes utilisent base64_decode pour des raisons valables). Le critère : code illisible, encodé, sans commentaires, sans en-tête de plugin, et qui exécute une entrée externe.
La limite du nettoyage manuel
Voici la vérité que peu de tutoriels disent clairement : vous ne pouvez jamais être certain à 100 % d’avoir tout trouvé à la main. Une backdoor peut être :
- fragmentée sur plusieurs fichiers qui ne sont dangereux qu’assemblés,
- cachée dans la base de données plutôt que dans les fichiers,
- encodée d’une façon que votre
grepne capture pas, - planquée dans un fichier dont la date de modification a été falsifiée pour paraître ancienne.
Vous pouvez retirer dix backdoors et en manquer une onzième. Et une seule suffit pour que tout recommence.
C’est pourquoi l’approche fiable n’est pas « nettoyer » mais remplacer. Concrètement :
- Le cœur de WordPress : ne le réparez pas, supprimez-le et réinstallez la version exacte depuis wordpress.org. Tous les fichiers du cœur deviennent ainsi connus et propres.
- Les plugins et thèmes : réinstallez chaque extension depuis sa source officielle plutôt que de chasser le code injecté ligne par ligne. Supprimez ceux que vous n’utilisez plus.
- Les seuls fichiers à conserver :
wp-config.php(après vérification ligne par ligne), le dossierwp-content/uploads(après avoir purgé tout.php), et vos éventuelles personnalisations dont vous avez la source propre.
En remplaçant tout ce qui est remplaçable, vous réduisez la zone à inspecter manuellement à un périmètre minuscule, au lieu d’auditer des milliers de fichiers.
Régénérer tous les accès
Une backdoor n’est pas qu’un fichier. Le pirate a peut-être récupéré des identifiants. Après le remplacement des fichiers, changez tous les mots de passe (admin WordPress, base de données, FTP/SFTP, hébergeur), changez les clés de salage dans wp-config.php, révoquez les mots de passe d’application, et vérifiez la liste des comptes administrateurs pour supprimer tout intrus. Sans cette étape, un attaquant qui connaît vos accès n’a même pas besoin de backdoor pour revenir.
Prévenir la prochaine backdoor
Une fois le site propre, fermez les portes qui ont laissé entrer le pirate. Maintenez le cœur, les plugins et les thèmes à jour, car la plupart des intrusions exploitent une extension vulnérable connue. Supprimez ce que vous n’utilisez pas : chaque plugin inactif reste un point d’entrée. Bloquez l’exécution de PHP dans wp-content/uploads au niveau du serveur. Mettez en place des sauvegardes externes régulières pour pouvoir comparer et restaurer. La marche à suivre complète est détaillée dans notre guide pour sécuriser WordPress pour éviter la rechute.
FAQ
Comment savoir si une backdoor est toujours active après nettoyage ? Surveillez les jours qui suivent : si du spam, des fichiers ou des comptes réapparaissent sans action de votre part, une backdoor a survécu. Un scan de sécurité côté serveur et la comparaison des fichiers du cœur avec une installation propre confirment l’état réel.
Un plugin de sécurité supprime-t-il toutes les backdoors ? Non. Les scanners détectent les signatures connues, mais le code obfusqué ou fragmenté passe régulièrement sous le radar. Ils sont utiles en complément, pas en garantie. Le remplacement complet des fichiers reste plus sûr.
Faut-il refaire le site de zéro ? Rarement. Réinstaller le cœur, les plugins et les thèmes depuis des sources officielles, en conservant la base et les médias nettoyés, suffit dans la grande majorité des cas. La reconstruction totale n’est nécessaire que si la base elle-même est lourdement compromise.
Chez WP-Detox, traquer les backdoors et le code injecté est précisément notre métier : on cherche ce que la plupart des outils automatiques ratent, on remplace plutôt que de rafistoler, et on régénère tous les accès pour couper la persistance. Le scan est gratuit, le nettoyage prend environ 30 minutes, c’est 149 € tout compris, et remboursé si le site n’est pas propre. Si vous préférez la vue d’ensemble avant d’agir, commencez par le guide complet pour nettoyer un WordPress piraté.