Czy mogę zapobiec wyliczaniu nazw użytkowników?

33

Czy mogę zapobiec wyliczaniu nazw użytkowników w mojej witrynie Wordpress? W tej chwili widzę użytkowników za pomocą narzędzia WPScan.

urok93
źródło
Stworzyłem wtyczkę, aby wypełnić tę dziurę, znajdź ją na Wordpress Plugins tutaj: wordpress.org/plugins/stop-user-enumeration
user2412827,

Odpowiedzi:

26

Proste rozwiązanie, którego używam w .htaccess:

RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]

Jest podobny do odpowiedzi @ jptsetme, ale działa nawet wtedy, gdy ciąg zapytania jest /?dummy&author=5, a wzorzec wyszukiwania RewriteRulejest bardzo szybki: w tym celu często pojawia się przechwycenie ([0-9]*)wyrażeń regularnych. Ale nie musisz marnować pamięci na przechwytywanie, gdy nie używasz przechwyconego wyrażenia, a dopasowanie pierwszego znaku jest wystarczające, ponieważ nie chcesz akceptować author=1b.

Aktualizacja 20.04.2017

Widzę więcej „zepsutych” próśb od osób, które są nawet zbyt głupie, aby przeprowadzić prosty skan. Żądane adresy URL wyglądają następująco:

/?author={num:2}

Możesz więc rozszerzyć powyższą regułę na:

RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num 
RewriteRule ^ - [L,R=403]
fuxia
źródło
13

Nie możesz

Narzędzie WPScan to zautomatyzowane narzędzie, które korzysta z przyjaznych adresów URL WordPress do określania nazw użytkowników. Przeszukuje pierwszych 10 możliwych identyfikatorów autorów i sprawdza Locationnagłówek odpowiedzi HTTP, aby znaleźć nazwę użytkownika.

Używam http://mysite.urlna przykład ...

WPScan sprawdzi http://mysite.url/?author=1. Jeśli twoja strona używa ładnych bezpośrednich linków, zwróci przekierowanie 301 z Locationnagłówkiemhttp://mysite.url/author/username . Jeśli twoja strona nie używa ładnych bezpośrednich linków, zwróci zamiast tego stan 200 (OK), więc WPScan sprawdzi kanał w poszukiwaniu ciągu „posty według nazwy użytkownika” i wyodrębni nazwę użytkownika.

Co możesz zrobić

Przede wszystkim to, że ktoś może odgadnąć twoją nazwę użytkownika, nie oznacza, że ​​twoja strona jest niepewna. I tak naprawdę nie ma sposobu, aby uniemożliwić komuś parsowanie Twojej witryny w taki sposób.

Jednak ...

Jeśli naprawdę się tym martwisz, zaleciłbym zrobienie dwóch rzeczy:

  1. Wyłącz ładne permalinki. Zmusi to WPScan i podobne narzędzia do analizowania zawartości witryny pod kątem nazw użytkowników zamiast polegania na adresie URL.
  2. Zmuś użytkowników do ustawienia innego pseudonimu. W przypadku braku nazwy użytkownika w adresie URL narzędzia skanujące będą wyszukiwać „posty według nazwy użytkownika” w treści kanału / treści postu. Jeśli nie podajesz tam nazw użytkowników, nie można ich zdobyć.

Inną alternatywą jest zmiana przepisywania przez autora linku bezpośredniego. Można to zrobić na kilka sposobów, a prawdopodobnie można znaleźć również kilka na tej stronie .

EAMann
źródło
4

Nie przetestowałem tego dokładnie, ale myślę, że lepiej jest usunąć podstawowy zasób niż próbować budować wokół niego ściany na poziomie serwera WWW. Tak więc, w terminologii WP, to powstrzymałoby go od przetwarzania zmiennych zapytań związanych z autorami.

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 zauważa, że ​​to całkowicie zabije archiwa autora , co może, ale nie musi być odpowiednim poziomem paranoi :)

Rarst
źródło
3

Możesz użyć reguły przepisywania .htaccess, aby zapobiec ujawnieniu, ale powinieneś również używać pseudonimów, aby uniknąć ujawniania nazw użytkowników w parsowanej treści, jak opisano w EAMann.

Poniższy blog opisuje, jak to zrobić, ale ma literówkę w regule przepisywania: http://www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking

