Bonnes pratiques de sécurité pour les installations Wordpress

Si vous souhaitez monter votre propre site web mais que vous n’êtes pas expert dans le domaine, vous avez sûrement dû voir passer le mot “Wordpress”. Il s’agit d’un CMS (Content Management System, ou Système de Gestion de Contenu) permettant de faciliter la création d’un site web. En gros, il facilite la création puis la gestion en fournissant une interface prête à l’emploi. Il n’y a plus qu’à personnaliser votre site et écrire vos articles ! Pas besoin d’écrire du code (même s’il est possible d’aller fouiller et modifier manuellement) !

Cependant, certaines fonctionnalités pouvant être dangereuses pour la sécurité de votre site web sont par défaut laissées activées… Il existe des moyens simples d’y remédier et ainsi améliorer la sécurité d’un site sous WordPress. Ce qui va suivre n’est pas purement technique, mais il peut être nécessaire d’effectuer certaines recherches complémentaires afin de comprendre la totalité des choses. Le but de cet article est de regrouper les différentes choses à modifier, les différentes techniques que j’ai pu trouver sur Internet afin d’apprendre en quoi cela est dangereux, mais surtout comment s’en protéger par de simples modifications !

Contexte et Etat de l’art

Tout d’abord, remettons un cadre à cet article, par quelques chiffres. WordPress, c’est :

  • Environ 25% des sites web et blog que vous visitez quotidiennement
  • Plus de 70.000.000 de blogs
  • 44.000 plugins
  • Disponible en 56 langues
  • 82.000.000 de nouveaux articles chaque mois !

Autant dire qu’il s’agit à l’heure actuelle d’une part importante du web connu. Indéniablement, c’est également le type de site qui est le plus visé par les personnes malveillantes, souhaitant voler des informations, s’introduire, casser… Et malheureusement, afin d’être le plus polyvalent possible, une installation de WordPress laisse des fonctionnalités activées…

Limiter les fuites d’information

Une des choses les plus importantes en tant qu’attaquant est de récupérer le plus d’informations possible sur sa cible. Différents moyens simples existent afin de récupérer toute sorte d’information et il s’avère que WordPress laisse passer certaines choses à ce niveau. Il est donc important de connaître ces méthodes ainsi que les moyens de corriger ces problèmes.

Version de Wordpress

Lors de la recherche d’informations à des fins malveillantes sur un site web, l’une des premières informations cherchée est la version du site. En effet, il n’est pas rare de trouver des vulnérabilités dans les versions anciennes, ce qui explique les mises à jour régulières. Ainsi, le fait de trouver la version du site WordPress va permettre d’aiguiller un attaquant sur ce dont il dispose pour attaquer le site. Par défaut, il est possible de trouver la version d’un site web WordPress. L’une des façons les plus simples d’obtenir la version d’un site sous WordPress est d’utiliser les flux RSS, accessibles directement à l’URL https://monsite.com/feed. Un petit tour dans le code source de la page nous révèle l’information convoitée.

wpharden_version_1

Retirer cette information est quelque chose d’important. Une solution efficace pour cela est de modifier un des fichiers PHP de WordPress afin d’y ajouter un petit morceau de code. Il s’agit du fichier functions.php disponible dans le répertoire https://monsite.com/wp-includes/. On va y ajouter le code suivant.

// Remove WP version from feed
function remove_wp_version() {
return '';
}
add_filter('the_generator', 'remove_wp_version');

Ainsi, plus de problème de version qui fuite ! Cependant, j’aimerai ajouter un point, lié à ceci. Il est important, voire impératif, de se pencher sur les mises à jours régulières et de les faire si le contexte vous le permet. Ces mises à jours permettent d’ajouter du contenu, mais aussi et surtout de corriger des vulnérabilités et donc de renforcer la protection des sites sous WordPress.

Fichier robots.txt

