Могу ли я предотвратить перечисление имен пользователей?

33

Могу ли я запретить перечисление имен пользователей на моем WordPress сайте? Сейчас я вижу пользователей, использующих инструмент WPScan.

urok93
источник
Я создал плагин, чтобы заполнить эту дыру и найти его на Wordpress плагины здесь: wordpress.org/plugins/stop-user-enumeration
user2412827

Ответы:

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 - это автоматизированная утилита, которая использует дружественные URL-адреса WordPress для определения имен пользователей. Он будет перебирать первые 10 возможных идентификаторов авторов и проверять Locationзаголовок HTTP-ответа, чтобы найти имя пользователя.

Используя, http://mysite.urlнапример ...

WPScan проверит http://mysite.url/?author=1. Если ваш сайт использует довольно постоянные ссылки, он вернет редирект 301 с Locationзаголовком http://mysite.url/author/username. Если ваш сайт не использует красивые постоянные ссылки, он вернет статус 200 (ОК), поэтому WPScan проверит фид на строку «сообщения по имени пользователя» и извлечет имя пользователя.

Что ты можешь сделать

Прежде всего, то, что кто-то может угадать ваше имя пользователя, не означает, что ваш сайт небезопасен. И на самом деле вы не можете помешать кому-то так проанализировать ваш сайт.

Тем не мение ...

Если вы действительно обеспокоены этим, я бы порекомендовал сделать две вещи:

  1. Выключите красивые постоянные ссылки. Это заставит WPScan и подобные инструменты анализировать содержимое вашего сайта на предмет имен пользователей, а не полагаться на URL.
  2. Заставить пользователей установить другой псевдоним. При отсутствии имени пользователя в URL инструменты сканирования будут искать «сообщения по имени пользователя» в фиде / публикации. Если вы не размещаете имена пользователей там, то они не могут быть захвачены.

Другой альтернативой является изменение вашего автора, постоянная ссылка переписывает. Есть несколько способов сделать это, и вы, вероятно, можете найти несколько на этом сайте .

EAMann
источник
4

Не проверено это полностью, но я думаю, что предпочтительнее удалить базовый ресурс, чем пытаться строить стены вокруг него на уровне веб-сервера. Так что в терминах 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 обратите внимание, что это полностью уничтожит авторские архивы , что может соответствовать или не соответствовать уровню паранойи :)

Rarst
источник
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]

Работает хорошо для нас.

jptsetme
источник
2

Я хотел бы добавить, что вы можете сделать это и на nginx. Проверьте:
» Блокировка перечисления пользователей WordPress на nginx - 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

Et voila, ваши имена пользователей в безопасности [r]!

CFX
источник
0

Я полностью заблокировал перечисление пользователей из WPScan, добавив следующее в 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]

Мое профессиональное мнение как тестера проникновения для государственного агентства ... это ВСЕГДАстоит усложнить перечисление информации о вашем сайте. У немногих из вас будет веб-сайт, который поднимается над Google, сценаристом хакеров-детишек. Мы говорим о многоуровневой безопасности, и с каждым уровнем вы добавляете время и сложность к попытке проникновения. Каждый слой также добавляет набор навыков, требуемый от хакера. На WP есть несколько действительно хороших брандмауэров приложений. Ищите те, которые могут блокировать IP-адреса с повторными попытками входа пользователя или 404. Идея состоит в том, чтобы ваш брандмауэр автоматически блокировал IP-адреса, которые сканируют ваш веб-сайт на наличие страниц, которые не существуют, или пытаются повторно войти на ваш сайт. Хорошая функция также включает возможности блокировки XSS и SQL-инъекций. Подумайте об использовании All In One WP Security от Tips and Tricks HQ, 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 из запроса, поэтому он не будет запрошен.

Если вы используете постоянные ссылки, это оставит автора архивов в такте. Кроме того, если URL будет примерно таким: /dummy?author=1это просто покажет страницу для /dummy.

Благодаря ответу Rarst на этот вопрос и https://perishablepress.com/stop-user-enumeration-wordpress/

leendertvb
источник
0

Я хочу опубликовать свое собственное видение:

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

Первая строка определяет только домашнюю страницу. Я объясню почему. Эта функция «перечисления пользователей» работает только на домашней странице, поэтому нет необходимости переписывать все URL.

Далее мы ищем author=строку запроса. Это очевидно.

Наконец, мы просто показываем исходную страницу без каких-либо блоков, перенаправлений (301, 302) или запретов (403). Разве это не должно действовать как страница с любым другим бесполезным параметром?

vladkras
источник