Comment j’ai surmonté mon premier piratage et sécurisé mon site

Partagez si vous aimez ->

Aujourd’hui, j’ai le plaisir de publier une expérience contre votre ennemi public numéro 1 : le piratage. Michaël, qui m’a envoyé ce témoignage, se présente comme un auto-didacte ; je rajouterais aussi qu’il est passionné par le code, aux vues de son article très bien détaillé. Il vient vous raconter comment il s’est fait piraté et surtout, comment il s’en est sorti !

J’espère que vous apprécierez ce compte rendu autant que moi ; j’ai pensé que le point de vue d’un néophyte apporterait un regard nouveau sur ce sujet qui fait souvent très peur.

I – Comment me suis-je fait pirater mon site ?

Au printemps dernier, j’ai entrepris de monter un blog WordPress.

Je dois avouer que je ne suis pas un expert en informatique mais juste un autodidacte. Mon domaine d’expertise serait plutôt celui de la santé (au sens large)…

Bref, quelques mois et dix articles plus tard, en plein week-end du 15 août, bingo ! Premier piratage en règle : tout le contenu avait disparu !

J’ai d’abord cru à un bug de la dernière version 3.9.2 de WordPress que je venais de mettre à jour. Mais le contexte ne collait pas vraiment avec cette hypothèse. le blog semblait désespérément vide. Côté tableau de bord : plus aucun article ni aucune page. C’est comme si le blog était vierge. Toutes les catégories avaient disparu. Il subsistait quelques bribes de commentaires et c’est tout.

En essayant de réenregistrer un de mes articles (heureusement sauvegardés), pas moyen d’entrer les mots-clés. A la place du bouton « Publier » apparaissait un étrange bouton « Soumettre à la relecture ». Une fois l’article enregistré en brouillon, hop, voilà qu’il disparaissait dans un gouffre ! Abracadabra, effacé ! Et les sables mouvants se sont refermés sur un index des articles apparaissant neuf et vierge comme au premier jour.

Panique à bord !

II- Etablir le diagnostic du piratage

Je contacte le support de WordPress

Le support est joignable à cette adresse : http://www.wordpress-fr.net/support/

Première suggestion : désactiver toutes les extensions. Impossible de le faire du tableau de bord, tout paraît bloqué. Passant par le FTP, en renommant le fichier « plugins » en « X-plugins », c’est possible.

Le problème subsiste-il, me demande-on ? Oui. Ca ne change rien. De surcroît, une avalanche de « pings » hautement suspects, jusque là endiguée par Akismet (qui n’est alors plus actif), déferle sur les ruines de mon pauvre blog…

Le hack est probable, il m’est suggéré de tester le site ici (n’est pas fiable à 100 % me dit-on) : http://sitecheck.sucuri.net/

Tous les indicateurs sont dans le rouge. Le blog a été hacké !

Aïe, aïe, aïe… Comment vais-je me tirer de ce mauvais pas… ?

« As-tu une sauvegarde de la base de données et des fichiers du site avant l’incident ? Si c’est le cas, cela permettrait de la remettre dans l’état où elle était auparavant… », me demande le modérateur de WordPress.

Aïe ! Pas de sauvegarde fiable de la base de données, tout simplement parce que j’avais fait confiance jusqu’à lors à un plugin que je ne nommerai pas et qui m’avait fourni des archives parfaitement inexploitables… Heureusement pour moi, tous mes articles (écrits en HTML avec leur mise en page, une habitude que j’ai gardé du temps où j’éditais un site statique…) sont sauvegardés.

Comment avoir une sauvegarde fiable de sa base de données ?

Depuis, croyez-moi, j’ai appris ce que c’est qu’une base de donnée et comment ça se sauvegarde manuellement (étape indispensable si l’on ne veut pas voir son blog dépendre d’un plugin foireux), et surtout comment ça se restaure !

Après avoir appris à le faire à la main, voici une extension fiable pour le faire automatiquement, « WP-DB-Backup » par Austin Matzko. Je vous recommande d’ouvrir une adresse Gmail dédiée exclusivement à la sauvegarde de votre base de donnée, et automatiser ainsi celle-ci une fois par jour (vous y ferez le ménage de temps en temps).

Nettoyer une base de données infectée après un piratage

