Seguridad WordPress

Evitar la enumeración de usuarios en WordPress parte 1

La enumeración de usuarios es una vulnerabilidad que podría ser utilizada por un atacante o un usuario malicioso para intentar obtener un listado de los usuarios de la plataforma y posteriormente utilizar dicha información para planificar y generar ataques de mayor impacto, como por ejemplo, ataques de averiguación de contraseñas por fuerza bruta o diccionario sobre usuarios existentes en el sistema.

Dicho de otro modo: si un atacante consiguiera averiguar un nombre de usuario, ya tendría el 50% de lo que necesita para acceder al panel de administración de nuestro sitio.

Hay dos formas de intentar averiguar el nombre de usuario de WordPress, por eso he dividido la entrada en dos partes.

Averiguar el usuario a través de la URL de Autor

Probablemente hayas configurado los enlaces permanentes para que sean amigables y conseguir un mejor posicionamiento SEO.

Si a la URL de tu sitio le añades el parámetro /?author=1 y existe un usuario con ID=1, notarás que te redirige a una URL del tipo misitio.es/author/miusuario/ donde miusuario es el nombre de usuario.

Autor permalink

WordPress almacena en base de datos el nombre de usuario en el campo user_login. Además almacena la versión sanitizada del mismo en el campo user_nicename. Es con éste último campo con el que construye el enlace amigable de autor que vemos en la imagen de arriba.

Bastaría ir probando con IDs diferentes para ir sacando los nombres de usuario que tenemos en BBDD. Incluso hay herramientas como WP Scan que automatizan este proceso realizando barridos y sacando un listado de usuarios válidos de nuestro sitio web.

Por esto es aconsejable cambiar la URL de autor en WordPress. Por defecto no se puede cambiar el nombre de usuario desde el back-end. Para ello debes acceder a la base de datos desde el panel de control de tu hosting y buscar la tabla {prefix}users. Selecciona tu usuario y cambia el campo user_nicename con el nombre que desees, siempre en minúsculas, sin espacios, sin acentos, y sin caracteres extraños.

Así podremos tener nuestro user_login diferente del user_nicename y evitar la enumeración de usuarios. Si lo prefieres, puedes usar el plugin Edit Author Slug que te permitirte cambiar el user_nicename entre otras cosas.

Hasta aquí hemos visto como despistar a un atacante malintencionado mostrando un user_nicename que no coincide con nuestro user_login. Si queremos bloquear la enumeración de usuarios podemos hacerlo a través del archivo .htaccess añadiendo estas líneas:

# Bloquear la enumeración de usuarios (username)
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://tudominio.com/ruta_real_que_sea/? [L,R=301]

También podemos bloquear la enumeración de usuarios a través del archivo functions.php de nuestro tema añadiendo estas líneas:

<?php

//Stop User Enumeration
if ( ! is_admin() && isset($_SERVER['REQUEST_URI'])){
    if (preg_match('/(wp-comments-post)/', $_SERVER['REQUEST_URI']) === 0 && !empty($_REQUEST['author']) ) {
        wp_die('forbidden');
    }
}

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

3 comentarios en Evitar la enumeración de usuarios en WordPress parte 1

  1. Ciertamente, hay que cambiar el nicename en la Tabla users. Pero esto es en el caso del KeyMaster.
    Para nuevos usuarios o recien registrados funciona esto (functions.php). Este codigo automaticamente cambia el nicename por el name. O sea que si te llamas John Doe, tu nicename o nickname sera asi mismo, protegiendo asi tu username. Pero siento que este codigo necesita actualizacion, o sea, que sirva para la operacion con el KeyMaster (para no tener que ir a la DB) y que automaticamente actualice los nicename / nickname de todos los usuarios anteriormente registrados o viejos usuarios. Por tanto, Pablo, si puedes mejora el Codigo para que haga esa operacion automatica inmediatamente lo pongas en el functions.php o lo actives como plugin. Por favor avisame cuando lo hagas.

    // Change Buddypress username for nickname
    function set_default_display_name( $user_id ) {
    $user = get_userdata( $user_id );
    $name = sprintf( ‘%s %s’, $user->first_name, $user->last_name );
    $nickname = sanitize_user( strtolower( str_replace( ‘ ‘, », $name ) ) );
    $args = array(
    ‘ID’ => $user_id,
    ‘display_name’ => $name,
    ‘nickname’ => $nickname,
    ‘user_nicename’ => $nickname
    );
    wp_update_user( $args );
    }
    add_action( ‘user_register’, ‘set_default_display_name’ );

    1. Hola León

      No creo que esto sea algo que deba automatizarse. Si te llamas John Doe y vas a guardar en el nicename john-doe (valor sanitizado) no estás ocultando muy bien tu nombre de usuario. Deberías cambiarlo por algo más trabajado.

      Para usuarios de roles menores no es tan importante, en mi opinión

      1. Amigo Pablo. El problema es que desde hace tiempo se conoce una vulnerabilidad llamada Enumeración de Usuario. Si un hacker deseaba saber tu username solo tenía que agregar ?author=1 a la URL de tu sitio. Sin embargo, este problema todavía existe en WP, si haces click derecho sobre el Nombre Público obtienes en el enlace interno el Username. P. ej. https://desarrollowp.com/author/pablolopezmestre/ (espero que pablolopezmestre no sea tu username, sino un nicename personalizado). La solución es como dices, ir a la Tabla wp_users… Pero esto es Tedioso, más aun para los novatos. Bien, lo que hace el Código anterior es automáticamente cambiar el nicename / nickname (en WP) por el mismo nombre y apellido del Usuario: Sí John Doe, entonces johndoe. Obviamente el username debe ser diferente al Nombre, p. ej. J00G4latic. Para solucionar este problema, lo que podría hacerse es, un Código que trabaje en el Registro, avisándole al Usuario que su Username debe ser diferente del Nombre y Apellido. Con respecto al Código anterior, lo que busco es Actualizarlo. Lamentablemente no puedo comunicarme con la persona que lo hizo, por eso te digo que si sabes PHP intentes modificarlo para causar que una vez activado el Código (sea en Plugin) o puesto en el Functions.php Actualice el nicename (del KeyMaster o Admin) y de todos los Usuarios registrados.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *:

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios