Retour au blog
Supprimer un Malware WordPress Manuellement : Guide Technique
SEO

Supprimer un Malware WordPress Manuellement : Guide Technique

Bastien Allain11 mars 202613 min de lecture
wordpressmalwaresuppression-manuellesecuritewp-cli

Lorsqu'un site WordPress est infecte, la solution la plus fiable reste souvent le nettoyage manuel. Les plugins de securite automatises ne detectent pas toujours les backdoors sophistiquees ou les injections obfusquees. Ce guide technique vous accompagne etape par etape dans la suppression manuelle d'un malware WordPress, en utilisant des commandes SSH, des requetes SQL et WP-CLI pour restaurer un site propre et securise. Chaque commande est documentee pour que vous puissiez intervenir avec precision, meme sur des infections complexes.

Prerequis et Preparation de l'Environnement

Avant de commencer le nettoyage, vous devez preparer votre environnement de travail. Une intervention mal preparee peut aggraver la situation ou entrainer une perte de donnees.

Outils Necessaires

OutilUtilisationAcces
SSHAcces en ligne de commande au serveurTerminal / PuTTY
SFTPTransfert de fichiers securiseFileZilla / WinSCP
phpMyAdminAdministration de la base de donneesPanel hebergeur
WP-CLIInterface en ligne de commande WordPressInstallation sur le serveur
Editeur de texteAnalyse de fichiersnano / vim / VS Code

Creer une Sauvegarde Complete

La premiere etape absolue est de sauvegarder l'integralite du site, meme infecte. Vous aurez besoin de cette sauvegarde comme reference si le nettoyage tourne mal.

# Connexion SSH au serveur
ssh utilisateur@votre-serveur.com
 
# Creer un repertoire de sauvegarde
mkdir -p ~/backups/$(date +%Y%m%d)
 
# Sauvegarder tous les fichiers WordPress
tar -czf ~/backups/$(date +%Y%m%d)/files-backup.tar.gz /var/www/html/
 
# Sauvegarder la base de donnees
mysqldump -u db_user -p db_name > ~/backups/$(date +%Y%m%d)/database-backup.sql

Mettre le Site en Mode Maintenance

Pour empecher les visiteurs d'acceder au site infecte et bloquer la propagation du malware :

# Creer un fichier .maintenance a la racine WordPress
echo '<?php $upgrading = time(); ?>' > /var/www/html/.maintenance

Etape 1 : Identifier les Fichiers Malveillants

La detection est l'etape la plus critique. Les malwares WordPress utilisent des techniques d'obfuscation pour echapper aux scans classiques. Voici les commandes grep essentielles pour localiser les fichiers suspects.

Rechercher les Fonctions PHP Dangereuses

# Rechercher eval() avec base64_decode - signature classique de malware
grep -rl "eval(base64_decode" /var/www/html/wp-content/ --include="*.php"
 
# Rechercher les fonctions d'obfuscation courantes
grep -rl "str_rot13\|gzinflate\|gzuncompress\|str_replace.*chr(" /var/www/html/wp-content/ --include="*.php"
 
# Rechercher les appels systeme dangereux
grep -rl "exec(\|system(\|passthru(\|shell_exec(\|popen(" /var/www/html/wp-content/ --include="*.php"
 
# Rechercher les inclusions de fichiers distants
grep -rl "file_get_contents.*http\|curl_exec\|wp_remote_get.*base64" /var/www/html/wp-content/ --include="*.php"

Detecter les Fichiers Recemment Modifies

Les malwares modifient souvent des fichiers existants, comme le montre notre analyse des fichiers WordPress les plus cibles par les pirates. Recherchez les fichiers modifies recemment :

# Fichiers PHP modifies dans les 7 derniers jours
find /var/www/html/ -name "*.php" -mtime -7 -type f
 
# Fichiers PHP modifies dans les 24 dernieres heures
find /var/www/html/ -name "*.php" -mtime -1 -type f
 
# Fichiers avec des noms suspects (caracteres aleatoires)
find /var/www/html/wp-content/ -name "*.php" -regex ".*[a-z0-9]\{8,\}\.php"

