BlogBang

Se protéger du hack wordpress 2.8.3 qui réinitialise le mot de passe

wpmigreow0 Modérez les commentaires Wordpress sans utiliser linterface dadmin

Si vous avez un site ou un blog sous Wordpress, il y a un hack qui tourne depuis quelques jours (et dont j’ai appris l’existence ce matin), qui permet de forcer la réinitialisation du mot de passe admin. En gros, c’est tout con (et vous pouvez essayer sur votre wordpress), lorsque vous entrez l’url suivante :

http://VOTRE-DOMAINE.COM/wp-login.php?action=rp&key[]=

Vous obtenez un très sympathique message  vous disant que le mot de passe a été réinitialisé. Le hack n’est pas dangereux sauf que l’admin devra ouvrir sa boite mail pour retrouver le nouveau mot de passe… Imaginez donc une moulinette qui effectue cette opération toutes les 2 secondes et le webmaster ou le bloggeur devient FOU !

Voici donc comme désactiver cette fonction temporairement, en attendant la mise à jour de Wordpress.

Ouvrez le fichier wp-login.php et recherchez la fonction suivante :

function reset_password($key) {
global $wpdb;
$key = preg_replace('/[^a-z0-9]/i', '', $key);
if ( empty( $key ) )
return new WP_Error('invalid_key', __('Invalid key'));
$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users
WHERE user_activation_key = %s", $key));
if ( empty( $user ) )
return new WP_Error('invalid_key', __('Invalid key'));
// Generate something random for a password...
$new_pass = wp_generate_password();
do_action('password_reset', $user, $new_pass);
wp_set_password($new_pass, $user->ID);
update_usermeta($user->ID, 'default_password_nag', true);
$message  = sprintf(__('Username: %s'), $user->user_login) . "\r\n";
$message .= sprintf(__('Password: %s'), $new_pass) . "\r\n";
$message .= site_url('wp-login.php', 'login') . "\r\n";
$title = sprintf(__('[%s] Your new password'), get_option('blogname'));
$title = apply_filters('password_reset_title', $title);
$message = apply_filters('password_reset_message', $message, $new_pass);
if ( $message && !wp_mail($user->user_email, $title, $message) )
die('<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason:
your host may have disabled the mail() function...') . '</p>');
wp_password_change_notification($user);
return true;
}

Mettez tout son contenu en commentaire afin d’empêcher la réinitialisation du mot de passe mais laissez le « return true » à la fin

Ça donnera ça :

function reset_password($key) {
/*
global $wpdb;
$key = preg_replace('/[^a-z0-9]/i', '', $key);
if ( empty( $key ) )
return new WP_Error('invalid_key', __('Invalid key'));
$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users
WHERE user_activation_key = %s", $key));
if ( empty( $user ) )
return new WP_Error('invalid_key', __('Invalid key'));
// Generate something random for a password...
$new_pass = wp_generate_password();
do_action('password_reset', $user, $new_pass);
wp_set_password($new_pass, $user->ID);
update_usermeta($user->ID, 'default_password_nag', true);
$message  = sprintf(__('Username: %s'), $user->user_login) . "\r\n";
$message .= sprintf(__('Password: %s'), $new_pass) . "\r\n";
$message .= site_url('wp-login.php', 'login') . "\r\n";
$title = sprintf(__('[%s] Your new password'), get_option('blogname'));
$title = apply_filters('password_reset_title', $title);
$message = apply_filters('password_reset_message', $message, $new_pass);
if ( $message && !wp_mail($user->user_email, $title, $message) )
die('<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason:
your host may have disabled the mail() function...') . '</p>');
wp_password_change_notification($user);
*/
return true;
}

La fonction ne fera alors que renvoyer VRAI …

Cherchez ensuite le petit passage suivant :

case 'rp' :
$errors = reset_password($_GET['key']);
if ( ! is_wp_error($errors) ) {
wp_redirect('wp-login.php?checkemail=checkemail');
exit();
}

et commentez la redirection en mettant ensuite un echo si vous voulez laisser un petit message au script kiddy :

case 'rp' :
$errors = reset_password($_GET['key']);
if ( ! is_wp_error($errors) ) {
/*wp_redirect('wp-login.php?checkemail=checkemail');*/
echo('Mouahahaha ! Tu crois quand meme pas que tu vas
hacker mon site, petit script kiddy ? Arf !');
exit();
}

Et voilà ! Vous êtes protégé !

Ensuite, lorsque la mise à jour de Wordpress arrivera (ce qui ne devrait pas tarder), vous n’aurez qu’à faire la mise à jour et le fichier wp-login.php sera écrasé avec la nouvelle version, donc vous reviendrez à la normale.

Sinon, une autre technique consiste à simplement placer un htaccess et un htpasswd sur votre serveur pour ajouter un niveau de protection. Puis allez lire ces quelques (vieux mais toujours valables) conseils sur la façon de sécuriser son blog.

Et Stagueve me dit aussi dans les commentaires, qu’on peut tout simplement virer le compte admin et se créer un compte « toto » (ou autre) qui aurait les droits admin. Effectivement, pourquoi faire simple quand on peut faire compliqué :-) )) Ma devise ? Roooohh

