¿Puedo evitar la enumeración de los nombres de usuario en mi sitio de wordpress? Puedo ver usuarios en este momento usando la herramienta WPScan.
¿Puedo evitar la enumeración de los nombres de usuario en mi sitio de wordpress? Puedo ver usuarios en este momento usando la herramienta WPScan.
Una solución simple que utilizo en .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 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
Estoy viendo 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}
Por lo tanto, 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]
No puedes.
La herramienta WPScan es una utilidad automatizada que aprovecha las URL amigables de WordPress para determinar los nombres de usuario. Recorrerá las primeras 10 ID posibles para autores y compruebe el encabezado Location
en la respuesta HTTP para encontrar un nombre de usuario.
Usando http://mysite.url
por ejemplo ...
WPScan comprobará http://mysite.url/?author=1
. Si su sitio está usando bastante enlaces permanentes, devolverá un redireccionamiento 301 con un encabezado Location
de http://mysite.url/author/username
. Si su sitio no está utilizando bonitos enlaces permanentes, devolverá un estado de 200 (OK) en su lugar, por lo que WPScan revisará la fuente de la cadena "publicaciones por nombre de usuario" y extraerá el nombre de usuario.
En primer lugar, solo porque alguien pueda adivinar su nombre de usuario, no significa que su sitio sea inseguro. Y realmente no hay manera de evitar que alguien analice su sitio de esa manera.
Sin embargo ...
Si estás realmente preocupado por esto, te recomendaría hacer dos cosas:
Otra alternativa es cambiar las escrituras de los enlaces permanentes de su autor. Hay varias formas de hacerlo y probablemente encuentre algunas en este sitio también .
No lo probé a fondo, pero creo que es preferible eliminar el recurso subyacente en lugar de intentar construir muros alrededor de él en el nivel del servidor web. Por lo tanto, en términos de WP, eso impediría que se procesen las 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;
}
);
}
PS tenga en cuenta que esto eliminará los archivos del autor por completo , lo que podría o no ser el nivel de paranoia adecuado :)
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 el contenido analizable como lo describe EAMann.
El siguiente blog describe cómo hacerlo, pero tiene un error tipográfico en la regla de reescritura: enlace
La regla correcta también debe eliminar la cadena de consulta de la URL reescrita, o de lo contrario, todavía revelará el nombre de usuario. Debería verse así:
# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]
Funcionando bien para nosotros.
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 del nombre 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, sí tienen una sección de "Reglas de redireccionamiento" en su panel de control que le permite lograr esto. Después de un tiempo logré averiguar 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: /?
Luego debes mostrar el panel Advanced Settings
...
Match args: author=([0-9]*)
Rewrite type: 301 Permanent
Et voila, sus nombres de usuario están seguros [r]!
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 evaluador de penetración para una agencia de gobierno ... merece SIEMPRE hacer más difícil enumerar información sobre su sitio web. Pocos de ustedes tendrán un sitio web que se eleva por encima de los piratas informáticos Google, script para niños. 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 requerido del hacker. Hay algunos cortafuegos de aplicaciones realmente buenos disponibles en WP. Busque aquellos que puedan bloquear las direcciones IP que tengan repetidos intentos de inicio de sesión de usuario o 404. La idea es que su firewall bloquee automáticamente las IP que analizan 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 XSS y capacidades de bloqueo de inyección SQL. Considere la posibilidad de usar All In One WP Security de Consejos y trucos HQ, Peter, Ruhul, Ivy. Tiene una interfaz decente y un conjunto de capacidades para principiantes y expertos por igual.
En lugar de la ruta .htaccess
, otra alternativa es agregar el siguiente código al tema functions.php
de su hijo:
# 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), usando 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();
}
Sé que esta es una publicación antigua, pero para futuras referencias también me gustaría agregar mi solución. Esto es solo un fragmento para incluir el functions.php
de tu tema. Dejará todo en su lugar y funcionando, incluso los archivos del autor, pero elimina las solicitudes de enumeración erróneas.
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:
author=1
Si usa los enlaces permanentes, esto dejará los archivos del autor intactos. Además, si la URL será algo como: /dummy?author=1
esto solo mostrará la página para /dummy
.
Gracias a la respuesta de Rarst a esta pregunta y enlace
Lea otras preguntas en las etiquetas security