¿Puedo Prevenir la Enumeración de Nombres de Usuario?

22 mar 2012, 16:39:33
Vistas: 36.2K
Votos: 35

¿Puedo prevenir la enumeración de nombres de usuario en mi sitio WordPress? En este momento puedo ver los usuarios utilizando la herramienta WPScan.

1
Comentarios

Creé un plugin para llenar este vacío encuéntralo en los Plugins de Wordpress aquí: http://wordpress.org/plugins/stop-user-enumeration/

user2412827 user2412827
20 ago 2013 12:32:16
Todas las respuestas a la pregunta 9
0
30

Una solución simple que uso en un archivo .htaccess:

RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]

Es similar a la respuesta de @jptsetme, pero funciona incluso cuando la cadena de consulta es /?dummy&author=5, y el patrón de búsqueda para RewriteRule es muy rápido: A menudo se ve una captura ([0-9]*) en expresiones regulares para esto. Pero no hay necesidad de desperdiciar memoria para la captura cuando no usas la expresión capturada, y una coincidencia para el primer carácter es suficiente, porque no quieres aceptar author=1b.

Actualización 20.04.2017

Estoy viendo más solicitudes "rotas" de personas que son incluso demasiado torpes para ejecutar un escaneo simple. Las URLs solicitadas se ven así:

/?author={num:2}

Entonces podrías extender la regla anterior a:

RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num 
RewriteRule ^ - [L,R=403]
17 ene 2014 18:59:13
0
13

No puedes.

La herramienta WPScan es una utilidad automatizada que aprovecha las URLs amigables de WordPress para determinar los nombres de usuario. Iterará a través de los primeros 10 IDs posibles para autores y verificará el encabezado Location en la respuesta HTTP para encontrar un nombre de usuario.

Usando http://misitio.url como ejemplo...

WPScan verificará http://misitio.url/?author=1. Si tu sitio usa enlaces permanentes "bonitos", devolverá un redireccionamiento 301 con un encabezado Location de http://misitio.url/author/nombredeusuario. Si tu sitio no usa enlaces permanentes "bonitos", devolverá un estado 200 (OK) en su lugar, por lo que WPScan buscará en el feed la cadena "publicaciones por nombredeusuario" y extraerá el nombre de usuario.

Lo que puedes hacer

En primer lugar, solo porque alguien pueda adivinar tu nombre de usuario, no significa que tu sitio sea inseguro. Y realmente no hay forma de evitar que alguien analice tu sitio de esa manera.

Sin embargo...

Si realmente te preocupa esto, recomendaría hacer dos cosas:

  1. Desactiva los enlaces permanentes "bonitos". Esto obligará a WPScan y herramientas similares a analizar el contenido de tu sitio para obtener nombres de usuario en lugar de confiar en la URL.
  2. Obliga a los usuarios a establecer un apodo diferente. En ausencia de un nombre de usuario en la URL, las herramientas de escaneo buscarán "publicaciones por nombredeusuario" en el feed/contenido de la publicación. Si no muestras los nombres de usuario públicamente, no podrán ser capturados.

Otra alternativa es cambiar las reglas de reescritura de enlaces permanentes para autores. Hay varias formas de hacer esto, y probablemente puedas encontrar algunas en este sitio también.

22 mar 2012 17:41:45
0

No he probado esto exhaustivamente, pero creo que es preferible eliminar el recurso subyacente en lugar de intentar construir muros alrededor en el nivel del servidor web. Entonces, en términos de WordPress, eso significaría evitar que procese las variables de consulta relacionadas con autores.

if ( ! is_admin() ) {
    add_filter(
        'query_vars',
        function ( $public_query_vars ) {

            foreach ( array( 'author', 'author_name' ) as $var ) {
                $key = array_search( $var, $public_query_vars );
                if ( false !== $key ) {
                    unset( $public_query_vars[$key] );
                }
            }

            return $public_query_vars;
        }
    );
}

PD: ten en cuenta que esto eliminará completamente los archivos de autor, lo cual podría o no ser un nivel de paranoia apropiado :)

18 ene 2014 11:38:33
0

Puedes usar una regla de reescritura en .htaccess para evitar esta divulgación, pero también deberías asegurarte de usar apodos para evitar revelar nombres de usuario en contenido analizable como lo describe EAMann.

El siguiente blog describe cómo hacerlo pero tiene un error tipográfico en la regla de reescritura: http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking

La regla correcta también debería eliminar la cadena de consulta de la URL reescrita, de lo contrario todavía revelarás el nombre de usuario. Debería verse así:

# Detener la vulnerabilidad de enumeración de usuarios en WordPress
RewriteCond %{REQUEST_URI}  ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://tusitio.com/alguna-pagina/? [L,R=301]

Funciona bien para nosotros.

22 mar 2013 05:08:17
0

Quería agregar que también puedes hacer esto en nginx. Revisa:
» Bloqueando la enumeración de usuarios en WordPress en nginx - www.edwidget.name

Como nota adicional, quería prevenir la enumeración de nombres de usuario en mi sitio alojado con WP Engine, el cual limita el acceso de los usuarios a los archivos de configuración de bajo nivel de nginx. Sin embargo, tienen una sección de "Reglas de Redirección" en su panel de control que te permite lograr esto. Después de un tiempo, logré descubrir la mejor configuración:

