¿Puedo evitar la enumeración de nombres de usuario?

33

¿Puedo evitar la enumeración de nombres de usuario en mi sitio de wordpress? Puedo ver usuarios en este momento usando la herramienta WPScan.

urok93
fuente
Creé

Respuestas:

26

Una solución simple que uso en un .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 RewriteRulees muy rápido: a menudo ves una captura ([0-9]*)en expresiones regulares para esto. Pero no es necesario desperdiciar memoria para la captura cuando no usa la expresión capturada, y una coincidencia para el primer carácter es suficiente, porque no desea aceptar author=1b.

Actualización 20.04.2017

Veo más solicitudes "rotas" de personas que son incluso demasiado estúpidas para ejecutar un análisis simple. Las URL solicitadas se ven así:

/?author={num:2}

Entonces podría 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]
fuxia
fuente
13

No puedes

La herramienta WPScan es una utilidad automatizada que aprovecha las URL amigables de WordPress para determinar los nombres de usuario. Recorrerá los primeros 10 ID posibles para los autores y verificará el Locationencabezado en la respuesta HTTP para encontrar un nombre de usuario.

Usando http://mysite.urlpor ejemplo ...

WPScan lo comprobará http://mysite.url/?author=1. Si su sitio utiliza enlaces permanentes bonitos, devolverá una redirección 301 con un Locationencabezado de http://mysite.url/author/username. Si su sitio no utiliza enlaces permanentes bonitos, en su lugar devolverá un estado de 200 (OK), por lo que WPScan verificará el feed de la cadena "publicaciones por nombre de usuario" y extraerá el nombre de usuario.

Lo que puedes hacer

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

Sin embargo ...

Si está realmente preocupado por esto, le recomendaría hacer dos cosas:

  1. Desactiva los enlaces permanentes bonitos. Esto obligará a WPScan y herramientas similares a analizar el contenido de su sitio en busca de nombres de usuario en lugar de depender de la URL.
  2. Forzar 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 nombre de usuario" en el contenido del feed / publicación. Si no está poniendo nombres de usuario, entonces no se pueden atrapar.

Otra alternativa es cambiar las reescrituras de enlaces permanentes de su autor. Hay varias formas de hacerlo, y probablemente también pueda encontrar algunas en este sitio .

EAMann
fuente
4

No lo probé a fondo, pero creo que es preferible eliminar el recurso subyacente en lugar de intentar construir muros a su alrededor en el nivel del servidor web. Entonces, en términos de WP, eso impediría que procesara variables de consulta relacionadas con el autor.

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: tenga en cuenta que esto eliminará por completo los archivos de autor , lo que podría o no ser el nivel de paranoia apropiado :)

Rarst
fuente
3

Puede usar una regla de reescritura .htaccess para evitar esta divulgación, pero también debe asegurarse de usar apodos para evitar revelar nombres de usuario en contenido analizable según lo descrito por 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, o de lo contrario aún revelará el nombre de usuario. Debe tener un aspecto como este:

# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI}  ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]

Trabajando bien para nosotros.

jptsetme
fuente
2

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

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

Redirect Name: // choose a description for the rewrite
Domain: // you *must* select a domain; "All Domains" will *not* work here!
Source: ^/$
Destination: /?

Entonces necesitas mostrar el Advanced Settingspanel ...

Match args: author=([0-9]*)
Rewrite type: 301 Permanent

¡Y listo, sus nombres de usuario están seguros [r]!

cfx
fuente
0

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

# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI}  ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yourdomain.com [L,R=301]
RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]

Mi opinión profesional como probador de penetración para una agencia gubernamental ... SIEMPRE esVale la pena hacer que sea más difícil enumerar información sobre su sitio web. Pocos de ustedes tendrán un sitio web que se eleve por encima del google, script kiddie hackers. Estamos hablando de seguridad en capas y con cada capa, agrega tiempo y complejidad a un intento de penetración. Cada capa también se suma al conjunto de habilidades requeridas por el hacker. Hay algunos firewalls de aplicaciones realmente buenos disponibles en WP. Busque aquellos que puedan bloquear las direcciones IP que tienen intentos repetidos de inicio de sesión de usuario o 404. La idea es que su firewall bloquee automáticamente las IP que escanean su sitio web en busca de páginas que no existen o intentan iniciar sesión repetidamente en su sitio. Una buena característica también incluye capacidades de bloqueo de inyección de XSS y SQL. Considere usar All In One WP Security de Tips and Tricks HQ, Peter, Ruhul, Ivy.

Walter
fuente
0

En lugar de la .htaccessruta, otra alternativa es agregar el siguiente código al tema de su hijo functions.php:

# Redirect author page to homepage
add_action( 'template_redirect', 'wpse_46469_author_page' );

function wpse_46469_author_page() {
    # If the author archive page is being accessed, redirect to homepage
    if ( is_author() ) {
        wp_safe_redirect( get_home_url(), 301 );
        exit;
    }
}

Además, puede cambiar los enlaces de autor predeterminados que se agregan al nombre de usuario de cada página a otra cosa (como la página de inicio), utilizando lo siguiente:

# Replace author URL with the homepage
add_filter( 'author_link', 'wpse_46469_author_link' ); 

function wpse_46469_author_link() {
    # Return homepage URL
    return home_url();
}
Ethan Jinks O'Sullivan
fuente
0

Sé que esta es una publicación antigua, pero para futuras referencias también me gustaría agregar mi solución. Este es solo un fragmento para poner en el functions.phptema. Dejará todo en su lugar y funcionando, incluso los archivos del autor, pero elimina las malas solicitudes de enumeración.

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;
}

Que hace:

  • escanea la URL en busca de algo como: author=1
  • Cuando se encuentre, eliminará la variable de autor de los vars de consulta, por lo que no se consultará.

Si usa enlaces permanentes, esto dejará intactos los archivos del autor. Además, si la URL será algo así: /dummy?author=1esto solo mostrará la página /dummy.

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

leendertvb
fuente
0

Quiero publicar mi propia visión:

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

La primera línea detecta solo la página de inicio. Te explicaré por qué. Esta función de "enumeración de usuarios" solo funciona en la página de inicio, por lo que no es necesario volver a escribir todas las URL.

A continuación buscamos la author=cadena de consulta. Es obvio.

Finalmente, solo mostramos la página original sin bloques, redireccionamientos (301, 302) o prohibiciones (403). ¿No debería actuar como una página con cualquier otro parámetro inútil?

vladkras
fuente