WordPress et le piratage, une affaire qui dure…

Mathieu Chartier CMS (WordPress...) 0 commentaire

Piratage de sites WordPress (hack), comment s'en défaire ?

WordPress souffre d'un tel succès qu'il devient fréquemment la cible d'attaques et de pirates. Avec plus de 43% de parts de marché tous types de sites confondus selon W3Techs, il faut bien admettre que la cible idéale est toute trouvée pour des hackers toujours à la recherche de défis ou de menaces à exécuter.

Les piratages de sites WordPress sont courant mais cela semble se multiplier en cette rentrée 2023, avec des procédures souvent similaires (intégration de malwares dans des fichiers PHP qui s'exécutent en arrière-plan et injectent des fichiers/codes un peu partout tel un virus). Souvent la faille provient d'extensions réputées, comme Elementor Pro en avril et Essential Addons for Elementor en mai, Ultimate Member en juillet ou encore TagDiv Composer en ce mois d'octobre 2023. Souvent, des milliers de sites sont affectés voire plus, donc personne n'est totalement à l'abri.

Stop aux fausses rumeurs

Précisons qu'il est courant d'entendre que WordPress est une passoire et qu'il manque de sécurité mais sous des apparences de vérité, des biais persistent. En effet, WordPress aurait nettement de quoi être plus sécurisé par défaut (rien que le choix forcé de wp-admin est une hérésie, heureusement que des extensions sauvent les meubles) mais si on le compare à de multiples autres outils du marché, on ne peut pas affirmer qu'ils soient bien plus sécurisés (certains le sont si nous sommes parfaitement honnêtes...).

En outre, et comme nous l'avons indiqué en préambule de cet article, les sites WordPress sont si nombreux qu'il est évident que le nombre de piratages sera bien plus élevé que pour des concurrents aux parts de marché faméliques. C'est un peu la rengaine souvent entendue entre Windows et Mac vous savez, qui dirait que Mac est costaud quand Windows est bondé de failles, alors que la réalité est bien loin d'être aussi nette et que le nombre des ventes entre les deux OS est incomparable (75% pour Windows contre 15% pour Mac et le reste pour tous les autres OS (dont Linus ou Chrome OS).

Enfin, rappelons que bon nombre de hacks proviennent des extensions installées par les usagers, dont parfois des plugins Premium téléchargés en "nulled" avec des malwares pré-intégrés (l'art de se tirer une balle dans le pied ^^). Ces plugins sont développés par des programmeurs pas toujours au point niveau sécurité (et je me range dedans, car nul n'est expert en tout) et WordPress ne peut pas tout surveiller en temps réel, laissant donc des failles de sécurité passer par ce biais. Ce n'est pas la seule cause mais elle compte beaucoup dans la masse.

Comment vérifier si notre site est piraté ?

Il n'existe pas de remède miracle pour repérer un piratage WordPress mais plusieurs solutions s'offrent à vous :

  • Vérifier la présence d'un plugin hacké. Actuellement, on retrouve très fréquemment une extension qui se nomme joliment "WordPress Core" alors qu'elle n'a rien à faire ici et qu'il s'agit d'un malware (à ne surtout pas activer donc).

Présence de faux plugins WordPress (malware) pour pirater des sites

  • Vérifier la liste des fichiers via un logiciel FTP comme FileZilla ou WinSCP (pour ne citer qu'eux...). Si vous n'êtes pas trop connaisseurs, l'astuce peut être de télécharger un WordPress nu sur fr.wordpress.org et de comparer la liste des fichiers initiaux. Parfois, des fichiers PHP sont modifiés donc le poids est complètement différents. Dans d'autres cas, des fichiers PHP sont ajoutés discrètement au milieu des autres (par exemple, des fichiers about.php ou index.php dans des dossiers qui n'en ont pas habituellement). Et surtout, attention aux faux fichiers .htaccess qui peuvent être ajoutés pour vous déranger.
  • Vérifier le code source des pages Web et regarder si des éléments semblent totalement anormaux, comme des textes ou codes sans queue ni tête. Toutefois, cela implique une bonne maîtrise technique pour être repéré.

Evidemment, certains piratages sautent aux yeux car les malwares ont déjà pu faire leur oeuvre et on voit alors de faux articles publiés automatiquement ou des balises <title> modifiées, mais aussi des publicités qui s'affichent après une redirection, etc.

Comment nettoyer un site WordPress piraté ?

Je vais vous donner une méthode mais cela ne veut pas dire qu'elle fonctionnera pour l'ensemble des cas de figures et des types de  piratage. Mon objectif est surtout de vous permettre de retrouver un site en état de marche le plus rapidement possible, en limitant le nombre de risques au maximum. Parfois, un hack ressurgit quelques temps mais arrive à être nettoyé rapidement car il est déjà affaiblit, il faut donc parfois deux ou trois passes avant de totalement éradiquer certains malwares récalcitrants.

Il va sans dire que vous devez avoir des sauvegardes de vos sites en main par sécurité, car un site piraté peut être réparé mais cela présente toujours un risque de pertes de données. Certes, il est souvent possible de réparer sans ne rien perdre, mais la tendance est plutôt d'avoir une version suffisamment récente que l'on pourrait tout restaurer aisément. Nous allons ici considéré que vous n'avez pas de version proche sauvegardée, et que nous devons donc nettoyer l'existant du mieux possible.

Vous avez encore accès au site et à l'interface d'administration (back-office) ?

Il est fréquent d'avoir un site WordPress piraté mais toujours fonctionnel. Dans ce cas, la gêne se situe souvent dans des redirections vers des publicités ou de l'injection d'articles indésirables, il est donc possible d'agir plus facilement.

Par expérience, mon premier réflexe est toujours d'aller voir les Comptes dans WordPress, afin de vérifier si les pirates n'ont pas créé/modifié un compte administrateur à leur profit. Cela est rarement évoqué mais un hacker malin aurait tout intérêt à se créer un compte si la faisabilité technique lui permet de le faire. Il n'y aurait rien de pire que de nettoyer un piratage mais d'avoir laissé par inadvertance la main sur le site au pirate. D'ailleurs, c'est le même conseil que je dispense lorsqu'un compte de réseau social ou une adresse email est piratée, il est fortement conseillé d'aller vérifier si un autre administrateur ou une adresse de rechange/transfert n'a pas été ajoutée en aval.

Deuxième solution, vous pouvez installer un plugin de sécurité, même une version gratuite de Wordfence Security ou équivalent par exemple, et ainsi lancer un scan. Ce type de plugin arrive à détecter certains fichiers piratés et peuvent nous aider à les repérer et à les remplacer ou les supprimer. En outre, si vous avez un hébergeur de qualité, il peut être intéressant de se rendre dans le Cpanel (panneau de configuration du serveur) et de lancer un scan si un anti-malware est présent. Par exemple chez o2switch, il y a la possibilité d'utiliser ImunifyAV qui permet de rapidement détecter des fichiers piratés.

Imunify AV chez o2switch, un anti-malware intégré à l'hébergement web

Pour tous les cas de WordPress piratés

Il nous faut supprimer/remplacer les fichiers vérolés. Pour ce faire, il faut procéder ainsi :

  • Téléchargez une version propre de WordPress sur fr.wordpress.org (idéalement la même version que celle installée si vous vous en souvenez), qui va nous servir de base pour transférer les fichiers propres vers le site piraté.
  • Vérifiez tout d'abord les fichiers .htaccess et les droits utilisateurs sur le serveur (par exemple, un pirate peut vous embêter en ne vous donnant plus de droits d'écriture sur un fichier). Rares sont les piratages qui touchent à ce point précis mais quand cela arrive, les étapes qui vont suivre sont tout ou partie bloquées. L'objectif est ici de vous empêcher de retirer le hack, donc autant s'en assurer rapidement. Observez le WordPress propre que vous avez téléchargé et vérifiez si des fichiers .htaccess n'ont pas été injectés, ou même si leur poids n'a pas été lourdement affecté (un tel fichier pèse généralement quelques Ko ou dizaines de Ko, pas plus). Vous pouvez même supprimer le .htaccess principal par sécurité et de le régénérer en allant dans Réglages > Permaliens > Enregistrer (sans rien changer, il suffit juste d'enregistrer).

Maintenant que les étapes préalables sont réalisées, le temps des modifications est arrivée. Il va falloir accepter que le site va planter le temps du nettoyage, mais c'est un mal pour un bien !

  1. À l'aide d'un client FTP comme Filezilla ou WinSCP, supprimez les dossiers wp-admin et wp-includes ainsi que tous les fichiers PHP situés à la racine du site WordPress (attention au fichier wp-config.php qu'il est conseillé de récupéré si vous avez besoin de vos identifiants de bases de données par exemple, donc ne pas forcément le supprimer). On retire alors le coeur de WordPress et le back-office, on ne conserve que le dossier wp-content qui contient notamment les fichiers de traduction, les extensions ou encore les médias présents dans le site (donc ce serait dommage de les supprimer si on considère que vous n'avez aucune sauvegarde).
  2. On remplace les dossiers et fichiers supprimés par ceux issus du WordPress propre que nous avons préalablement téléchargé. Cette étape consiste donc à renvoyer les fichiers natifs vers l'hébergement, tout simplement. Normalement, après cette étape, déjà bon nombre de malwares sont éliminés (parfois même la totalité selon le type de piratage).
  3. Si malheureusement le hack provient d'un plugin ou d'un thème, il va falloir agir dans le dossier wp-content. Evidemment, si vous avez une sauvegarde vos plugins ou de vos thèmes, il suffit de procéder comme dans les étapes 1 et 2, en supprimer les dossiers présents sur le serveur et en replaçant les dossiers de votre propre sauvegarde. Sinon, il va falloir regarder dans chaque dossier (oui oui...) si des fichiers PHP vérolés ont été injectés. C'est l'étape très chronophage mais néanmoins indispensable pour s'assurer que plus rien ne reste. Il est possible de gagner du temps avec les extensions, en les supprimant et en réinstallant les dernières versions (soit par le back-office de WordPress, soit en télécharger les plugins sur le site de WordPress), et parfois même pour le thème, mais pour tout le reste, c'est un travail manuel qui s'engage. Il faut alors vérifier les dossiers uploads (et les sous-dossiers), upgrade et languages qui ne doivent en théorie contenir aucun fichier en PHP et souvent aucun fichier .htaccess (on peut procéder de la même manière en vérifiant la racine des dossiers plugins et themes). Si vous avez un doute sur un fichier, n'hésitez pas à le télécharger et à l'ouvrir avec un éditeur de code comme Notepad++, SublimeText ou Visual Studio Code par exemple, c'est généralement criant quand un hack est implanté (on voit du code offusqué généralement ou des liens vers des sites externes, etc.), parfois même pour des néophytes.

Quand toutes ces étapes sont menées à bien, votre site WordPress est souvent largement nettoyé. Cela ne veut pas dire que des traces ou des processus de piratage ne sont pas encore présents, mais le gros du travail est réalisé. Si malheureusement cela ne suffit pas, il faut parfois refaire le même travail plusieurs fois jusqu'à éradiquer les dernières miettes. Rappelons toutefois que repartir d'une sauvegarde récente rend toute la procédure extrêmement plus simple et rapide évidemment...

Peut-on mieux sécuriser son site WordPress ?

Évidemment, l'idée est de se protéger en amont ou dès qu'un piratage imprévu survient et est retiré. Je vais tomber dans les banalités mais installer de bons plugins de sécurité reste la solution le plus simple. Certains vous protègent contre certains malwares et plusieurs types d'injections. D'autres modifient le répertoire wp-admin ou limitent le nombre de tentatives de connexion pour éviter les attaques de brute force. D'autres font des scans réguliers pour vous avertir d'éventuelles failles. Tout est possible ou presque, mais cela est parfois payant.

Une autre solution facile est de faire un copier-coller de ce que je vais vous mettre par la suite dans le fichier .htaccess situé à la racine de WordPress. Des sites rentrent beaucoup plus dans les détails que moi, mais déjà, ces dizaines de ligne de code freinent pas mal de choses...

# Désactiver l'affichage du contenu des répertoires
# IndexIgnore * # Variante de la ligne suivante si cette dernière ne fonctionne pas
Options All -Indexes

# Masquer les informations du serveur (à commenter avec un "#" devant la ligne si cela fait planter votre serveur)
ServerSignature Off

# Protéger le fichier wp-config.php
<files wp-config.php>
order allow,deny
deny from all
</files>

# Protéger les fichiers .htaccess, .htpasswd, etc.
<FilesMatch "^.*(error_log|wp-config.php|readme.html|.[hH][tT][aApP].*)$">
order allow,deny
deny from all
satisfy all
</FilesMatch>

# Désactiver les requêtes pour xmlrpc.php (attention, cela bloque les pingbacks, rétroliens...) => Source de beaucoup de hacks
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>

# Bloquer l'utilisation de certains scripts
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

# Protection contre des injections de fichiers
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]
</IfModule>

# Bloquer les iframes provenant du site (attention, cela peut parfois être gênant si vous partagez vos contenus vers les réseaux sociaux)
<IfModule mod_headers.c>
Header set X-Frame-Options DENY
Header set Content-Security-Policy "frame-ancestors 'none';"
</IfModule>

# Quelques filtres contre des injections, des failles XSS, etc.
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(127\.0).* [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)(https?|ftp|mosConfig)(%3A|:)//(.*)$ [NC,OR] # Attention, elle peut casser des redirections de type http://www.truc.fr/index.php?r=http://www.google.fr
RewriteCond %{QUERY_STRING} ^.*(_encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
</IfModule>

# Désactiver le hotlinking de vos images
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://blog.internet-formation.fr [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
</IfModule>

Vous pouvez également un fichier .htaccess plus spécifique dans le dossier wp-content, absent dans le WordPress natif (un équivalent peut aussi être ajouté dans wp-content/uploads). L'objectif est ici de limiter les types de fichiers autorisés ou de bloquer l'accès à des ressources PHP, etc. Attention toutefois car ces codes peut être radicaux, au point de parfois vous bloquer vous-mêmes. ^^

# Bloque les accès directs aux fichiers PHP
<FilesMatch "\.(?i:php)$">
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
</FilesMatch>

# N'autorise l'accès qu'aux extensions de fichiers listés ici (donc si vous êtes bloqués, c'est souvent qu'une extension n'est pas ajoutée dans la liste ^^)
Order deny,allow
Deny from all
<Files ~ ".(xml|css|jpe?g|png|gif|js|json|pdf|woff|woff2|eot|ttf|otf|svg|wpress)$">
Allow from all
</Files>

Vous pouvez également compléter la sécurité en intégrant dans des dossiers "à risque" des fichiers index.php vides, ou même trouver d'autres solutions (blocage de certains types de ressources, redirections automatiques pour certaines IP, etc.) pour ajouter encore d'autres freins au piratage. Tout est bon à prendre !

Conclusion

Vous l'aurez compris, il est fréquent d'être piraté avec WordPress mais ne cédez pas à la panique, il peut être assez facile de nettoyer un piratage avec une bonne méthode et une certaine rigueur. Il faut parfois avoir des compétences en développement web pour se faciliter la tâche mais vous pouvez vous faire aider en cas de besoin. Tout ce que je vous ai dis n'est pas une vérité absolue, mais juste un procédé que j'ai appliqué par le passé sur des dizaines de sites WordPress malheureusement piratés (et qui ne le sont plus à présent) pour rapidement retrouver un site en production, alors j'espère que cela pourra un peu vous aiguiller et vous aider...