Zoznam používateľov WordPressu je verejne dostupný
Čo to je
Endpoint /wp-json/wp/v2/users vracia zoznam všetkých autorov webu — vrátane user_login. Teda presne toho, čo potrebujete na prihlasovacej obrazovke. Navyše aj /?author=1 sa presmeruje na URL obsahujúcu meno autora.
WordPress to robí zámerne — REST API má verejne vystavovať autorov, aby šablóny vedeli, kto článok napísal. Predvolené nastavenie však ukazuje aj username, nie len meno.
Prečo je to problém
Brute-force útok na WordPress má dve polovice: uhádnuť username a uhádnuť heslo. /wp-json/wp/v2/users dá útočníkovi rovno prvú polovicu. Útočník už nehľadá admin, root alebo info, ale rovno cielene útočí na vaše skutočné účty.
Ak máte aktívne XML-RPC alebo nemáte rate-limit na /wp-login.php, je táto dvojica (user enum + brute-force) realistický útok v priebehu niekoľkých hodín.Ako to opraviť
Krok 1 — zakázať REST API users endpoint
Do functions.php alebo do site-specific pluginu:
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 — zablokovať ?author=N redirect
add_action('template_redirect', function () {
if (isset($_GET['author']) && !current_user_can('edit_posts')) {
wp_redirect(home_url(), 301);
exit;
}
});Krok 3 — oddeliť display name od username
Keď už user enum nejako unikne (cache, theme, plugin), nemalo by user_nicename byť totožné s user_login. V administrácii jednotlivých používateľov:
- Username:
j.novak.42x(ťažko uhádnuteľné) - Display name: Jan Novák (to, čo sa ukazuje pri článkoch)
Username vo WordPresse nemožno po vytvorení meniť cez UI. Ak máte admina s menom admin, vytvorte si nového admina, priraďte mu všetky príspevky a starého admin zmažte (WP pri mazaní ponúkne „previesť príspevky“).
Plugin alternatíva
WPS Hide Login + Stop User Enumeration riešia oboje na dve kliknutia.