Чи можу я запобігти перерахуванню імен користувачів?


33

Чи можу я запобігти перерахуванню імен користувачів на своєму сайті Wordpress? Наразі я бачу користувачів за допомогою інструменту WPScan.


Я створив плагін, щоб заповнити цю дірку, знайдіть її у плагінах 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наприклад, ...

WPSможе перевірити http://mysite.url/?author=1. Якщо ваш сайт використовує досить постійні посилання, він поверне переспрямування 301 із Locationзаголовком http://mysite.url/author/username. Якщо ваш сайт не використовує досить постійних посилань, він натомість поверне статус 200 (ОК), тож WPScan перевірить канал на рядок "Публікації за ім'ям користувача" та вилучить ім'я користувача.

Що ти можеш зробити

Перш за все, те, що хтось може здогадатися про ваше ім’я користувача, не означає, що ваш сайт небезпечний. І справді немає способу завадити комусь розібратися на вашому веб-сайті таким чином.

Однак ...

Якщо ви справді переймаєтесь цим, я рекомендую зробити дві речі:

  1. Вимкніть досить постійні посилання. Це змусить WPScan та подібні інструменти аналізувати вміст вашого сайту на імена користувачів, а не посилатися на URL-адресу.
  2. Примушуйте користувачів встановлювати іншу псевдонім. За відсутності імені користувача у URL-адресі інструменти сканування шукатимуть "повідомлення за ім'ям користувача" у вмісті каналу / публікації. Якщо ви не розміщуєте імена користувачів там, їх не можна отримати.

Ще одна альтернатива - це зміна вашого автора постійна посилання на переписування. Ви можете це зробити декількома способами, і їх, мабуть, можна знайти і на цьому сайті .


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 Зверніть увагу , що це буде вбивати автор архіви повністю , що може або не може бути відповідним рівнем параної :)


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. Перевірте:
» Блокування переліку користувачів 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]!


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 Injection. Подумайте про використання безпеки в одному WP від ​​підказів 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
  • Коли він знайдеться, він видалить авторську змінну із змін запиту, тому її не буде запитуватися.

Якщо ви використовуєте постійні посилання, це залишить авторські архіви в такті. Крім того, якщо URL буде чимось на зразок: /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). Чи не повинен він діяти як сторінка з будь-яким іншим марним параметром?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.