Identifier les Fichiers qui N'Appartiennent Pas au Core

# Telecharger une copie propre de WordPress
cd /var/tmp && wget https://wordpress.org/latest.tar.gz && tar -xzf latest.tar.gz
 
# Comparer les fichiers du core avec la version propre
diff -rq /var/www/html/wp-admin/ /PATH/TO/CLEAN-WP/wp-admin/
diff -rq /var/www/html/wp-includes/ /PATH/TO/CLEAN-WP/wp-includes/

Les fichiers presents dans votre installation mais absents de la version propre sont potentiellement des fichiers malveillants injectes.

Etape 2 : Nettoyer les Fichiers Core de WordPress

Le coeur de WordPress (les repertoires wp-admin/ et wp-includes/) ne devrait jamais etre modifie. La methode la plus sure est de les remplacer entierement.

Remplacer wp-admin et wp-includes

# Supprimer les repertoires core existants
rm -rf /var/www/html/wp-admin/
rm -rf /var/www/html/wp-includes/
 
# Copier les fichiers propres
cp -r /PATH/TO/CLEAN-WP/wp-admin/ /var/www/html/wp-admin/
cp -r /PATH/TO/CLEAN-WP/wp-includes/ /var/www/html/wp-includes/
 
# Copier les fichiers racine du core (sauf wp-config.php)
cp /PATH/TO/CLEAN-WP/wp-*.php /var/www/html/
cp /PATH/TO/CLEAN-WP/index.php /var/www/html/
cp /PATH/TO/CLEAN-WP/xmlrpc.php /var/www/html/

Nettoyer wp-config.php

Le fichier wp-config.php est une cible privilegiee des attaquants. Inspectez-le ligne par ligne :

# Afficher le contenu de wp-config.php
cat -n /var/www/html/wp-config.php

Recherchez et supprimez :

  • Tout code avant <?php en debut de fichier
  • Des lignes contenant eval(), base64_decode(), str_rot13()
  • Des require() ou include() pointant vers des fichiers inconnus
  • Des constantes WordPress inattendues ajoutees en fin de fichier
# Verifier les inclusions suspectes dans wp-config.php
grep -n "eval\|base64_decode\|require.*\.php\|include.*\.php" /var/www/html/wp-config.php

Regenerez les cles de securite en remplacant les lignes AUTH_KEY, SECURE_AUTH_KEY, etc. par de nouvelles valeurs generees sur api.wordpress.org/secret-key.

Nettoyer .htaccess

Le fichier .htaccess est frequemment utilise pour des redirections malveillantes :

# Afficher le contenu du .htaccess
cat -n /var/www/html/.htaccess

Recherchez :

  • Des RewriteRule redirigeant vers des domaines externes
  • Des blocs <FilesMatch> masquant des fichiers PHP
  • Des instructions php_value auto_prepend_file chargeant du code malveillant

Remplacez le contenu par le .htaccess par defaut de WordPress :

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Nettoyer index.php

Le fichier index.php racine doit contenir uniquement :

<?php
/**
 * Front to the WordPress application.
 */
define( 'WP_USE_THEMES', true );
require __DIR__ . '/wp-blog-header.php';

Tout code supplementaire est suspect et doit etre supprime.

Etape 3 : Nettoyer le Repertoire wp-content

Le repertoire wp-content/ contient vos themes, plugins et uploads. C'est la zone la plus complexe a nettoyer car elle contient du code tiers legitime melange au malware.

Nettoyer les Plugins

# Lister tous les fichiers PHP dans les plugins
find /var/www/html/wp-content/plugins/ -name "*.php" | head -50
 
# Rechercher du code malveillant dans les plugins
grep -rl "eval(base64_decode\|eval(gzinflate\|eval(str_rot13" /var/www/html/wp-content/plugins/ --include="*.php"

La methode la plus fiable : supprimer et reinstaller chaque plugin depuis le depot officiel WordPress :

