Lista użytkowników WordPress jest publicznie dostępna

Co to jest

Endpoint /wp-json/wp/v2/users zwraca listę wszystkich autorów witryny — łącznie z user_login. Czyli dokładnie to, czego potrzeba na ekranie logowania. Co więcej, również /?author=1 przekierowuje na adres URL zawierający nazwę autora.

WordPress robi to z założenia — REST API ma publicznie udostępniać autorów, aby szablony wiedziały, kto napisał artykuł. Ale domyślne ustawienia pokazują też username, nie tylko nazwę wyświetlaną.

Dlaczego to problem

Atak brute-force na WordPressa ma dwie połowy: odgadnąć username i odgadnąć hasło. /wp-json/wp/v2/users od razu daje atakującemu pierwszą połowę. Atakujący nie szuka już admin, root czy info, lecz od razu celowo atakuje Twoje prawdziwe konta.

Jeśli masz aktywne XML-RPC albo nie masz rate-limitu na /wp-login.php, to ta para (user enum + brute-force) jest realistycznym atakiem do przeprowadzenia w ciągu kilku godzin.

Jak to naprawić

Krok 1 — wyłączyć endpoint users w REST API

Do functions.php lub do wtyczki specyficznej dla witryny:

add_filter('rest_endpoints', function ($endpoints) {
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
    }
    return $endpoints;
});

Krok 2 — zablokować przekierowanie ?author=N

add_action('template_redirect', function () {
    if (isset($_GET['author']) && !current_user_can('edit_posts')) {
        wp_redirect(home_url(), 301);
        exit;
    }
});

Krok 3 — oddzielić nazwę wyświetlaną od username

Gdy user enum mimo wszystko jakoś wycieknie (cache, motyw, wtyczka), user_nicename nie powinno być identyczne z user_login. W panelu administracyjnym poszczególnych użytkowników:

Nazwy użytkownika (username) w WordPressie nie da się zmienić przez UI po utworzeniu. Jeśli masz admina o nazwie admin, utwórz nowego admina, przypisz mu wszystkie wpisy, a starego admin usuń (WP zaproponuje „przeniesienie wpisów” przy usuwaniu).

Alternatywa z wtyczką

WPS Hide Login + Stop User Enumeration rozwiązują obie kwestie w dwóch kliknięciach.

Źródła