Aller au contenu
Korben, roi d’internet, logo bébé avec des lunettes en mode thug life

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) . "rn";
$message .= sprintf(__('Password: %s'), $new_pass) . "rn";
$message .= site_url('wp-login.php', 'login') . "rn";
$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) . "rn";
$message .= sprintf(__('Password: %s'), $new_pass) . "rn";
$message .= site_url('wp-login.php', 'login') . "rn";
$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]


Les articles du moment