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:
- Username:
j.novak.42x(trudne do odgadnięcia) - Nazwa wyświetlana: Jan Novák (to, co pokazuje się przy artykułach)
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.