Publiczny endpoint REST API /wp-json/wp/v2/users
Co to oznacza
WordPress REST API udostępnia endpoint /wp-json/wp/v2/users, który domyślnie zwraca listę użytkowników strony — w tym loginy, wyświetlane nazwy, identyfikatory i linki do profili. Jeśli ten endpoint na Twojej stronie jest publicznie dostępny bez uwierzytelnienia, każdy może pobrać listę kont.
Każdy, kto odwiedzi twojastrona.pl/wp-json/wp/v2/users, otrzyma listę kont w formacie JSON — bez potrzeby logowania.
Jakie jest ryzyko
- Enumeracja użytkowników — atakujący uzyskuje listę prawidłowych loginów. To pierwszy krok do ataku brute-force — zamiast zgadywać login i hasło, wystarczy zgadywać samo hasło.
- Rozpoznanie celów — informacje o kontach administratorów pozwalają precyzyjnie ukierunkować atak na konta z najwyższymi uprawnieniami.
- Automatyzacja ataków — boty rutynowo odpytują ten endpoint, budując bazy loginów WordPress do masowych ataków credential stuffing.
- Wyciek informacji — w odpowiedzi mogą znaleźć się adresy e-mail (w zależności od konfiguracji), opisy użytkowników i adresy URL profili.
Jak to naprawić
- Ogranicz dostęp do endpointu — dodaj filtr w
functions.phplub wtyczce mu-plugins: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; }); - Wymagaj autoryzacji — zamiast usuwać endpoint, ogranicz go do zalogowanych użytkowników:
Uwaga: to zablokuje całe REST API dla niezalogowanych — upewnij się, że nie korzystasz z niego na frontendzie.add_filter('rest_authentication_errors', function($result) { if (!is_user_logged_in()) { return new WP_Error('rest_not_logged_in', 'Dostęp wymaga logowania.', ['status' => 401]); } return $result; }); - Zablokuj na poziomie serwera — jeśli nie korzystasz z REST API publicznie, zablokuj cały endpoint
/wp-json/wp/v2/usersw konfiguracji Nginx/Apache.