Le fichier robots.txt est un fichier public utilisé par les différents robots qui parcourent internet afin de référencer votre site. Étant un fichier public, il est important de ne pas y mettre trop d’informations, et surtout pas d’informations inutiles, car celles-ci peuvent être vues par n’importe quel utilisateur en se rendant sur la page http://monsite.com/robots.xt. Ce fichier permet de spécifier aux robots ce qu’ils doivent indexer et référencer et ce qu’ils ne doivent pas.

À titre d’exemple, voici le contenu du fichier robots.txt pour le site https://haax.fr.

wpharden_robots_1

Les clauses “Disallow” spécifient aux robots de ne pas indexer ce qui se trouve derrière. Ainsi, je demande aux robots de ne pas indexer mon interface d’administration (wp-admin), les différents fichiers PHP de configuration du site, etc..

Cependant, je lui demande d’indexer le contenu de /wp-content/uploads car il s’agit du répertoire contenant les images des différents articles. Ainsi, les images seront référencées sur les différents moteurs de recherche et ce blog pourra être trouvé par les internautes.

L’intérêt de spécifier explicitement aux robots de ne pas indexer certaines parties de votre site est d’empêcher que n’importe qui puisse tomber sur des pages non-souhaitées (par exemple, la page de connexion à la zone d’administration) simplement avec les moteurs de recherche…

Afin d’illustrer mon propos, voici un exemple de sites qui ont laissé Google indexer leur page de connexion à la zone d’administration. Cela ne semble pas être grand-chose, mais c’est simplement faciliter la tâche à des personnes mal intentionnées…

wpharden_hidelogin_2

Fichier .htaccess

Le fichier .htaccess est un fichier très important dans la gestion de la sécurité de votre site web. Il est situé à la racine de votre site et permet de mettre en place différentes règles de navigation qui seront appliquées à chaque utilisateur qui visitera votre site.

Il est par exemple possible de forcer une redirection vers une page, afin d’empêcher quelqu’un d’accéder à une zone du site, ou encore simplement refuser l’accès à certains fichiers sensibles.

Il est donc extrêmement important d’empêcher quiconque de pouvoir accéder à ce fichier. Vous pouvez pour cela écrire une règle dans ce même fichier qui permettra d’interdire à tout internaute d’accéder à votre fichier. La règle suivante permet de faire cela.

##Deny access to all .htaccess files
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>

Ainsi, si quelqu’un tent d’accéder au fichier, il aura le résultat suivant.

wpharden_htaccess_1

Enumération des utilisateurs

WordPress fonctionne avec un système d’auteurs. Il est en effet possible de voir tous les articles publiés par un auteur en allant sur la page /author/nomdelapersonne. Cependant, par défaut, nous ne connaissons pas le nom de l’utilisateur.

Il faut savoir que comme dans la plupart des bases de données, WordPress fonctionne avec un système de numéros uniques appelés “id“, identifiant chaque utilisateur. Ainsi, le premier utilisateur créé (et souvent l’administrateur..) possède l’id 1. Le second utilisateur possède l’id 2, etc.

Il est possible d’énumérer les utilisateurs en demandant par exemple https://monsite.com?author=1. Ainsi, l’utilisateur sera redirigé vers le /author/personne correspondant. Différents outils existent afin d’automatiser le processus d’énumération, mais ce n’est pas le sujet de cet article.

Il est donc important d’empêcher une attaquant potentiel de pouvoir énumérer les utilisateurs de son site, car si cela arrive, cela veut dire que l’attaquant dispose déjà d’une information de connexion. Il ne lui reste plus qu’à trouver le mot de passe…

Une solution facile à mettre en œuvre est de rediriger vers la page d’accueil chaque utilisateur qui tente d’énumérer. Les redirections peuvent être faites par des règles placées dans le fichier .htaccess de votre site internet. Les règles suivantes correspondent à ce besoin :

##Avoid users enumeration and redirect to index
RewriteCond %{REQUEST_URI}  !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule (.*)        $1? [L,R=301]

##Redirect /author/
RedirectMatch 301 ^/author/ https://haax.fr/?

Ainsi, si quelqu’un tente d’énumérer les utilisateurs du site, il sera automatiquement redirigé vers la page d’accueil et n’aura pas accès à l’information.

Fichiers d’installation inutiles

Une fois votre site WordPress installé, certains fichiers inutiles restent disponibles sur le site. Il est important d’identifier les fichiers à supprimer, car pouvant révéler des informations à un attaquant. Le fichier readme.html fait partie de ces fichiers. Il s’agit d’un fichier présent à la racine de votre site internet expliquant la procédure d’installation d’un site WordPress, ainsi que d’autres choses peu utiles. Rien d’alarmant à priori. Cependant, ce fichier peut également révéler la version de WordPress que vous utilisez. Ainsi, si votre site n’est pas à jour, il est possible qu’il présente des vulnérabilités connues. Si un attaquant prend connaissance de ces informations, il peut très bien utiliser une de ces vulnérabilités contre votre site.

Voici un exemple de site internet n’ayant pas supprimé le fichier readme.html.

wpharden_readme_1

On voit qu’il s’agit d’un site WordPress en version 3.0… Une version très ancienne, et donc probablement bourée de vulnérabilités. Il est donc important de supprimer ce fichier et bien entendu, de mettre à jour votre site s’il ne l’est pas. Une fois fait, si quelqu’un tente d’accéder au fichier https://monsite.com/readme.html, il obtiendra le résultat suivant.

wpharden_readme_2

Directory Listing - Accès au réperoire wp-includes

Toujours dans un souci de limiter au maximum la fuite d’informations vers l’extérieur, il est important de contrôler ce qui est accessible. Nous avons vu grâce au fichier “robots.txt” qu’il est possible d’interdire aux robots de référencer certaines parties de d’un site internet. Cependant, ces zones restent totalement accessibles pour quiconque va les chercher à la main… Par exemple, le répertoire /wp-includes/ contient tout un tas de fichiers de configuration.

Ainsi, si on tente d’y accéder manuellement et que l’accès n’est pas restreint, on obtient la liste complète des fichiers présents.

wpharden_includes_2

Là encore, il est possible de restreindre cet accès à l’aide d’une règle placée dans le fichier .htaccess. On va simplement interdire à tout utilisateur d’accéder au répertoire /wp-includes/ ainsi qu’aux fichiers présents ici.

##Block wp-includes folder and files
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]

Ainsi, une tentative d’accès à ce répertoire se solde maintenant par un échec.

wpharden_includes_3

WP-config.php

Le fichier wp-config.php est l’un des fichiers de configuration les plus importants pour votre site internet. Il contient notamment les informations de connexion à votre base de données. Il est donc impératif de bloquer l’accès à ce fichier pour tout utilisateur venant de l’extérieur. Quelques recherches sur internet et on trouve ce genre de fichier en libre accès sur certains sites internet…

wpharden_config_1

Une fois n’est pas coutume, l’interdiction d’accès à ce fichier peut se faire par l’intermédiaire d’une règle HTACCESS. On va simplement spécifier que l’accès au fichier est interdit, pour tout le monde.

<files wp-config.php>
order allow,deny
deny from all
</files>

Résultat… Plus rien !

wpharden_config_2

Limiter les risques d’intrusion

Cacher la page d’authentification à la zone d’administration

Par défaut, la page de connexion à la zone d’administration de wordpress peut s’obtenir via l’URL suivante https://monsite.com/wp-admin

Concrètement, cela veut dire que n’importe qui peut tenter de se connecter à votre site web avec différents identifiants et mots de passe. Une interface d’administration exposée, c’est prendre des risques inutiles. Voilà pourquoi il est important de changer le chemin d’accès par défaut à cette interface.

Plusieurs solutions existent pour cela, mais la solution la plus simple à mettre en place est l’utilisation d’un plugin. Des plugins tels que WPS Hide Login permettent de modifier l’URL d’accès à la zone d’administration très simplement.

wpharden_hidelogin_2

Fichier XMLRPC.php

