Documentation

WordPress

WordPress est le CMS open source le plus utilisé aujourd'hui de par sa simplicité de déploiement et la possibilité d'y greffer de nouvelles fonctionnalités développées par la communauté appelées plugins.

Installation

WordPress est disponible parmi nos applications auto installables (Sites > Installer une application).

Si vous souhaitez néanmoins l'installer par vous même vous devrez suivre les étapes suivantes :

  • téléchargez la version souhaitée sur le site officiel
  • décompressez les sources et déposez les sur votre compte alwaysdata par FTP
  • créez votre base de données MySQL
  • créez votre site
  • accédez à la page Web de votre application pour finaliser son installation.

Si vous migrez votre application WordPress, précédemment hébergée chez un autre prestataire, modifiez les paramètres siteurl, home présents dans la table _options ainsi que le fichier wp-config.php (situé à la racine de votre application).

Recommandations

Sa notoriété en fait une cible prioritaire pour les pirates informatiques, il est donc important de suivre ces quelques recommandations d'usage :

  • mettez à jour régulièrement WordPress et ses plugins
  • informez-vous sur les rapports de bugs et failles de sécurité des plugins avant de les installer
  • choisissez un autre préfixe que wp_ pour le nom de vos tables. Pour changer cette valeur sur un WordPress déjà déployé, modifiez la table _options et le fichier wp_config.php.
  • supprimez les thèmes inactifs, souvent visés par les pirates
  • assurez-vous que la directive
Options All -Indexes

est présente dans le fichier .htaccess

  • supprimez le fichier readme.txt à la racine de votre application (contient la version actuelle de votre WordPress, utile pour connaitre les failles de sécurité exploitables)

  • éditez le fichier fonctions.php de votre thème et ajoutez :

remove_action("wp_head", "wp_generator");

Cela masquera le numéro de version dans le meta name generator.
Ajoutez :

add_filter('login_errors',create_function('$a', "return null;"));

Pour masquer les erreurs de connexion.

  • supprimez le compte "admin" créé par défaut

  • protégez-vous du hotlinking en ajoutant au fichier .htaccess :

# Activation du mode Rewrite
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$

# Les requêtes en provenance de votre domaine sont autorisées
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?votredomaine.com [NC]

# Autorisation d'utilisation du contenu par les moteurs de recherche
RewriteCond %{HTTP_REFERER}  !search\?q=cache               [NC]
RewriteCond %{HTTP_REFERER}  !google\.                      [NC]

# Renvoi d'une image alternative en cas d'emploi abusif des votre
RewriteRule \.(gif|jpg|png)$ http://domain.tld/hotlink.jpg  [R,NC,L]
  • autres règles de filtrage contre le XSS, les redirections HTTP et modifications de variables PHP :
RewriteEngine On
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} ^(.*)base64_encode(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteRule (.*) - [F]

Que faire en cas d'infection ?

La très grande majorité des attaques est effectuée par des scripts automatiques. Il n'est donc pas recommandé de réinstaller votre site et ses extensions dans le même état sous peine de subir une nouvelle infection dans les heures qui suivent.

Détection des fichiers infectés

Les commandes ci-après sont exécutées via SSH dans le répertoire de votre installation WordPress.

Dans un premier temps, vérifiez que des redirections ou autres directives n'aient pas été rajoutées à votre insu en contrôlant le contenu de vos fichiers .htaccess.
Il ne devrait y en avoir à priori qu'un, situé à la racine de votre compte :

find . -type f -name .htaccess

Ensuite, parcourez vos fichiers à la recherche de malwares :

find . -type f -name "*.php" | xargs grep base64_decode

L'infection se présente comme une suite alphanumérique exécutée avec la fonction PHP eval :

<?php
    eval(gzinflate(base64_decode("FZy3sqMKFkX/ZaL3igDvaiI8QngPyRTee8/Xj24n3UFfCcE5e6+li1ScSf9P9TZj2Sd78U+abAWB/S8vsikv/vmPGL9ie7zfvQtBPE2Nzt4HaPd3Q0M1RB6eMYgHwFxCOF+T7/ppow3C7Tl5m9bcQWIs4uYlcw4Envy7f1QeBO4UpzkUACLAO8UvWkhraTtMMWF5rcCGA10u37A0klvx9GzqtUvc2arSuDhOsuvsRdbfTEW1C2IEAhBYr5uEHE/e4voIvKAhvBQJVQg0FD6i6KITcQ97cKjF7dSikH5jVZkgtqk/WoMZgF7NJmjon4izeYBw1d9Ll3Avr5O3g3LzoM192DV8f0tn/FJGIyGRo92...")));
?>

Cette suite, encodée en base64, est tout simplement un script PHP qui sera exécuté à l'appel de la page.
Vous pouvez donc décoder cette suite pour comprendre ce que le hackeur tente de faire :

<?php
    echo gzinflate(base64_decode("FZy3sqMKFkX/ZaL3igDvaiI8QngPyRTee8/Xj24n3UFfCcE5e6..."));
?>

Ou alors :

find . -name "*.php" -print0 | xargs -0 egrep eval

<?php
     $sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6]...
?>

<?php
     $qV="stop_";$s20=strtoupper($qV[4].$qV[3]...
?>

Supprimez les.

Inspectez vos sources à la recherche de dossiers cachés contenant une copie des malwares précédemment supprimés :

find . -type d -name ".*"

Enfin, vérifiez l'intégrité de votre base de données en parcourant les derniers enregistrements de la table _options.

Autre commande utile permettant de lister les fichiers modifiés ces dernières 24 heures (1 étant le nombre de jour) :

find . -type f -mtime -1 -print

Recherche de la faille

Cette étape est la plus importante, mais aussi la plus complexe.
En fonction de la date de création des fichiers, de leur nom et de leur appel, il est possible de retrouver l'URL permissive appelée.
Pour se faire, épluchez les requêtes POST de vos logs Apache situés dans le répertoire ~admin/log/ :

grep POST admin/log/access.log

Exemple d'appels suspects :

domain.tld 37.139.47.91 - - [23/Nov/2013:09:13:37 +0100] "POST /wp-content/themes/twentythirteen/404.php?pwd HTTP/1.0" 200 4598 "-" "Mozilla/5.0 
domain.tld 81.27.32.147 - - [23/Nov/2013:03:19:16 +0100] "POST //wp-content/themes/lightspeed/framework/_scripts/valums_uploader/php.php HTTP/1.1" 200 100 "-" "-"
domain.tld 31.184.244.18 - - [31/May/2013:02:12:37 +0200] "POST /templates/beez/7c31.php HTTP/1.1" 200 - "-" "-"

Le nom des fichiers, des appels en POST sur des URLs ne contenant pas de traitements, sont des indices vous permettant de remonter jusqu'à la première requête HTTP, origine de l'infection.

Recharger une sauvegarde de votre application

Si les méthodes citées ci-dessus sont insuffisantes, vous pourrez alors songer à réinstaller votre WordPress à l'aide des sauvegardes quotidiennes que nous effectuons de vos données.
Celles-ci sont stockées dans le répertoire ~admin/backup.

Liens utiles

  • Sucuri : Scanne et identifie les failles potentielles de votre site.
  • Better WP Security : Améliore la sécurité de votre site WordPress.
  • WP Security Scan : Vérifie la présence de failles de sécurité dans votre site et propose des actions correctives.
  • Theme Authenticity Checker : Recherche la présence de codes indésirables dans les fichiers de votre thème.
  • Google Webmaster Tools : fournit des rapports détaillés sur la visibilité de votre site.

Dernière mise à jour : 14 jan. 2016 à 08:57