我可以阻止在wordpress站点上枚举用户名吗?我现在可以看到用户在使用WPScan工具。
我可以阻止用户名的枚举吗?
我在.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
.Update 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]
你不能。
WPScan工具是一个自动实用程序,它利用WordPress的友好URL来确定用户名。It will loop through 作者的前10个可能ID,并检查Location
HTTP响应上的标头以查找用户名。
使用http://mysite.url
例如
WPScan将检查http://mysite.url/?author=1
. 如果您的站点使用的是相当长的永久链接,它将返回一个301重定向,其中包含Location
页眉,共页http://mysite.url/author/username
. 如果您的站点没有使用永久链接,它将返回200(OK)的状态,因此WPScan将检查提要中的字符串;按用户名发布”;并提取用户名。
首先,你能做什么,仅仅因为有人能猜到你的用户名,并不意味着你的网站不安全。你真的没有办法阻止别人以这种方式解析你的网站。
However ...
如果您真的对此感到担忧,我建议您做两件事:- Turn off pretty permalinks. 这将迫使WPScan和类似工具解析站点内容中的用户名,而不是依赖URL
- Force users to set a different nickname. 如果URL中没有用户名,扫描工具将搜索;按用户名发布”;而不是在feed/post内容中。如果你不把用户名放在那里,那么他们就不会被抓获
虽然还没有彻底测试过,但我认为最好删除底层资源,而不是在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注意,这将完全杀死作者档案,这可能是或可能不是适当的偏执级别:)您可以使用。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]
对我们来说很好。我想补充一点,您也可以在nginx上执行此操作。检查:
;Blocking WordPress User Enumeration on nginx - www.edwidget.name
作为补充说明,我想防止在我的网站上使用WP引擎进行用户名枚举,这会限制用户访问低级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
瞧,你的用户名是安全的!通过在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]
我作为政府机构渗透测试人员的专业意见。。。是的ALWAYS 值得让您更难列举有关您网站的信息。你们中很少有人会有一个超越谷歌、脚本小子黑客的网站。我们讨论的是分层安全,对于每一层,您都会为渗透尝试增加时间和复杂性。每一层还增加了黑客所需的技能。WP上有一些非常好的应用程序防火墙。寻找那些可以阻止重复用户登录尝试的IP地址或404的IP地址。这个想法是为了让防火墙自动阻止IP,这些IP会扫描你的网站,寻找不存在的页面或试图重复登录你的网站。一个好的特性还包括XSS和SQL注入阻塞功能。考虑使用Tips and Tricks HQ、Peter、Ruhul、Ivy的多功能WP安全。它为新手和专家提供了一个体面的界面和功能集。而不是.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();
}
我知道这是一篇老文章,但为了将来的参考,我想添加我的解决方案。这只是放在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变量,因此不会对其进行查询如果使用permalinks,这将使作者档案保持原样。此外,如果URL类似于:/dummy?author=1
这将只显示/dummy
.
感谢Rarst对这个问题的回答https://perishablepress.com/stop-user-enumeration-wordpress/
我想发表自己的观点:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule (.*) $1? [L]
第一行仅检测主页。我会解释原因的。此“用户枚举”功能仅在主页上有效,因此无需重写所有URL。接下来我们要寻找author=
查询字符串。这是显而易见的。
最后,我们只是展示original 没有任何块、重定向(301、302)或禁止(403)的页面。难道它不应该像一个包含其他无用参数的页面吗?