Les attaques de type bruteforce sont très répandues sur Internet. Le principe est on ne peut plus simple : on tente de se connecter à un service en essayant des dizaines des millions de combinaisons identifiant/mot de passe possible et en espérant tomber sur une bonne combinaison. L’attaque dite par XMLRPC est une attaque connue permettant à un attaquant de tester plusieurs centaines de combinaison identifiant/mot de passe sur un site WordPress en une seule requête. En envoyant un nombre important de requêtes, l’attaquant a la possibilité de tester un très grand nombre de combinaisons.

Par défaut, tout site wordpress récent est vulnérable à cette attaque, car le fichier xmlrpc.php est accessible à n’importe quel utilisateur. Afin de tester si votre site est vulnérable, rien de plus simple ! Il suffit de tenter d’accéder au fichier dans votre navigateur.

wpharden_xmlrpc_2

Si le résultat est une page blanche avec le texte “XML-RPC server accepts POST requests only.” alors vous êtes vulnérable. Il faut savoir que XMLRPC n’est pas là pour rien, il est possible que votre site utilise cette fonctionnalité. Il est conseillé d’aller se renseigner sur l’utilité de cette fonctionnalité avant de vouloir tout désactiver.

Néanmoins, si vous ne l’utilisez pas, il est important d’empêcher l’accès à ce fichier. Plusieurs solutions existent pour cela. Une solution simple est d’ajouter une règle dans le fichier .htaccess de votre site afin d’interdire aux visiteurs l’accès au fichier.

La règle suivante peut être ajoutée :

##Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>

Une fois modifié, une requête sur le fichier xmlrpc.php devrait renvoyer ceci :

wpharden_xmlrpc_2

Si c’est le cas, le fichier n’est plus accessible, et donc un attaquant ne pourra plus exploiter cette vulnérabilité !

Limiter le nombre de tentatives de connexion

Par défaut, WordPress autorise un utilisateur à tenter de se connecter avec un nombre infini d’identifiants et mots de passe. On retrouve le même problème qu’au paragraphe précédent, le site est vulnérable aux attaques de type bruteforce. Même si le site n’est plus vulnérable via XMLRPC, l’interface de connexion reste accessible et une personne mal intentionnée pourrait essayer d’attaquer votre site web par cette voie.

Il est donc important de limiter le nombre de tentatives de connexion par utilisateur. Ici encore, une bonne solution peut être d’utiliser un plugin. Il en existe plusieurs permettant d’effectuer cette tâche. Il est ensuite possible de personnaliser le nombre de tentatives maximales souhaitées.

wpharden_limitlogin_1

Différencier les noms des utilisateurs des noms publics

Par défaut, lorsque vous publiez un article avec WordPress, le nom de l’auteur s’affiche sur ce dernier. Et par défaut, l’auteur avec lequel vous publiez est également le nom d’utilisateur du compte WordPress. Par conséquent, publier un article révèle votre nom d’utilisateur, ce qui donne donc une information à un potentiel attaquant. Heureusement, il est possible d’utiliser pour chaque compte un pseudonyme, permettant de modifier le nom affiché publiquement sur vos articles.

wpharden_username_1

Il s’agit donc d’une mesure simple permettant de limiter les informations sensiles retournées aux internautes.

Le mot de la fin

WordPress est un CMS très intéressant, facile à prendre en main et offrant une multitude de fonctionnalités et de possibilités. Indéniablement, d’un autre côté, le système nécessite d’être le plus polyvalent possible afin de convenir à toutes les utilisations. Cela implique des paramètres par défaut, des valeurs, des fichiers… Choses qui peuvent mettre en danger votre site internet.

Pris individuellement, la plupart des points de cet article ne sont pas extrêmement graves ni compromettants, mais mis bout à bout, ils peuvent fragiliser de manière importante la sécurité de votre site. Il est donc important de connaître ce genre de chose mais également de rester actif et à l’écoute de ce qui nous entoure, comme la découverte de vulnérabilités.

Les dangers de la réutilisation de mots de passe Box "connectées" et vie privée - Le sommet de l'Iceberg