Bonne chance !

[Source du hack]

Publicité

Je vous recommande aussi la lecture des sujets suivants


Faites un lien vers cette news sur votre site



56 commentaires

  1. Stagueve Reply to this comment


    C’est pas plus simple de retirer les droits du compte Admin et d’utiliser un autre compte (1ère chose à faire suite à la création d’un site sous WP…)

    Posté le 11 août 2009 à 08:38:59

  2. Gogopex Reply to this comment


    Wow, ça c’est de la réactivité !

    Posté le 11 août 2009 à 08:39:59

  3. Ganlhi Reply to this comment


    En effet, je pense que Stagueve a raison, c’est sans doute la solution la plus sage ^^

    Cela dit, merci pour l’astuce, Korben !

    Posté le 11 août 2009 à 08:41:37

  4. Félix Aimé Reply to this comment


    Troll :

    Dotclear 1 – Wordpress 0

    Euh la date de la release du PoC date d’hier donc je pense pas que cette vulnérabilité est publique depuis quelques jours.

    Posté le 11 août 2009 à 08:45:07

  5. Tatsu-Kan Reply to this comment


    « Mouahahaha ! Tu crois quand meme pas que tu vas hacker mon site, petit script kiddy ? Arf ! »
    :)

    Posté le 11 août 2009 à 08:45:28

  6. semageek Reply to this comment


    Merci pour l’info, c’est clair que la solution de stagueve est très bonne,
    Normalement d’ailleurs on vire toujours le compte admin….
    C’est souvent une des première entrée d’un hack ou autre….

    Posté le 11 août 2009 à 08:50:31

  7. Joe Reply to this comment


    Comme l’a dit Gogopex, quelle réactivité !
    Merci Korbinou et stagueve :)

    Posté le 11 août 2009 à 08:51:12

  8. homerunisgood Reply to this comment


    Merci Korben, comme toujours on peut compter sur toi ! (sous-entendu nous, les mecs qui ont un blog mais qui n’ont pas le temps de trop s’en occuper)

    Posté le 11 août 2009 à 08:55:22

  9. S. Reply to this comment


    yen a un qui marche mieux :)

    rm -rf ~/www/wp*
    %wget http://download.dotclear.net/latest-2.0.zip
    %unzip latest-2.0.zip
    %vi /etc/apache/httpd.conf
    %/etc/init.d/httpd restart

    enjoy :)

    Posté le 11 août 2009 à 09:00:26

  10. Tito Reply to this comment


    Zut, je comptais hacker korben.info :P

    Posté le 11 août 2009 à 09:02:10

  11. homerunisgood Reply to this comment


    Petite curiosite: On t’a fait chier avec cette faille avant que tu la repares ?

    Posté le 11 août 2009 à 09:10:43

  12. Korben Reply to this comment


    @homerunisgood: non… j’ai juste pris les devants

    Posté le 11 août 2009 à 09:13:23

  13. Cretch Reply to this comment


    Un grand merci Korben :)

    Posté le 11 août 2009 à 09:22:34

  14. aciDben Reply to this comment


    C’est les vacances ? un exploit 0day qui prend aucun skill pour le faire ?
    C’est noël pour les 11-14ans là…

    Posté le 11 août 2009 à 09:24:01

  15. Wordpress 2.8.3 : faille sur le reset password » Cogitations Peckiennes Reply to this comment


    [...] propose une solution, en modifiant le code, je vous en propose une autre qui ne permet pas d’éviter le bug (pas de modification de [...]

    Posté le 11 août 2009 à 09:25:07

  16. FOx15 Reply to this comment


    +1 avec stagueve ;)

    Posté le 11 août 2009 à 09:41:40

  17. Carmin.D Reply to this comment


    Merci Tonton, tout est ok now ;)

    Posté le 11 août 2009 à 10:04:29

  18. Lousia Reply to this comment


    MERCI.
    En fait quand j’ai reçu le mail j’ai pensé à toi, en me disant : « Pas grave, Korben saura. »
    Tu te rends compte que tu es en train de devenir le Superman des bugs ?

    Posté le 11 août 2009 à 10:07:24

  19. Korben Reply to this comment


    @Lousia: héhé :-) Le sauveur des geeks :-)

    Posté le 11 août 2009 à 10:08:41

  20. Sylvain Reply to this comment


    Je m’y suis peut être pris comme un manche, mais en virant l’utilisateur admin, « le bug fonctionne » quand même. Mon autre utilisateur ayant les droits d’administrateur a vu son mot de passe changé…

    Posté le 11 août 2009 à 10:09:18

  21. Korben Reply to this comment


    @Sylvain: Peut être que ça marche avec tous les comptes admins… aucune idée

    Posté le 11 août 2009 à 10:19:12

  22. Wacken Reply to this comment


    @ Sylvain : pareil chez moi, le bug fonctionne même avec un autre compte admin.

    Posté le 11 août 2009 à 10:36:50

  23. Kiwi Reply to this comment


    ben ça va j’ai pas fait la MAJ ^^

    Posté le 11 août 2009 à 10:40:41

  24. Wacken Reply to this comment


    @ Kiwi : ça fonctionne aussi sous WP 2.8.2 ;)

    Posté le 11 août 2009 à 10:50:09

  25. Jeff Reply to this comment


    c’est pas mal cette astuce ^^ j’ai déjà fait mon petit coup sur un grand wordpress de jeux videos (WiiFolder). Ya pas de moyens qu’elle remonte a moi quand même ???

    Posté le 11 août 2009 à 10:55:34

  26. Korben Reply to this comment


    @Jeff: mdr ! Tu viens de laisser le nom du site et l’adresse de ton blog, donc si maintenant, y’a moyen !

    Posté le 11 août 2009 à 10:58:52

  27. daguo Reply to this comment


    J’ai viré le compte Admin… 64 messages dans ma boite mail. Doit il y avoir des gens qui m’aime bien…

    Posté le 11 août 2009 à 11:09:15

  28. zul595 Reply to this comment


    hello mister Korben
    pas méchant , mais chiant comme hack
    merci pour l’info :)

    Posté le 11 août 2009 à 11:20:59

  29. Francois Reply to this comment


    ça marche au poil ! Merci :D

    Posté le 11 août 2009 à 11:24:07

  30. Pirhoo Reply to this comment


    Merci Korbenichou ! Sinon bravo @Jeff: si t’a fait un script qui mouline le wp-login.php, dans les logs de apache c’est hyper voyant une adresse ip qui apparait 100 fois sur le même fichier… Aha.

    Posté le 11 août 2009 à 11:58:30

  31. geekbay Reply to this comment


    mmm je ne suis pas sur que changer le compte admin, change quelque chose ici, puisque comme on voit

    $user = $wpdb->get_row($wpdb->prepare(« SELECT * FROM $wpdb->users
    WHERE user_activation_key = %s », $key));

    donc il va prendre le premier user qui a user_activation_key =  » qui peut avoir n’importe quel nom.
    D’ailleur dans l’exploit aussi wp-login.php?action=rp&key[]= , l’utilisateur n’est pas precisé.

    Voila j’ai pas encore test pour vérifier ce que je dis mais à la lecture du code, ca a l’air ca.

    Quelqu’un peut confirmer ?

    Posté le 11 août 2009 à 12:07:17

  32. filc Reply to this comment


    aha, n’empêche si jamais le blog est hébergé sur un truc gratos qui ne permet pas à PHP d’envoyer des mails…ça peut être gênant. =)

    Ou comme chez free, ou l’utilisation de la fonction mail est limité, suffit de le faire énormément de fois, et hop la, il recevra pas le nouveau mot de passe…

    (Ceci dit, au passage, il peut toujours le modifier ensuite manuellement dans la BDD)

    Posté le 11 août 2009 à 12:20:55

  33. Moubai Reply to this comment


    merci pour l’infos, blog modifié

    Posté le 11 août 2009 à 12:29:12

  34. Shughart Reply to this comment


    @geekbay: La solution du changement de compte admin n’est que temporaire, une personne malintentionnée qui retrouverai votre nouveau nom d’admin, par exemple Korben, pourra encore réinitialiser votre mot de passe. La méthode sure c’est de désactiver cette fonction.

    Posté le 11 août 2009 à 12:46:20

  35. geekbay Reply to this comment


    @shugart ce que je dis c’est que meme si on change l’utilisateur admin, l’exploit fonctionne et le mdp de l’utilisateur renomme est quand meme changé, sans meme connaitre le nouveau nom.

    Posté le 11 août 2009 à 12:55:17

  36. keeg Reply to this comment


    Merci de l’information, je me garde ça sous le coude au cas où.

    Posté le 11 août 2009 à 13:02:27

  37. Shughart Reply to this comment


    Ooooups pardon, je me suis mal réveillé et j’ai mal formulé ma phrase, en fait je voulais « abonder dans ton sens » et non remettre en question ce que tu disais … Sorry :s

    Sauf que tu parle de l’admin renommé en disons korben, alors que je parle d’un utilisateur totalement différent, nouveau, là ou l’admin aura été supprimé.

    Mais globalement, c’est tout à fait ça :p

    Posté le 11 août 2009 à 13:02:31

  38. Jeff Reply to this comment


    @Korben: Eh mince! ^^

    Posté le 11 août 2009 à 13:34:44

  39. Vendeesign Reply to this comment


    Thanks

    <3 le commentaire de redirection^^

    Posté le 11 août 2009 à 13:38:30

  40. Correctif pour la faille WordPress de réinitialisation de mot de passe : correctif pour la faille d Reply to this comment


    [...] “solutions” ont été apportées notamment par Korben ou encore par l’équipe de développement de l’outil de [...]

    Posté le 11 août 2009 à 14:44:09

  41. piouPiouM Reply to this comment


    C’est d’un crade :-/

    Plus proprement : http://bit.ly/wskWZ

    Posté le 11 août 2009 à 14:49:07

  42. Une faille sur Wordpress 2.8.3 « Tout simplement moi… Reply to this comment


    [...] : Blog de Korben Aucun [...]

    Posté le 11 août 2009 à 14:59:21

  43. piouPiouM Reply to this comment


    @Stagueve: ça ne servira à rien, la faille agit sur le premier utilisateur trouvé dans la table des utilisateurs. Ici l’effet pervers est que d’une règle générale ce premier utilisateur est l’adminsitrateur du site.

    Posté le 11 août 2009 à 15:36:03

  44. Shughart Reply to this comment


    @piouPiouM: Merci !

    Posté le 11 août 2009 à 16:06:18

  45. Correctif pour la faille WordPress de réinitialisation du mot de passe at Shughart’s Technolo Reply to this comment


    [...] “solutions” ont été apportées notamment par Korben ou encore par l’équipe de développementde l’outil de [...]

    Posté le 11 août 2009 à 16:14:14

  46. Galdon Reply to this comment


    Des bugs comme ça c’est un peu abusé quand même :(

    Posté le 11 août 2009 à 16:31:34

  47. darky Reply to this comment


    plus simple: $key = (string) $key; avant le preg_replace() ;)

    Posté le 11 août 2009 à 17:21:53

  48. WordPress 2.8.3 : correctif du hack de réinitialisation du mot de passe at Shughart’s Technol Reply to this comment


    [...] “solutions” pour désactiver cette fonction ont été apportées notamment par Korben ou encore par l’équipe de développementde l’outil de [...]

    Posté le 11 août 2009 à 18:33:51

  49. Kiwi Reply to this comment


    Bon j’ai fait la modif du code, pas mal de d’autres sites d’ailleurs xD

    Posté le 11 août 2009 à 18:49:10

  50. skullpat Reply to this comment


    Plus simple encore, faille corrigée par WP :
    http://core.trac.wordpress.org/changeset/11798

    Posté le 11 août 2009 à 19:40:09

  51. fabien Reply to this comment


    en fait c’est quand meme plus simple de changer le nom du fichier php

    Posté le 11 août 2009 à 20:51:03

  52. ZePRiNCE Reply to this comment


    http://www.korben.info/wp-login.php?action=rp&key=
    Oh zut ;)

    Posté le 12 août 2009 à 00:58:00

  53. William Reply to this comment


    Merci Korben de nous avoir fait passé l’info. Sympa, je l’ai mise en place en attendant la mise à jour de WordPress.

    PS : Je viens de faire la mise à jour. Corrigé et quel soulagement :)

    Posté le 12 août 2009 à 09:29:36

  54. Amaury Reply to this comment


    Pour info WP 2.8.4 est sortie et corrige la chose ;)

    Pour corriger le bug manuellement :
    http://core.trac.wordpress.org/changeset?old_path=%2Ftags%2F2.8.3&old=11806&new_path=%2Ftags%2F2.8.4&new=11806

    Posté le 12 août 2009 à 12:02:01

  55. Wordpress : Mise à jour de sécurité 2.8.4 | Le Journal du Blog Reply to this comment


    [...] malveillante. Je vous conseille d’installer la version 2.8.4 ou de mettre en place la solution proposée par Korben. Vous avez aimé cet article : abonnez-vous au flux [...]

    Posté le 12 août 2009 à 21:48:02

  56. Albarsark Reply to this comment


    Fiouu, vous avec pris les devants et été plus vite que wp….joli…
    j’ai lu avec intéret l’article
    salut

    Posté le 25 novembre 2009 à 11:07:02