Wordpress, la plateforme de blog la plus répandue et exploitée par les blogueurs est aussi la plateforme qui subit bon nombre d'attaques. Afin de réduire les chances aux hackers de s'infiltrer sur votre blog, je vais vous donner quelques astuces qui vous seront utiles.
Je rajouterai de temps en temps des nouveautés relatives à la sécurité sous Wordpress.
En attendant cet article traite des points suivants :
Pour les administrateurs :
- Préfixe de tables en base de données
- Akismet pour la protection contre le spam
- Utiliser un SALT
- Limiter le nombre de tentatives de connexion qui ont échoué
- Restreindre les mots de passe trop simples
- Ne pas utiliser l'utilisateur "admin" par défaut
- Protéger le fichier de configuration wp-config.php
- Cacher le numéro de version de Wordpress
- Exploits via les URLs
- Protection des répertoires
- Autorisations et intentions d'accès
- Gérer les autorisations sous Wordpress
- Gérer les intentions sous Wordpress
Quand vous installez Wordpress, vous avez la chance de créer votre propre base de données avec un préfixe définit par vous-même pour les tables. Par défaut le préfixe sous Wordpress est wp_.
Si vous ne le changez pas, cela pourrait fortement aider les hackers à corrompre votre base de données en cas de faille. Vous pouvez pour cela utiliser des plugins (on verra juste après) pour le changer ou bien en modifiant le fichier wp-config.php durant l'installation manuelle.
Ouvrez le fichier wp-config.php avant de commencer l'installation de Wordpress et remplacez :
$table_prefix = 'wp_';
Par :
$table_prefix = 'votreprefixe_';
Si votre blog est déjà en place, il y aura deux étapes supplémentaires après celle-ci.
Connectez-vous à votre base de données (le plus souvent via phpMyAdmin) et modifiez tous les noms des tables de la base de données avec votre préfixe.
Une fois fait, vous devez maintenant rechercher les lignes contenant wp_ dans les tables options et usermeta. Pour cela nous allons exécuter la requête suivante sur phpMyAdmin (onglet SQL) :
SELECT * FROM `myprefix_options` WHERE `option_name` LIKE '%wp_%' SELECT * FROM `myprefix_usermeta` WHERE `meta_key` LIKE '%wp_%'
Une fois la requête exécutée, celle-ci affichera les lignes. Vous n'aurez plus qu'à remplacer wp_ par votre préfixe.
On a vu pour la partie manuelle. Il faut savoir qu'il existe un plugin qui effectue la même action que ci-dessus.
Pour cela téléchargez WP Security Scan. Une fois le plugin en place, un menu devrait apparaître sur la gauche.
Cliquez sur Database puis mettez votre préfixe dans le menu Change database prefix et validez.
Bon je sais que vous avez tous vos préférences au niveau des plugins pour lutter contre le spam mais je tiens à mettre en avant Akismet. Ne pas mettre Akismet c'est comme envoyer un carton d'invitation aux spammers.
Un SALT est une clé secrète d'authentification utilisée généralement pour se concaténer à un mot de passe et le tout est ensuite crypté. Ceci afin d'éviter les attaques de type brute force.
Le SALT peut être généré ici. Copiez les lignes et remplacez celles présentes dans le fichier wp-config.php et c'est fait.
La sécurité de la connexion au tableau de bord est primordial. Pour rajouter une couche de protection je vous conseille de restreindre le nombre de connexion en échec. En utilisant le plugin Login LockDown vous serez tranquille.
C'est une sale habitude chez les utilisateurs qui voudraient s'inscrire sur votre blog que de mettre des mots de passe ALC (à la con ) comme le très célèbre azerty ou 123456.
Pour éviter cette manie vous pouvez forcer l'utilisateur à créer un mot de passe compliqué avec Wordpress Password Cracker.
Comme sur linux avec root, il ne faut évidemment pas utiliser l'utilisateur par défaut "admin" sous Wordpress.
Pour changer l'administrateur créé par défaut sous Wordpress procédez comme ceci :
- Créez un nouvel utilisateur auquel vous voulez attribuer les droits admin.
- Connectez-vous avec ce nouvel utilisateur.
- Supprimez l'utilisateur "admin".
- Avant de supprimer quelconque utilisateur, Wordpress vous demandera si vous souhaitez réattribuer les articles et les liens à un autre utilisateur. Sélectionnez l'option "Attribuer tous les articles et les liens à :" et choisissez le nouveau nom d'utilisateur.
wp-config.php est un des fichiers les plus important sur Wordpress. Celui-ci contient comme on l'a vu le SALT, le préfixe des tables et informations relatives à la base de données.
Pour protéger ce fichier ouvrez le fichier .htaccess situé à la racine de votre blog et ajoutez ces quelques lignes :
order allow,deny deny from all
Si vous avez déjà installé WP Security Scan, alors le numéro de version de Wordpress est déjà caché. Pourquoi fait-on ça? Si un hacker connait le numéro de version Wordpress de votre blog, celui-ci saura quelle vulnérabilité utiliser pour cracker votre blog. Au niveau de WP Security Scan c'est indiqué sur la page d'accueil du plugin.
Si vous êtes un vieux d'la vielle et que vous avez une version de Wordpress inférieure à la 2.6 alors vous devrez faire tout cela manuellement. Ouvrez le fichier header.php du thème que vous utilisez et supprimez le Meta tag suivant si il existe :
Avec l'exploits d'URL, certains pirates tentent de trouver des points faibles sur votre site en faisant des demandes qui retourneraient normalement une page d'erreur.
http://mysite.com/go/to/exploit/%2F/config
Ce genre d'URL hypothétique pourrait par exemple permettre à un hacker d'accéder à une ressource qui n'est pas censé être accessible.
Pour contrer ce genre de menace, il va falloir toucher au .htaccess à la racine de votre blog. Des règles permettent de bloquer automatiquement des requêtes non fondées sur des chaînes présentes dans l'URL.
Par exemple il n'y a aucune raison qu'un crochet soit présent dans l'URL. Cela peut être dû à une erreur de frappe d'un utilisateur ou à une tentative d'attaque. Pour cela on va renvoyer ce genre d'URL vers une page type 403 Forbidden. On écrira donc dans le .htaccess :
RedirectMatch 403 \[
Bien sûr les crochets ne sont qu'un exemple parmi tant d'autres. Heureusement, Jeef Starr nous a concocté une liste de règles pour prévenir ce genre d'attaques. Vous pouvez télécharger gratuitement la dernière version 5G Firewall sur le Perishable Press et mettre le tout dans votre .htaccess.
Sur la plupart des blogs sous Wordpress, il est facile d'accéder au contenu en tapant par exemple dans la barre de lien :
http://myblog.com/wp-content/uploads/2011/08/
Ici vous verrez toutes les ressources uploadées pour les articles du mois d'Août. Si vous ne souhaitez pas que les utilisateurs puissent voir le contenu, il faut suffit de rajouter cette ligne dans votre précieux .htaccess
Options -Indexes
Ainsi si un utilisateur se rend dans un répertoire, il aura le droit à une erreur 403 Forbidden. En gros, accès refusé. Cependant si vous souhaitez qu'il n'ait pas accès à seulement certains types de fichiers, vous pouvez ajouter la directive IndexIgnore. Par exemple
IndexIgnore * IndexIgnore *.php IndexIgnore *.jpg *.gif *.png
La première ligne affichera le répertoire mais sans aucun fichier.
La seconde affichera les fichiers du répertoire excepté ceux avec l'extension .php.
Et la troisième affichera tout sauf les images .jpg .gif et .png.
Certains hébergeurs mettent en place la directive Options -Indexes directement dans dans la configuration du serveur. Dans ce cas, vous n'aurez pas besoin d'ajouter cette ligne dans votre .htaccess.
Quand un utilisateur enregistré sur votre blog Wordpress entreprend une action, il faut mettre 2 choses importantes en considération. La première est évidente, il faut que l'utilisateur ait les droits d'accès pour exécuter l'action. Et la deuxième moins évidente : est-ce que l'utilisateur veut vraiment exécuter cette action?
Wordpress a bien sûr des fonctions vous permettant d'être sûr que ces deux conditions soient remplies avant d'entreprendre quoi que ce soit.
Par exemple vous voudrez que seulement les administrateurs puissent supprimer des articles du site. Pour cela vous vérifierez que l'utilisateur qui essaye de supprimer un article est bien administrateur. C'est la partie "Autorisation".
Pour la partie "Intention", un exemple sera plus simple. Imaginons que le lien suivant supprime un article :
http://mysite.com/admin/scripts/delete_post.php?post_id=12
Le script en lui-même vérifiera que l'utilisateur qui émet l'action soit bien administrateur. Donc la partie Autorisation est remplie. Mais un hacker pourrait placer ce lien dans un commentaire par exemple :
Comme tout le monde aime les jolies filles , 99% des visiteurs cliqueront sur ce lien. Mais vu que les visiteurs ne sont pas administrateurs rien ne se passera. En revanche pour vous qui êtes administrateur, si vous cliquez, cela exécutera l'action.
Wordpress a un système de permissions plutôt bien bâtit se référant aux Roles and Capabilities. Les capabilities sont les bases du système de droits. Et les rôles sont juste un moyen de donner des droits spécifiques à un ensemble, autrement dit des groupes.
Si un utilisateur a les droits delete_posts, il a ainsi l'autorisation de supprimer des articles. Ce ne sont pas les seuls droits (voir le lien Roles and Capabilities) et vous pouvez même créer vos propres droits.
Les rôles sont un ensemble de droits. Un utilisateur avec le rôle "contributeur" a trois droits : read, delete_posts et edit_posts. Ceci permet au "contributeur" de de lire, modifier ou supprimer ses propres articles.
Attaquons-nous maintenant aux fonctions sous Wordpress afin d'être sûr qu'un utilisateur a l'autorisation de compléter une action qu'il a initié.
if(current_user_can("delete_users")) { wp_delete_user(5); } else { die("Pas bien!"); }
Ici on vérifie que l'utilisateur a bien les droits pour supprimer un autre utilisateur.
La fonction current_user_can() prend un seul argument qui peut être un rôle ou une permission.
Alors les intentions sont un peu plus compliquées à détecter. Avant il suffisait de regarder l'http referer via $_SERVER['HTTP_REFERER'] mais cela n'est plus le cas aujourd'hui.
Une nouvelle méthode plus sécurisée a vu le jour à partir de Wordpress 2.03 appelée "nonces". Nonce veut dire "Number once". traduisez par "numéro à usage unique". Il est souvent utilisé en cryptographie pour sécuriser les communications. C'est un nombre qui généré avant qu'une action soit initialisée. Vous avez compris? En gros l'action sera exécutée si le nombre renvoyé correspond au nombre généré.
Les nonces sont utilisés à deux endroits dans Wordpress, les formulaires et les liens.
Pour un formulaire :
La fonction wp_nonce_field(); génèrera un champs input de type hidden contenant le nonce qui sera renvoyé au submit du formulaire. Le paramètre passé est optionnel mais recommandé pour donner un identifiant unique au nonce.
Le nonce pourrait ressembler à ceci après génération :
Ensuite à l'envoi du formulaire on vérifiera le nonce :
if (!wp_verify_nonce($_POST['_wpnonce'],'un_beau_nonce') ) { die('Han le nonce ne correspond pas ou n'est pas setté!'); } else { insert_label($_POST["word"]); }
Grâce à la fonction wp_verify_nonce() on peut être sûr que le formulaire sera vérifié et donc que l'intention de l'utilisateur est bonne.
Alors parfois on voudra exécuter une action à partir d'un lien. Comment y insérer un nonce?
Encore une fois Wordpress a la méthode qu'il faut et qui va permettre de "noncer" l'URL.
$base_url = "http://mysite.com/admin/scripts/delete_lama.php?lama_id=42"; $nonce_url = wp_nonce_url( $base_url, "lamadelete_nonce"); echo "Supprime ce lama";
Le résultat pourrait donner :
http://mysite.com/admin/scripts/delete_lama.php?lama_id=42&_wpnonce=sdf878ed45
Voilà pour ce qui est des autorisations et des intentions. Vous pouvez bien sûr combiner les deux lors de vos opérations.
J'aurai pu vous parler aussi de la Sécurisation des données mais ce sera peut être dans un autre chapitre de ce programme de sécurisation de Wordpress
MISES A JOUR DE L'ARTICLE |
Merci pour toute ces astuces !
Merci pour les tuyaux cela va bien me servir. Par contre j'ai remarqué que mon plugin WP scan security ne cache pas ma version de WP... il y a quelque chose a activer pour cela ?
++
Je ne connaissais pas les nonces !
Pour le reste depuis que je me suis fait hacker je suis devenu prudent donc tout était déjà OK
Bon ben moi, j'ai appris pas mal de choses et j'ai dégrossi un peu les vieux restes poussiéreux de la sécurité sous WordPress ! Merci CrazyMax !
Oulah, je m'aperçois qu'il manque pas mal de choses sur mon blog. Merci pour ces astuces très utiles
Merci pour ces astuces : je partage tout de go sur Twitter
Bonjour a tous !
Tout d'abord merci pour toutes ces astuces !
Petite question : Dans Phpmyadmin, comment on renomme les tables ?
C'est con je sais mais je trouve pas =(
Merci pour ces astuces que je ne connaissais pas mais connaissez vous un moyen de limiter l'accès à l'inscription? C'est à dire qu'à chaque fois que quelqu'un s'inscrit, il doit attendre la validation par un modérateur ?
Merci pour ces astuces !! moi aussi j'ai un problème d'inscription, j'ai mis en place un capcha mais j'ai toujours de nombreux inscrit sur mon site !!
j'ai une autre question mon site est en ligne est ce que je peux toujours changer le préfixe de table (wp) sans risque ? merci d'avance
Changer l'adresse de connexion à l'administration serait peut-être également utile.