
Supprimer un Malware WordPress Manuellement : Guide Technique
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
| Outil | Utilisation | Acces |
|---|---|---|
| SSH | Acces en ligne de commande au serveur | Terminal / PuTTY |
| SFTP | Transfert de fichiers securise | FileZilla / WinSCP |
| phpMyAdmin | Administration de la base de donnees | Panel hebergeur |
| WP-CLI | Interface en ligne de commande WordPress | Installation sur le serveur |
| Editeur de texte | Analyse de fichiers | nano / 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.sqlMettre 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/.maintenanceEtape 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.phpRecherchez et supprimez :
- Tout code avant
<?phpen debut de fichier - Des lignes contenant
eval(),base64_decode(),str_rot13() - Des
require()ouinclude()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.phpRegenerez 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/.htaccessRecherchez :
- Des
RewriteRuleredirigeant vers des domaines externes - Des blocs
<FilesMatch>masquant des fichiers PHP - Des instructions
php_value auto_prepend_filechargeant 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 WordPressNettoyer 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
doneNettoyer 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/htmlPour 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/htmlNettoyer 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.txtEtape 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/htmlMettre 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/htmlReinitialiser 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/htmlEtape 7 : Verification Finale et Checklist
Avant de remettre le site en ligne, effectuez une verification complete :
Checklist de Verification
| Verification | Commande | Statut |
|---|---|---|
| Checksums core | wp core verify-checksums | A verifier |
| Checksums plugins | wp plugin verify-checksums --all | A verifier |
| Fichiers PHP dans uploads | find uploads/ -name "*.php" | Doit etre vide |
| Comptes admin inconnus | Requete SQL wp_users | A verifier |
| Taches cron suspectes | wp cron event list | A verifier |
| .htaccess propre | Inspection manuelle | A verifier |
| wp-config.php propre | Inspection manuelle | A verifier |
| Cles de securite regenerees | wp config shuffle-salts | A verifier |
| Mots de passe changes | Tous les administrateurs | A 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,vtRetirer le Mode Maintenance
# Supprimer le fichier de maintenance
rm /var/www/html/.maintenance
# Vider le cache
wp cache flush --path=/var/www/htmlActions 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 :
- Connectez-vous a Google Search Console
- Accedez a Securite et actions manuelles
- Cliquez sur Demander un examen
- 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.