J’ai appris également, après avoir tout écrasé et tout réinstallé à neuf, qu’une base de donnée infectée se nettoie suivant les indications de cet excellent tutoriel qui donne la marche à suivre pas à pas après un piratage… 🙂 http://www.iceranking.com/wordpress-seo/guide-complet-pour-nettoyer-et-securiser-wordpress-apres-un-hacking/

Vérifier que la sauvegarde des fichiers n’est pas infectée

Quant à WordPress, il suffit en fait de vérifier le dossier wp-content en local (sur votre ordinateur) avec un antivirus avant de le réinstaller (d’où l’intérêt de le sauvegarder également :).

III – L’orage passé, les premières précautions de sécurisation à prendre pour ne plus être piraté

Le fichier .htaccess pour vérouiller l’entrée

Le premier conseil qui m’a été donné (toujours pas le modérateur de WordPress-fr.net), c’est de blinder le .htaccess ainsi :

# Protection du fichier .htaccess
Order Allow,Deny
Deny from all

# Protection du fichier wp-config.php
order allow,deny
deny from all

# Desactivation de l'affichage des repertoires
Options All -Indexes

Puis, de sécuriser son blog comme indiqué ici : http://www.lumieredelune.com/encrelune/securiser-wordpress,2012,12

Plus malin : planquer son wp-login en le renommant et en le déménageant !

Beaucoup de monde essaie de forcer l’entrée de votre site via le fichier wp-login.php. Vous ne me croyez pas ? Essayez d’installer un petit mouchard à la racine du fichier index.php (qui initialise WordPress), pour qu’il vous envoie par mail l’adresse IP de chaque visiteur (dans un autre compte gmail dédié, par ex : monadressedediee@gmail.com). Voici comment faire :

/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/

/* mouchard */
$ip = $_SERVER['REMOTE_ADDR'];
mail('monadressedediee@gmail.com', 'Ip visiteur', ' .$ip. ');
/**

 

Je l’ai fait… et j’ai commencé à réaliser avec sidération le nombre d’IPs de visiteurs « exotiques » qui se baladaient sur mon site (de Chine, Russie, Roumanie, etc.), parfois la même IP toutes les minutes, 60 fois par heure !

Pas bon, tout ça, même en ayant renommé le compte administrateur de ‘admin’ vers un nom moins évident. Que faire d’autre ? Planquer le wp-login !

« Est-il possible de renommer manuellement ‘wp-login.php’ ?

J’ai testé.

La réponse est oui.

Remarque de Marie-Eve : J’ai retiré cette partie du tutoriel car ce type de modification dans le coeur de WordPress sera écrasé à chaque mise à jour…c’est à dire très souvent. Je vous recommande plutôt de passer par un plugin comme « Rename wp-login.php » ou par une modification de votre fichiers functions.php pour renommer le fichier login.php.

Après quelques tests en local grâce à Easy-php (un logiciel que je recommande pour vos sites en local), j’ai fini par trouver un plugin idéal « better-wp-security » : ce plugin n’a rien à envier aux solutions professionnelles comme Sucuri !

(A peine) plus compliqué : renommer & déménager son wp-content

En éditant le journal des erreurs 404 d’un plugin qui s’appelle « Redirection« , j’ai constaté de nombreux essais en force de hacks sur les plugins.
Le premier visé étant (cela revient sans arrêt), ‘contactform7’… Bon à savoir !

Un moyen efficace de planter sur place tout ce beau petit monde serait donc de changer carrément le wp-content d’adresse.
Est-ce possible ?

Plusieurs ressources indiquent que oui, à commencer par le codex de wp : http://codex.wordpress.org/Editing_wp-config.php#Moving_wp-content_folder

La marche à suivre est la suivante :

1/ Editer le wp-config (une sauvegarde préalable serait la bienvenue 🙂

Les différents auteurs recommandent de se placer avant la dernière ligne. Cela veut dire en clair n’importe où entre le début et la fin 🙂 Pour ma part, je me suis calé juste en dessous de l’instruction de mode deboguage vers la ligne 90.

2/ Ensuite, il y a les instructions à modifier dans le code. J’ai trouvé assez peu de clarté personnellement chez les principaux auteurs…jusqu’à ce que je trouve le pourquoi du comment… lequel est d’une simplicité éblouissante !

En fait, il y a un binôme d’instruction.

  1. La première instruction définit le ‘WP_CONTENT_DIR’, le chemin absolu de la direction du répertoire ‘wp-content’ que l’on souhaite renommer + déplacer.
  2. La seconde définit le ‘WP_CONTENT_URL’, l’adresse du répertoire donné.

Pour la première, le codex propose une instruction qui pourrait être un raccourci, mais qui en fait ne fonctionne pas 🙂

1 – Ce qui fonctionne, c’est de définir cette première instruction en deux temps :

define ('WP_CONTENT_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux');
define ('WP_CONTENT_DIR', ABSPATH . WP_CONTENT_FOLDERNAME) ;

2- La deuxième instruction se passe de commentaires :

define( 'WP_CONTENT_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux');

Cela donne le triplet suivant à placer dans le fichier wp-config.php :

define ('WP_CONTENT_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux');
define ('WP_CONTENT_DIR', ABSPATH . WP_CONTENT_FOLDERNAME) ;
define( 'WP_CONTENT_URL', 'http://www.mondomaine.com//mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux');

En théorie, c’est tout !

En pratique, plusieurs auteurs, dont le Codex, mettent en garde l’utilisateur en lui recommandant de spécifier CHAQUE chemin pour CHAQUE sous-répertoire du ‘wp-content’

Cela donne donc :

/* Demenagement du wp-content */