Nombre de Redirección: // elige una descripción para la reescritura
Dominio: // *debes* seleccionar un dominio; "Todos los Dominios" *no* funcionará aquí
Origen: ^/$
Destino: /?

Luego necesitas mostrar el panel de Configuración Avanzada...

Coincidir argumentos: author=([0-9]*)
Tipo de Reescritura: 301 Permanente

¡Et voilà, tus nombres de usuario están más seguros!

4 nov 2013 00:28:48
0

He bloqueado completamente la enumeración de usuarios desde WPScan agregando lo siguiente en el archivo htaccess

# Detener vulnerabilidad de enumeración de nombres de usuario en WordPress
RewriteCond %{REQUEST_URI}  ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://tudominio.com [L,R=301]
RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]

Mi opinión profesional como tester de penetración para una agencia gubernamental... es SIEMPRE valioso hacer más difícil la enumeración de información sobre tu sitio web. Pocos de ustedes tendrán un sitio que supere a los hackers de Google o script kiddies. Estamos hablando de seguridad en capas y con cada capa, añades tiempo y complejidad a un intento de penetración. Cada capa también aumenta las habilidades requeridas por el hacker. Hay algunos firewalls de aplicaciones realmente buenos disponibles para WP. Busca aquellos que puedan bloquear direcciones IP que tengan intentos repetidos de inicio de sesión o errores 404. La idea es que tu firewall bloquee automáticamente las IP's que escanean tu sitio buscando páginas que no existen o intentan iniciar sesión repetidamente. Una buena característica también incluye capacidades de bloqueo de XSS e Inyección SQL. Considera usar All In One WP Security de Tips and Tricks HQ, Peter, Ruhul, Ivy. Tiene una interfaz decente y un conjunto de capacidades tanto para novatos como para expertos.

15 ago 2015 00:26:42
0

En lugar de la ruta del .htaccess, otra alternativa es agregar el siguiente código al archivo functions.php de tu tema hijo:

# Redirigir la página de autor a la página de inicio
add_action( 'template_redirect', 'wpse_46469_author_page' );

function wpse_46469_author_page() {
    # Si se está accediendo a la página de archivo de autor, redirigir a la página de inicio
    if ( is_author() ) {
        wp_safe_redirect( get_home_url(), 301 );
        exit;
    }
}

Adicionalmente, puedes cambiar los enlaces de autor predeterminados que se agregan al nombre de usuario en cada página por otro (como la página de inicio), utilizando lo siguiente:

# Reemplazar la URL de autor con la página de inicio
add_filter( 'author_link', 'wpse_46469_author_link' ); 

function wpse_46469_author_link() {
    # Devolver la URL de la página de inicio
    return home_url();
}
19 oct 2016 21:43:42
0

Sé que esta es una publicación antigua, pero para futuras referencias me gustaría añadir mi solución también. Este es solo un fragmento para colocar en el functions.php de tu tema. Dejará todo en su lugar y funcionando, incluso los archivos de autor, pero elimina las solicitudes de enumeración maliciosas.

if (!is_admin()) {
    if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ) {
        add_filter( 'query_vars', 'iside_remove_author_from_query_vars' );
    }
    add_filter('redirect_canonical', 'iside_remove_author_from_redirects', 10, 2);
}
function iside_remove_author_from_redirects($redirect, $request) {
    if( !is_admin() && preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ) {
        add_filter( 'query_vars', 'iside_remove_author_from_query_vars' );
    }
    return $redirect;
}
function iside_remove_author_from_query_vars( $query_vars ) {
    if( !is_admin() ) {
        foreach( array( 'author', 'author_name' ) as $var ) {
            $key = array_search( $var, $query_vars );
            if ( false !== $key ) {
                unset( $query_vars[$key] );
            }
        }
    }
    return $query_vars;
}

Lo que hace:

  • Escanea la URL en busca de algo como: author=1
  • Cuando lo encuentra, elimina la variable de autor de las variables de consulta para que no sea consultada.

Si usas enlaces permanentes, esto dejará intactos los archivos de autor. Además, si la URL es algo como: /dummy?author=1 simplemente mostrará la página para /dummy.

Gracias a la respuesta de Rarst a esta pregunta y https://perishablepress.com/stop-user-enumeration-wordpress/

8 feb 2017 16:02:02
1

Quiero compartir mi propia visión:

RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} author=(\%|\+|\d) [NC]
RewriteRule (.*) $1? [L]

La primera línea detecta solo la página de inicio. Explicaré por qué. Esta funcionalidad de "enumeración de usuarios" funciona solo en la página de inicio, por lo que no es necesario reescribir todas las URLs.

A continuación buscamos el parámetro de consulta author=. Es obvio.

Finalmente, simplemente mostramos la página original sin ningún bloqueo, redirecciones (301, 302) o prohibiciones (403). ¿No debería comportarse como una página con cualquier otro parámetro inútil?

19 jun 2019 19:13:53
Comentarios

Al enfocarte solo en la página de inicio, estás dejando fuera index.php, por lo que la enumeración sigue siendo posible.

guidod guidod
20 oct 2023 12:36:09