# Avec WP-CLI - reinstaller tous les plugins depuis le depot
wp plugin list --path=/var/www/html --format=csv | tail -n +2 | while IFS=',' read name status update version; do
  wp plugin install "$name" --force --path=/var/www/html
done

Nettoyer les Themes

Appliquez la meme logique aux themes :

# Reinstaller le theme actif depuis le depot
wp theme install $(wp theme list --status=active --field=name --path=/var/www/html) --force --path=/var/www/html

Pour les themes personnalises non disponibles sur le depot, inspectez chaque fichier PHP :

# Scanner le theme actif pour du code suspect
grep -rn "eval(\|base64_decode\|str_rot13\|gzinflate" /var/www/html/wp-content/themes/votre-theme/ --include="*.php"

Nettoyer le Repertoire Uploads

Le repertoire uploads/ ne devrait contenir aucun fichier PHP :

# Trouver tous les fichiers PHP dans uploads (tous suspects)
find /var/www/html/wp-content/uploads/ -name "*.php" -type f
 
# Supprimer tous les fichiers PHP dans uploads
find /var/www/html/wp-content/uploads/ -name "*.php" -type f -delete
 
# Rechercher aussi les fichiers avec double extension
find /var/www/html/wp-content/uploads/ -name "*.php.*" -o -name "*.phtml" -o -name "*.php5"

Verifier les Repertoires Suspects

# Chercher des repertoires caches ou avec des noms inhabituels
find /var/www/html/wp-content/ -type d -name ".*"
find /var/www/html/wp-content/ -type d -name "cache" -o -name "tmp" -o -name "sessions"
 
# Lister le contenu des repertoires suspects
ls -la /var/www/html/wp-content/mu-plugins/

Le repertoire mu-plugins/ est souvent utilise pour cacher des backdoors car les must-use plugins sont charges automatiquement sans activation.

Etape 4 : Nettoyer la Base de Donnees

Les malwares injectent du code dans la base de donnees WordPress, principalement dans les tables wp_options, wp_posts et wp_postmeta.

Rechercher des Injections dans wp_options

Connectez-vous a phpMyAdmin ou utilisez la ligne de commande MySQL :

-- Rechercher des scripts injectes dans les options
SELECT option_name, LEFT(option_value, 200)
FROM wp_options
WHERE option_value LIKE '%<script%'
   OR option_value LIKE '%eval(%'
   OR option_value LIKE '%base64_decode%'
   OR option_value LIKE '%document.write%';
 
-- Rechercher des utilisateurs administrateurs inconnus
SELECT * FROM wp_users WHERE user_login NOT IN ('admin', 'votre_login');
 
-- Verifier les roles des utilisateurs
SELECT u.user_login, m.meta_value
FROM wp_users u
JOIN wp_usermeta m ON u.ID = m.user_id
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%administrator%';

Rechercher des Injections dans les Articles

-- Articles contenant du JavaScript malveillant
SELECT ID, post_title, LEFT(post_content, 200)
FROM wp_posts
WHERE post_content LIKE '%<script%'
   OR post_content LIKE '%<iframe%'
   OR post_content LIKE '%eval(%'
   OR post_content LIKE '%document.createElement%';
 
-- Rechercher dans les metadonnees des articles
SELECT post_id, meta_key, LEFT(meta_value, 200)
FROM wp_postmeta
WHERE meta_value LIKE '%<script%'
   OR meta_value LIKE '%base64_decode%';

Supprimer les Comptes Administrateurs Frauduleux

-- Identifier les comptes suspects
SELECT u.ID, u.user_login, u.user_email, u.user_registered
FROM wp_users u
JOIN wp_usermeta m ON u.ID = m.user_id
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%administrator%'
ORDER BY u.user_registered DESC;
 
-- Supprimer un utilisateur frauduleux (remplacer l'ID)
DELETE FROM wp_usermeta WHERE user_id = ID_SUSPECT;
DELETE FROM wp_users WHERE ID = ID_SUSPECT;

Nettoyer les Taches Cron Malveillantes

Les attaquants planifient souvent des taches cron pour re-infecter le site :

-- Afficher les taches cron
SELECT option_value FROM wp_options WHERE option_name = 'cron';

Avec WP-CLI :

# Lister toutes les taches cron
wp cron event list --path=/var/www/html
 
# Supprimer une tache cron suspecte
wp cron event delete nom_de_la_tache --path=/var/www/html

Nettoyer les Transients Malveillants

-- Rechercher des transients suspects
SELECT option_name, LEFT(option_value, 200)
FROM wp_options
WHERE option_name LIKE '%_transient_%'
AND (option_value LIKE '%<script%'
     OR option_value LIKE '%eval(%'
     OR LENGTH(option_value) > 50000);
 
-- Supprimer tous les transients expires
DELETE FROM wp_options
WHERE option_name LIKE '%_transient_%';

Etape 5 : Supprimer les Backdoors

Les backdoors sont des points d'acces caches qui permettent a l'attaquant de revenir meme apres le nettoyage. Elles sont la raison principale pour laquelle les sites sont re-infectes.

Signatures de Backdoors Courantes

# Backdoors utilisant des fonctions de callback
grep -rl "preg_replace.*\/e\|create_function\|call_user_func\|array_map.*base64" /var/www/html/wp-content/ --include="*.php"
 
# Backdoors utilisant des variables globales
grep -rl "\$_GET\[.*\]\|\$_POST\[.*\]\|\$_REQUEST\[.*\]" /var/www/html/wp-content/ --include="*.php" | head -20
 
# Backdoors utilisant des websockets ou des connexions inverses
grep -rl "fsockopen\|socket_create\|stream_socket_client" /var/www/html/wp-content/ --include="*.php"
 
# Code obfusque avec des concatenations de caracteres
grep -rl "chr(.*)\.\s*chr(\|\\\\x[0-9a-f]\{2\}" /var/www/html/wp-content/ --include="*.php"

Verifier les Fichiers de Configuration du Serveur

# Rechercher des .htaccess dans les sous-repertoires
find /var/www/html/ -name ".htaccess" -type f
 
# Rechercher des fichiers php.ini malveillants
find /var/www/html/ -name "php.ini" -o -name ".user.ini" | xargs cat
 
# Verifier les fichiers auto_prepend
grep -r "auto_prepend_file\|auto_append_file" /var/www/html/ --include=".htaccess" --include="php.ini" --include=".user.ini"

Rechercher les Webshells

# Webshells classiques
grep -rl "FilesMan\|WSO\|c99shell\|r57shell\|b374k" /var/www/html/ --include="*.php"
 
# Fichiers PHP avec des noms trompeurs dans wp-includes
find /var/www/html/wp-includes/ -name "*.php" | sort > /PATH/TO/current_includes.txt
find /PATH/TO/CLEAN-WP/wp-includes/ -name "*.php" | sort > /PATH/TO/clean_includes.txt
diff /PATH/TO/current_includes.txt /PATH/TO/clean_includes.txt

Etape 6 : Verification avec WP-CLI

WP-CLI dispose de commandes integrees pour verifier l'integrite des fichiers WordPress.

Verification des Checksums

# Verifier l'integrite des fichiers core
wp core verify-checksums --path=/var/www/html
 
# Verifier l'integrite des plugins
wp plugin verify-checksums --all --path=/var/www/html
 
# Lister les plugins desactives (potentiellement malveillants)
wp plugin list --status=inactive --path=/var/www/html

Mettre a Jour WordPress et les Extensions

Apres le nettoyage, mettez tout a jour vers les dernieres versions. Un contrat de maintenance WordPress garantit que ces mises a jour sont effectuees regulierement pour prevenir les reinfections :

# Mettre a jour le core WordPress
wp core update --path=/var/www/html
 
# Mettre a jour tous les plugins
wp plugin update --all --path=/var/www/html
 
# Mettre a jour tous les themes
wp theme update --all --path=/var/www/html
 
# Supprimer les themes et plugins inutilises
wp plugin delete $(wp plugin list --status=inactive --field=name --path=/var/www/html) --path=/var/www/html
wp theme delete $(wp theme list --status=inactive --field=name --path=/var/www/html) --path=/var/www/html

Reinitialiser les Mots de Passe

# Changer le mot de passe de tous les administrateurs
wp user list --role=administrator --field=user_login --path=/var/www/html | while read user; do
  wp user update "$user" --user_pass="$(openssl rand -base64 24)" --path=/var/www/html
  echo "Mot de passe change pour : $user"
done
 
# Regenerer les cles de securite
wp config shuffle-salts --path=/var/www/html

Etape 7 : Verification Finale et Checklist

Avant de remettre le site en ligne, effectuez une verification complete :

Checklist de Verification

VerificationCommandeStatut
Checksums corewp core verify-checksumsA verifier
Checksums pluginswp plugin verify-checksums --allA verifier
Fichiers PHP dans uploadsfind uploads/ -name "*.php"Doit etre vide
Comptes admin inconnusRequete SQL wp_usersA verifier
Taches cron suspecteswp cron event listA verifier
.htaccess propreInspection manuelleA verifier
wp-config.php propreInspection manuelleA verifier
Cles de securite regenereeswp config shuffle-saltsA verifier
Mots de passe changesTous les administrateursA verifier

Scanner avec un Outil Externe

Apres le nettoyage manuel, validez avec un scan externe :

# Scanner avec ClamAV si disponible
clamscan -r /var/www/html/ --infected --remove=no
 
# Utiliser WPScan pour une verification supplementaire
wpscan --url https://votre-site.com --enumerate vp,vt

Retirer le Mode Maintenance

# Supprimer le fichier de maintenance
rm /var/www/html/.maintenance
 
# Vider le cache
wp cache flush --path=/var/www/html

Actions Post-Nettoyage

Le nettoyage est termine, mais votre travail ne s'arrete pas la. Plusieurs actions sont necessaires pour empecher la re-infection.

Demander un Reexamen Google

Si votre site a ete signale comme dangereux par Google :

  1. Connectez-vous a Google Search Console
  2. Accedez a Securite et actions manuelles
  3. Cliquez sur Demander un examen
  4. Decrivez les actions de nettoyage entreprises

Monitorer le Site

# Creer un script de monitoring basique
cat > /usr/local/bin/wp-monitor.sh << 'SCRIPT'
#!/bin/bash
SITE_PATH="/var/www/html"
LOG="/var/log/wp-monitor.log"
 
# Verifier les checksums
wp core verify-checksums --path=$SITE_PATH >> $LOG 2>&1
 
# Verifier les fichiers modifies dans les 24h
find $SITE_PATH -name "*.php" -mtime -1 >> $LOG 2>&1
 
# Verifier les fichiers PHP dans uploads
find $SITE_PATH/wp-content/uploads/ -name "*.php" >> $LOG 2>&1
 
echo "--- Scan termine le $(date) ---" >> $LOG
SCRIPT
 
chmod +x /usr/local/bin/wp-monitor.sh
 
# Ajouter au crontab (scan quotidien a 3h du matin)
echo "0 3 * * * /usr/local/bin/wp-monitor.sh" | crontab -

Quand Faire Appel a un Expert

Le nettoyage manuel est efficace pour les infections classiques, mais certaines situations depassent le cadre d'une intervention autonome :

  • Infections persistantes qui reviennent malgre plusieurs nettoyages
  • Compromission au niveau serveur (rootkit, acces SSH non autorise)
  • Sites e-commerce ou des donnees sensibles sont potentiellement compromises
  • Malwares polymorphiques qui changent de signature a chaque scan
  • Blacklisting par Google ou les navigateurs qui persiste apres nettoyage

Notre equipe intervient sur les infections complexes avec un protocole de nettoyage en profondeur et une garantie de non re-infection. Decouvrez notre service de suppression de malware WordPress ou consultez nos solutions de securite WordPress pour une protection proactive.

Pour aller plus loin, consultez notre guide sur les signes qui indiquent que votre site WordPress a ete pirate et notre catalogue des malwares WordPress les plus courants en 2026.

Articles similaires