Faille XSS plugin W3 Total Cache 0.9.4.1

W3 Total Cache, le fameux plugin de cache ultra puissant, est très utilisé par la communauté WordPress, car il offre de nombreuses options, il est complet et est mis à jour régulièrement.

Cependant la dernière version notée 0.9.4.1 présente une faille de sécurité considérée dangereuse, et aucune mise à jour n'est actuellement proposée dans le repository de WordPress.

Attention, une mise à jour est maintenant disponible, elle corrige cette faille de sécurité, pensez donc à mettre à jour vos plugins :)

Pour rappel, W3TC offre de nombreuses options d'optimisations pour votre WordPress, telles que :

  • Mettre en cache la page en HTML
  • Mettre en cache la base de données
  • Minifier les fichiers JS et CSS
  • Activer un CDN
  • etc..

Chacune de ces options propose en plus un certain nombre de personnalisations, ce qui rend ce plugin très complet !

Malheureusement, il y a quelques jours, une faille de sécurité de type XSS a été découverte dans ce plugin.

 

Qu'est ce qu'une faille de type XSS ?

"XSS" correspond à "Cross-Site Scripting", c'est une faille de sécurité permettant d’injecter du contenu dans une page, afin de provoquer des actions sur les navigateurs web visitant la page, c'est une faille classée comme faille à haut risque, il faut donc absolument agir et ne pas l'ignorer !

 

Que dois-je faire ?

Vous avez plusieurs options disponibles pour contrer cette faille, vous pouvez :

  • désactiver ce plugin afin de ne plus laisser la faille ouverte et attendre qu'une nouvelle version soit proposée.
  • ne garder que notre système de cache Varnish déjà en place automatiquement sur tous les WordPress.
  • corriger le plugin avec le patch fourni (voir en fin d'article).

Si vous souhaitez utiliser un plugin de cache, nous vous recommandons d'utiliser "WP-Rocket", en suivant notre article vous expliquant comment bien le paramétrer sur nos serveurs : Optimisez votre WordPress avec notre cache Varnish

Si vous souhaitez garder uniquement le système Varnish, provisoirement ou définitivement, assurez-vous qu'il est bien actif sur votre WordPress  en testant votre URL avec l'outil suivant : Is Varnish Working

En effet, certains thèmes ou plugins peuvent bloquer le système de cache, ainsi la solution est d'utiliser un plugin de cache comme vu précédemment, afin de forcer l'utilisation du cache serveur (Varnish).

 

Qu'est ce que je risque à continuer de l'utiliser ?

Même s'il s'agit d'une faille de haute importance, cette faille en particulier n'est pas forcément si grave car il y a peu de chance pour que vous en soyez la victime, étant donné les "pré-requis" nécessaires pour l'exploiter :

  • Cacher le lien dans un service tel que bit.ly, demander à l'admin de cliquer dessus.
  • Ajouter une "iframe" avec le lien créé en "HREF", demander à l'admin de visiter la page.

Les probabilité pour que votre site soit victime de cette faille sont donc faibles. Il faudrait vraiment que votre site soit spécifiquement ciblé et que l'attaquant connaisse exactement l'admin du site, sans compter que la plupart des navigateurs modernes vous protègent déjà des failles XSS.

 

Quand la mise à jour sera-t-elle disponible ?

Malheureusement l'auteur du plugin semble injoignable depuis plusieurs mois, et seul l'auteur peut proposer la mise à jour, même si une correction lui a déjà été proposée.

Une mise à jour peut donc arriver aujourd'hui comme dans plusieurs semaines.

 

Puis-je corriger la faille moi-même ?

OUI, une correction a été proposée, il suffit de vous connecter en FTP à votre WordPress (voir article Gestion FTP), et vous rendre dans le dossier suivant : /wp-content/plugins/w3-total-cache/inc/options/support/

Puis ouvrez le fichier form.php et rendez-vous à la ligne 21, pour remplacer le code suivant :

 <input type="hidden" name="request_type" value="<?php echo $request_type; ?>" />
 <input type="hidden" name="request_id" value="<?php echo $request_id; ?>" />
 <input type="hidden" name="payment" value="<?php echo $payment; ?>" />

Par celui-ci :

<input type="hidden" name="request_type" value="<?php echo htmlspecialchars($request_type, ENT_QUOTES, 'UTF-8'); ?>" />
<input type="hidden" name="request_id" value="<?php echo htmlspecialchars($request_id, ENT_QUOTES, 'UTF-8'); ?>" />
<input type="hidden" name="payment" value="<?php echo htmlspecialchars($payment, ENT_QUOTES, 'UTF-8'); ?>" />

 

Sauvegardez les changements et le tour est joué :)