我可以防止枚举用户名吗?


Answers:


26

我在中使用的一个简单解决方案.htaccess

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

它类似于@jptsetme的答案,但即使查询字符串为/?dummy&author=5,它的工作方式RewriteRule也非常快,并且搜索模式非常快:您经常会([0-9]*)在正则表达式中看到此捕获。但是,当您不使用捕获的表达式时,就不需要浪费捕获的内存,并且第一个字符的匹配就足够了,因为您不想接受author=1b

更新20.04.2017

我看到了来自那些愚蠢到无法进行简单扫描的人发出的更多“中断”请求。所请求的URL如下所示:

/?author={num:2}

因此,您可以将上述规则扩展为:

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

13

你不能

WPScan工具是一种自动化实用程序,可利用WordPress友好的URL来确定用户名。 它将遍历作者的前10个可能的ID,并检查LocationHTTP响应上的标头以找到用户名。

使用http://mysite.url例如...

WPScan将检查http://mysite.url/?author=1。如果您的网站使用漂亮的永久链接,它将返回301重定向,Location标头为http://mysite.url/author/username。如果您的站点没有使用漂亮的永久链接,它将返回200(确定)状态,因此WPScan将检查提要中字符串“按用户名张贴”并提取用户名。

你可以做什么

首先,仅因为有人可以猜出您的用户名,并不意味着您的网站不安全。实际上,您无法阻止任何人以这种方式解析您的网站。

但是...

如果您真的对此感到担心,我建议您做两件事:

  1. 关闭漂亮的永久链接。这将迫使WPScan和类似工具解析用户名中站点的内容,而不是依赖URL。
  2. 强制用户设置其他昵称。如果URL中没有用户名,扫描工具将在供稿/帖子内容中搜索“按用户名发布的帖子”。如果您不把用户名放在那儿,那么就不能使用它们。

另一种选择是更改您的作者永久链接重写。您可以通过多种方式来执行此操作,并且可能在此站点上也可以找到一些方式


4

尚未对此进行全面测试,但我认为最好删除基础资源,而不是尝试在Web服务器级别上围绕它构建隔离墙。因此,以WP术语来说,这将阻止它处理与作者相关的查询变量。

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注意,这将完全杀死作者档案,这可能是适当的偏执狂级别,也可能是不合适的:)


3

您可以使用.htaccess重写规则来防止此泄露,但也应确保使用昵称以避免如EAMann所述在可分析的内容中公开用户名。

以下博客描述了如何执行此操作,但重写规则有错字:http : //www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking

正确的规则还应该从重写的URL中删除查询字符串,否则您仍然会泄露用户名。它看起来应该像这样:

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

为我们运作良好。


2

我想补充一点,您也可以在nginx上执行此操作。检查:
» 在nginx上阻止WordPress用户枚举-www.edwidget.name

附带说明一下,我想防止在由WP Engine托管的网站上枚举用户名,这限制了用户对低级nginx配置文件的访问。但是,他们的控制面板中确实有一个“重定向规则”部分,可让您完成此操作。一段时间后,我设法找出最佳配置:

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

然后您需要显示Advanced Settings面板...

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

瞧,您的用户名是安全的[r]!


0

通过在htaccess中添加以下内容,我已经完全阻止了WPScan的用户枚举

# 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]

作为政府机构的渗透测试人员,我的专业观点是... 永远是值得增加枚举有关您网站的信息的难度。很少有人会拥有一个超越Google(脚本小子黑客)的网站。我们谈论的是分层安全性,每一层都增加了渗透尝试的时间和复杂性。每层还增加了黑客所需的技能。WP上有一些非常好的应用程序防火墙。寻找那些可以阻止IP地址重复的用户登录尝试或404的IP地址。该想法是让您的防火墙自动阻止IP的IP,这些IP会扫描您的网站以查找不存在的页面或尝试重复登录到您的站点。一个好的功能还包括XSS和SQL注入阻止功能。考虑使用“技巧与窍门”总部的所有合一WP安全性,Peter,Ruhul,Ivy。


0

除了.htaccess路由之外,另一种替代方法是将以下代码添加到您的子主题的中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;
    }
}

此外,您可以使用以下方法将添加到每个页面的用户名的默认作者链接更改为其他名称(例如主页):

# 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();
}

0

我知道这是一篇旧文章,但是为了将来参考,我也想添加我的解决方案。这只是functions.php您主题的摘录。它将保留所有内容并可以正常工作,即使是作者存档,也可以消除不良的枚举请求。

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

它能做什么:

  • 它将扫描URL,例如: author=1
  • 找到后,它将从查询变量中删除author变量,因此不会对其进行查询。

如果您使用永久链接,那么这将使作者档案保持完整。另外,如果该网址是这样的:/dummy?author=1只会显示的页面/dummy

感谢Rarst对这个问题的回答以及https://perishablepress.com/stop-user-enumeration-wordpress/


0

我想发表自己的看法:

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

第一行仅检测主页。我会解释原因。此“用户枚举”功能仅在主页上有效,因此无需重写所有URL。

接下来,我们查找author=查询字符串。很明显。

最后,我们只显示原始页面,没有任何阻止,重定向(301、302)或禁止(403)。它不应该像具有任何其他无用参数的页面一样工作吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.