define ('WP_CONTENT_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux');
define ('WP_CONTENT_DIR', ABSPATH . WP_CONTENT_FOLDERNAME) ;
define( 'WP_CONTENT_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux');

define ('WP_PLUGIN_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/plugins');
define ('WP_PLUGIN_DIR', ABSPATH . WP_PLUGIN_FOLDERNAME) ;
define( 'PLUGINDIR', ABSPATH . WP_PLUGIN_FOLDERNAME) ;
define( 'WP_PLUGIN_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/plugins');

define ('WP_THEMES_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/themes');
define ('WP_THEMES_DIR', ABSPATH . WP_THEMES_FOLDERNAME) ;
define( 'WP_THEMES_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/themes');

define ('WP_LANGUAGES_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/languages');
define ('WP_LANGUAGES_DIR', ABSPATH . WP_LANGUAGES_FOLDERNAME) ;
define( 'WP_LANGUAGES_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/languages');

define ('WP_DOWNLOADS_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/downloads');
define ('WP_DOWNLOADS_DIR', ABSPATH . WP_DOWNLOADS_FOLDERNAME) ;
define( 'WP_DOWNLOADS_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/downloads');

define ('WP_WP-ADMIN_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/wp-admin');
define ('WP_WP-ADMIN_DIR', ABSPATH . WP_WP-ADMIN_FOLDERNAME) ;
define( 'WP_WP-ADMIN_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/wp-admin');

define ('WP_UPLOADS_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/uploads');
define ('WP_UPLOADS_DIR', ABSPATH . WP_CONTENT_FOLDERNAME) ;
define( 'WP_UPLOADS_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/uploads');

define ('WP_UPGRADE_FOLDERNAME', '/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/upgrade');
define ('WP_UPGRADE_DIR', ABSPATH . WP_UPGRADE_FOLDERNAME) ;
define( 'WP_UPGRADE_URL', 'http://www.mondomaine.com/mon-chemin-pour-acceder-au/wp-content-renomme-en-ce-que-je-veux/upgrade');

C’est tout, et ça fonctionne !

Ah, juste un dernier bémol :

Si plugin s’avère défaillant suite à cette manipulation, c’est qu’il est mal programmé. Il faudra alors remplacer manuellement, dans le code du plugin, toute mention à un dossier ‘wp-content’ par la fonction ‘use content_url()’ (un bonheur:)… ou alors se passer du plugin en question !

Voilà, j’espère que ce retour d’expérience vous aura aidé vous aussi à mettre votre précieux blog un peu mieux à l’abri !

Un témoignage signé Michaël Ramain, auteur du site ecoledumieuxetre.com.

Partagez si vous aimez ->

Youcef

Concepteur de Sites Web et entrepreneur, l'écriture et la pédagogie font aussi partie de mes passions. Mon objectif est de vous aider à trouver la solution idéale pour créer votre propre Site Internet.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Simple Share Buttons