Prawidłowa reguła powinna również usunąć ciąg zapytania z przepisanego adresu URL, w przeciwnym razie nadal ujawnisz nazwę użytkownika. To powinno wyglądać tak:

# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI}  ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]

Pracuje dla nas dobrze.

jptsetme
źródło
2

Chciałem dodać, że możesz to zrobić również na Nginxie. Sprawdź:
» Blokowanie wyliczania użytkowników WordPress na nginx - www.edwidget.name

Na marginesie chciałem zapobiec wyliczaniu nazw użytkowników w mojej witrynie hostowanej z WP Engine, która ogranicza dostęp użytkowników do plików konfiguracyjnych nginx niskiego poziomu. Mają jednak sekcję „Reguły przekierowania” w panelu sterowania, która pozwala to osiągnąć. Po pewnym czasie udało mi się wymyślić najlepszą konfigurację:

Redirect Name: // choose a description for the rewrite
Domain: // you *must* select a domain; "All Domains" will *not* work here!
Source: ^/$
Destination: /?

Następnie musisz pokazać Advanced Settingspanel ...

Match args: author=([0-9]*)
Rewrite type: 301 Permanent

Et voila, twoje nazwy użytkownika są bezpieczne [r]!

por
źródło
0

Całkowicie zablokowałem wyliczanie użytkowników z WPScan, dodając następujące elementy w 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]

Moja profesjonalna opinia jako testera penetracji dla rządowej agencji ... ZAWSZEwarto utrudnić wyliczenie informacji o Twojej witrynie. Niewielu z was ma stronę internetową, która wznosi się ponad google, skrypt hakerów kiddie. Mówimy o bezpieczeństwie warstwowym, a każda warstwa dodaje czasu i złożoności do próby penetracji. Każda warstwa dodaje również do zestawu umiejętności wymaganych od hakera. Na WP dostępnych jest kilka naprawdę dobrych zapór sieciowych. Poszukaj takich, które mogą blokować adresy IP, które powtórzyły próby logowania użytkownika lub 404. Chodzi o to, aby zapora sieciowa automatycznie blokowała adresy IP, które skanują witrynę w poszukiwaniu stron, które nie istnieją lub próbują wielokrotnie logować się na Twojej stronie. Dobra funkcja obejmuje także blokowanie XSS i SQL Injection. Rozważ użycie All In One WP Security od Tips and Tricks HQ, Peter, Ruhul, Ivy.

Walter
źródło
0

Zamiast .htaccesstrasy inną alternatywą jest dodanie następującego kodu do motywu dziecka 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;
    }
}

Ponadto możesz zmienić domyślne linki autora, które są dodawane do nazwy użytkownika każdej strony, na coś innego (na przykład stronę główną), używając następujących czynności:

# 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();
}
Ethan Jinks O'Sullivan
źródło
0

Wiem, że to stary post, ale do przyszłych referencji chciałbym również dodać moje rozwiązanie. Jest to tylko fragment kodu, który można umieścić w functions.phptemacie. Zostawi wszystko na swoim miejscu i działa, nawet archiwa autora, ale zabija złe żądania wyliczeń.

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;
}

Co to robi:

  • skanuje adres URL w poszukiwaniu czegoś takiego jak: author=1
  • Po znalezieniu usunie zmienną autora z zmiennych zapytań, aby nie była odpytywana.

Jeśli użyjesz permalinków, archiwa autora pozostaną taktowne. Ponadto, jeśli adres URL będzie podobny: /dummy?author=1wyświetli się strona dla /dummy.

Dzięki odpowiedzi Rarsta na to pytanie oraz https://perishablepress.com/stop-user-enumeration-wordpress/

leendertvb
źródło
0

Chcę opublikować własną wizję:

RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule (.*) $1? [L]

Pierwszy wiersz wykrywa tylko stronę główną. Wyjaśnię dlaczego. Ta funkcja „wyliczania użytkowników” działa tylko na stronie głównej, więc nie trzeba przepisywać wszystkich adresów URL.

Następnie szukamy author= zapytania. To oczywiste.

Na koniec pokazujemy tylko oryginalną stronę bez bloków, przekierowań (301, 302) lub zakazów (403). Czy nie powinno to działać jak strona z jakimkolwiek innym bezużytecznym parametrem?

Vladkras
źródło