Fichiers du thème modifiés : functions.php n'est pas le seul
`functions.php` n'est pas le seul fichier qu'on retouche. `header.php`, `footer.php`, un bloc Gutenberg, un thème enfant, un overlay Elementor : l'injection se loge où le HTML s'assemble. On compare au zip d'origine. Changer de thème sans inspecter laisse parfois une copie dans l'enfant ou en base.
header.php, footer.php, un fichier de blocs, un thème enfant. Comparez au zip d'origine. Changer de thème sans inspecter laisse parfois une copie ailleurs.
Le thème est un assemblage, pas un fichier
Une page WordPress, c'est un header, un contenu, un footer, des widgets, parfois un thème parent et un enfant, parfois un constructeur qui n'utilise presque plus les PHP du thème. Chercher seulement `functions.php`, c'est inspecter la cave et ignorer le rez-de-chaussée.
Les dates de modification sur `wp-content/themes/votre-theme/` donnent le plan. Un `footer.php` touché cette nuit, un `style.css` de 2022 : le footer d'abord. Un dossier entier retouché à la même minute : upload de thème pirate ou sync.
Les thèmes « officiels » du répertoire WordPress se comparent facilement. Un thème sur mesure d'agence, moins : il faut le zip de livraison ou le dépôt git. Sans ça, vous jugez au contenu (`eval`, domaines tiers, iframes).
Comparer au zip, version exacte
La version est dans `style.css` (`Version:`). Téléchargez ce zip (wordpress.org, ThemeForest — le votre, pas un nulled). Diff : fichiers en plus, fichiers plus lourds, lignes ajoutées en bas de `functions.php`.
Un thème nulled était souvent déjà infecté à l'install. Comparer au zip « found on google » recrée le problème. Si vous n'avez que le nulled, changez de thème pour un exemplaire légitime après copie de l'état actuel. Voir thème nulled.
Ne « mettez à jour » le thème pendant l'incident pour écraser : vous perdez la preuve et, si l'update merge mal, vous gardez une ligne pirate dans l'enfant.
- Version exacte, zip officiel.
- Fichiers en trop dans le dossier.
- Taille anormale (PHP de 200 Ko).
- Lignes en fin de `functions.php` / `header.php`.
Thème enfant : l'endroit qu'on croit « à nous »
L'enfant existe pour vos overrides. L'attaquant le sait : vous ne le remplacerez pas par un zip wordpress.org. Un `functions.php` d'enfant de 3 lignes légitimes plus 40 lignes encodées est le motif classique. Voir thème enfant infecté.
Changer le thème parent dans l'admin sans regarder l'enfant : l'enfant reste actif si vous ne le désactivez pas, ou ses fichiers restent sur le disque et un mu-plugin peut les `include`.
Listez tous les dossiers dans `themes/`. Un troisième thème `twentytwentyfour-old` ou `backup` n'est pas inoffensif s'il est adressable en URL ou inclus.
`functions.php`, hooks, et `@include`
En fin de fichier : `eval(base64_decode`, `@include $_SERVER['…']`, un `file_get_contents` distant, un `add_action('wp_footer'`. C'est lisible sans être développeur. Une fonction de 200 lignes au milieu, plus dure : diff contre le zip.
`@include` vers `../uploads/…` ou un chemin `.ico` : suivez le fichier. Le thème n'est que l'amorce.
Un `add_filter('pre_get_posts')` qui ajoute des articles spam, un `template_redirect` vers un domaine tiers : le thème orchestre sans HTML visible dans footer.php. Testez comme un visiteur, pas seulement en lisant le footer.
Constructeurs : templates, pas seulement le thème
Elementor : templates Theme Builder (header/footer globaux), CSS custom, extraits HTML. Divi : Theme Builder. Le dossier du thème Divi peut être propre, le footer global en base sale.
Les CSS « custom » acceptent parfois du `behavior` ou des urls. Plus souvent, un bloc HTML. Exportez les templates avant de les écraser.
Un add-on Elementor abandonné est une porte ; le thème n'y est pour rien. Voir Elementor add-ons.
Changer de thème ne referme pas
Le nouveau thème est propre ; l'enfant, les widgets, les mu-plugins, le cron, l'admin fantôme restent. Vous avez gagné une home « qui a l'air neuve » et perdu une journée. Changez de thème pour isoler (test), pas comme nettoyage.
Si vous changez pour de bon (thème nulled → thème sain), faites-le après copie, et inspectez quand même l'ancien dossier : un `include` peut le viser encore.
Les customizer options (`theme_mods_*` dans `wp_options`) peuvent contenir un JS. Un thème neuf relit parfois d'anciens mods. Cherchez `script` dans ces options si le JS survit.
Base : le thème propre et le HTML sale
Inspection d'URL : HTML casino, diff thème vide. Cloaking ou injection `wp_posts` / `wp_options`. Le thème n'est pas le dossier. Passez à cloaking et à la base.
Inversement : thème sale, inspection propre (cache d'admin, IP whitelist du malware). Testez mobile et Googlebot. Les deux lectures, toujours.
Safe Browsing : si le thème servait un kit, 24-72 h après URL propres. Un `functions.php` nettoyé et une page `/paypal/` encore là : refus.
Refermer et surveiller les mtime
Après correctif : notez les mtime des PHP du thème. À J+1, s'ils ont bougé, l'écrivain tourne (cron, shell, admin). C'est un capteur gratuit.
Mots de passe panel, moins d'éditeurs de fichiers dans l'admin WP (Apparence → Éditeur : à désactiver). Voir éditeur de fichiers.
Vous pouvez déclarer le site. Un diff contre le zip + la liste des thèmes installés accélère plus qu'un accès « regardez le site ».
- Diff zip version exacte.
- Enfant, widgets, Theme Builder.
- Drop-ins et mu-plugins dans la même vague.
- mtime surveillés 7 jours.