11ago
48

llave wordpress

Si aún te preguntas porque debes actualizar WordPress a la nueva versión, actualmente la 2.8.3, debes saber que las versiones anteriores tienen un fallo de seguridad que puede facilitar que alguien – malintencionadamente – reinicie la contraseña del administrador (sea el nombre de usuario ‘admin’ u otro) aún sin un email válido autorizado.

Es tan sencillo como hacer lo siguiente:

Se envía un cambio de dirección de email o nombre de usuario a través de este formulario:

/wp-login.php?action=lostpassword ;

WordPress envía una confirmación para reiniciarlo a través del típico email:


Alguien ha solicitado reiniciar la contraseña del siguiente sitio y usuario.

http://DOMAIN_NAME.TLD/wordpress

Username: admin
Para reiniciar tu contraseña visita la siguiente dirección, en caso contrario simplemente ignora este email y no pasará nada

http://DOMAIN_NAME.TLD/wordpress/wp-login.php?action=rp&key=o7naCKN3OoeU2KJMMsag

Si se hace clic en el enlace WordPress reinicia la contraseña de administrador y envía otro email con los nuevos datos de acceso.

Así es como funciona:

wp-login.php:
...[snip]....
line 186:
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'));
...[snip]....
line 276:
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login';
$errors = new WP_Error();
if ( isset($_GET['key']) )
    $action = 'resetpass';
// validate action so as to default to the login screen
if ( !in_array($action, array('logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login')) && false === has_filter('login_form_' . $action) )
    $action = 'login';
...[snip]....
line 370:
break;
case 'resetpass' :
case 'rp' :
    $errors = reset_password($_GET['key']);
    if ( ! is_wp_error($errors) ) {
        wp_redirect('wp-login.php?checkemail=newpass');
        exit();
    }
    wp_redirect('wp-login.php?action=lostpassword&error=invalidkey');
    exit();
break;
...[snip ]...

Puedes incluso reiniciar la clave de admin enviando un array a la variable $key.

Puedes incluso hacer una prueba de concepto. Solo necesitas el navegador web para reproducirlo:

http://DOMAIN_NAME.TLD/wp-login.php?action=rp&key[]=

La contraseña se reiniciará sin confirmación alguna.

Da miedo ¿verdad?, pues actualiza coño., pues revisa lo que viene a continuación … 

Actualización: esta vulnerabilidad también afecta a la versión 2.8.3 y se puede solucionar como indica Martín:

Abre el fichero wp-login.php y su sustituye esta línea …

if ( empty( $key )  )

por esta otra …

if ( empty( $key ) || is_array( $key ) )

Si por cualquier motivo no te funciona este “hack” prueba a bajar la versión modificada del archivo wp-login.php del trac, con el problema solucionado, como ha hecho Ferticidio.

Esta vulnerabilidad ya la están aprovechando varios indeseables que no tienen nada mejor que hacer así que no te lo tomes a la ligera.

Para saber más: