Salta ai contenuti

Applicazioni

Ogni applicazione viene eseguita come 4 container Docker bilanciati dietro pool upstream nginx, accessibili tramite il proxy inverso nginx sulla VM. Le sessioni sticky garantiscono che le applicazioni stateful (Juice Shop, DVWA, VAmPI, CSD Demo) vengano instradate in modo coerente. Tutte le applicazioni sono intenzionalmente vulnerabili e progettate per i test di sicurezza.

Sostituire <ORIGIN> con http://<PUBLIC_IP> in tutti gli esempi seguenti. Dopo la distribuzione tramite Terraform, ottenere l’IP con terraform output -raw public_ip.

PercorsoApplicazioneMetodo HTTPRisposta attesa
/Pagina di destinazioneGET200 HTML con collegamenti a tutte le app
/healthControllo integritàGET200 JSON {"status":"healthy","component":"origin-server",...}
/juice-shop/Juice ShopGET200 HTML (Angular SPA, ~75 KB)
/juice-shop/rest/products/search?q=API Juice ShopGET200 JSON {"status":"success","data":[...]} (36 prodotti)
/dvwa/DVWAGET302 reindirizzamento a /dvwa/login.php
/dvwa/login.phpLogin DVWAGET200 HTML modulo di accesso
/dvwa/setup.phpConfigurazione DVWAGET200 HTML (inizializzazione database al primo avvio)
/vampi/VAmPIGET200 HTML (documentazione API)
/vampi/users/v1API VAmPIGET200 JSON {"users":[...]}
/vampi/users/v1/registerAPI VAmPIPOST200 JSON {"status":"success",...}
/vampi/users/v1/loginAPI VAmPIPOST200 JSON {"auth_token":"...","status":"success"}
/httpbin/gethttpbinGET200 JSON con dettagli della richiesta
/httpbin/posthttpbinPOST200 JSON con i dati inviati
/httpbin/headershttpbinGET200 JSON {"headers":{...}}
/httpbin/status/:codehttpbinGETRestituisce il codice di stato HTTP specificato
/whoami/whoamiGET200 testo normale con hostname, IP, tutte le intestazioni
/csd-demo/CSD DemoGET200 HTML modulo di pagamento con pannello di attacco
/csd-demo/dashboardVista attaccante CSDGET200 HTML con i dati esfiltrati
/csd-demo/healthIntegrità CSDGET200 JSON {"status":"healthy","component":"csd-demo",...}
/csd-demo/exfil/logLog esfiltrazione CSDGET200 array JSON dei dati acquisiti
/dvga/GraphiQL DVGAGET200 HTML (GraphiQL IDE)
/dvga/graphqlAPI GraphQL DVGAPOST200 JSON risposta GraphQL
/restaurant/RESTaurantGET200 (reindirizzamento alla documentazione)
/restaurant/docsSwagger RESTaurantGET200 HTML (Swagger UI FastAPI)
/restaurant/openapi.jsonOpenAPI RESTaurantGET200 JSON specifiche OpenAPI
http://<PUBLIC_IP>:8888crAPIGET200 HTML (SPA)
http://<PUBLIC_IP>:8888/identity/api/auth/signupRegistrazione crAPIPOST200 JSON
http://<PUBLIC_IP>:8888/identity/api/auth/loginAccesso crAPIPOST200 JSON {"token":"..."}
Percorso/juice-shop/
Immaginebkimminich/juice-shop:latest
Istanze4 (porte 3001-3004), sticky tramite hash $cookie_token, cache proxy (TTL 60 s)
Risorse2 CPU / 1 GiB RAM per istanza
FrameworkNode.js / Angular
Progettoowasp.org/www-project-juice-shop

OWASP Juice Shop è l’applicazione web vulnerabile più moderna e attivamente mantenuta. Copre l’intero OWASP Top 10 con oltre 100 sfide in una realistica applicazione di e-commerce.

ScenarioCategoriaVettore di attacco
Bypass del login tramite SQL InjectionFirewall per applicazioni web (WAF)' OR 1=1-- nel campo email di accesso
XSS riflessoFirewall per applicazioni web (WAF), Difesa lato clientIniezione di script tramite parametro di ricerca
XSS basato su DOMDifesa lato clientPayload nel frammento URL
Autenticazione compromessaFirewall per applicazioni web (WAF)Attacco brute force al login, manipolazione JWT
Abuso APISicurezza APIAccesso non autorizzato agli endpoint /api/
Esposizione di dati sensibiliSicurezza APIAccesso ai dati utente senza autorizzazione
CSRFFirewall per applicazioni web (WAF)Cross-site request forgery sulle modifiche al profilo
Terminal window
curl -s "http://<PUBLIC_IP>/juice-shop/" -o /dev/null -w "%{http_code}"
Percorso/dvwa/
Immaginedvwa-fpm:latest personalizzata (php-fpm + nginx, costruita da ghcr.io/digininja/dvwa:latest)
Istanze4 (porte 8101-8104), sticky tramite hash $cookie_PHPSESSID
Risorse0,5 CPU / 256 MiB RAM per istanza
DatabaseMariaDB 10.11 condiviso (container dvwa-db, 1 CPU / 768 MiB)
FrameworkPHP 8 / php-fpm / MariaDB
Credenzialiadmin / password

DVWA è lo standard del settore per i test WAF. Dispone di livelli di sicurezza regolabili (Basso, Medio, Alto, Impossibile) che aggiungono progressivamente la validazione degli input e la codifica dell’output.

ScenarioCategoriaLivello di sicurezza
SQL InjectionFirewall per applicazioni web (WAF)Basso: banale ' OR 1=1#, Alto: SQLi cieco
Command InjectionFirewall per applicazioni web (WAF)Basso: ; ls, Alto: caratteri filtrati
File InclusionFirewall per applicazioni web (WAF)Basso: path traversal diretto, Alto: sanificato
XSS (Riflesso)Firewall per applicazioni web (WAF), Difesa lato clientBasso: base <script>, Alto: bypass con codifica
XSS (Persistente)Firewall per applicazioni web (WAF), Difesa lato clientBasso: script persistente nel guestbook
Caricamento fileFirewall per applicazioni web (WAF)Basso: caricamento shell PHP, Alto: filtraggio estensioni
Brute ForceDifesa Bot standardTentativi di accesso automatizzati

Impostare il livello di sicurezza su /dvwa/security.php dopo l’accesso:

  • Basso — Nessuna validazione degli input. Ogni attacco funziona. Ideale per le dimostrazioni delle firme WAF.
  • Medio — Filtraggio di base. Alcuni attacchi richiedono tecniche di codifica o bypass.
  • Alto — Filtraggio robusto. Solo le tecniche avanzate hanno successo. Utile per mostrare i limiti del WAF.
  • Impossibile — Implementazione completamente sicura. Dimostra una corretta codifica difensiva.

DVWA richiede una configurazione del database una tantum dopo la prima distribuzione:

  1. Navigare su http://<PUBLIC_IP>/dvwa/setup.php
  2. Fare clic su Create / Reset Database
  3. Accedere con admin / password
Percorso/vampi/
Immagineerev0s/vampi:latest con entrypoint gunicorn (4 worker)
Istanze4 (porte 5101-5104), sticky tramite ip_hash (SQLite per istanza)
Risorse0,5 CPU / 512 MiB RAM per istanza
FrameworkPython / Flask / gunicorn
Progettogithub.com/erev0s/VAmPI

VAmPI è progettato appositamente per testare l’OWASP API Security Top 10. Fornisce una REST API realistica con vulnerabilità deliberate. Ogni istanza esegue gunicorn con 4 worker e il proprio database SQLite. La sessione sticky ip_hash garantisce che la registrazione e il login dallo stesso IP client raggiungano sempre la stessa istanza.

ScenarioOWASP API Top 10Metodo
Broken Object Level Authorization (BOLA)API1Accesso ai dati di altri utenti manipolando gli ID
Autenticazione compromessaAPI2Gestione debole dei token, nessun rate limiting
Esposizione eccessiva dei datiAPI3L’API restituisce più dati di quanti ne abbia bisogno il client
Mass AssignmentAPI6Modifica dei campi admin tramite parametri inattesi
SQL InjectionAPI8Iniezione tramite parametri API
Gestione impropria degli assetAPI9Endpoint API non documentati
Terminal window
# Registrare un nuovo utente
curl -X POST "http://<PUBLIC_IP>/vampi/users/v1/register" \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test123","email":"test@test.com"}'
# Accesso
curl -X POST "http://<PUBLIC_IP>/vampi/users/v1/login" \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test123"}'
# Elenco utenti (esposizione eccessiva dei dati)
curl "http://<PUBLIC_IP>/vampi/users/v1"
Percorso/httpbin/
Immaginekennethreitz/httpbin:latest con override CMD gunicorn (-w 4 -k gevent --timeout 30)
Istanze4 (porte 8201-8204), round-robin (stateless)
Risorse0,5 CPU / 256 MiB RAM per istanza
FrameworkPython / Flask / gunicorn + gevent
Progettohttpbin.org

httpbin è un semplice servizio HTTP di richiesta/risposta utile per demo API di base, test delle intestazioni di richiesta e verifica del comportamento del proxy.

EndpointScopo
/httpbin/getRestituisce i dati della richiesta GET (intestazioni, argomenti, origine)
/httpbin/postRestituisce i dati della richiesta POST (corpo, form, JSON)
/httpbin/headersRestituisce le intestazioni della richiesta
/httpbin/ipRestituisce l’IP di origine
/httpbin/user-agentRestituisce l’intestazione User-Agent
/httpbin/status/:codeRestituisce il codice di stato HTTP specificato
/httpbin/delay/:secondsRitarda la risposta di N secondi
/httpbin/anythingRestituisce qualsiasi cosa passata nella richiesta
Terminal window
# Verificare quali intestazioni vede il server di origine (utile per verificare l'iniezione di intestazioni F5 XC)
curl -s "http://<PUBLIC_IP>/httpbin/headers" | jq .
# Testare un codice di stato HTTP specifico
curl -s -o /dev/null -w "%{http_code}" "http://<PUBLIC_IP>/httpbin/status/403"
Percorso/whoami/
Immaginetraefik/whoami:latest
Istanze4 (porte 8082-8085), round-robin (stateless)
Risorse0,25 CPU / 64 MiB RAM per istanza
FrameworkGo
Progettogithub.com/traefik/whoami

whoami è il server echo HTTP leggero di Traefik. Visualizza ogni dettaglio della richiesta HTTP in entrata come la vede il server di origine — hostname, indirizzi IP, tutte le intestazioni, metodo e URL. Questo è lo strumento diagnostico più importante quando si verifica che F5 XC stia iniettando le intestazioni corrette.

Caso d’usoCosa cercare
Verificare l’iniezione di intestazioni F5 XCIntestazioni X-Forwarded-For, True-Client-IP, X-Volterra-*
Confermare la visibilità dell’IP clientX-Real-IP vs RemoteAddr
Debug dei falsi positivi WAFConfrontare le intestazioni di richiesta prima/dopo F5 XC
Validare il tagging della difesa botIntestazioni X-Volterra-Bot-Type, X-Volterra-Bot-Verified
Verificare la terminazione TLSX-Forwarded-Proto mostra https quando TLS termina su F5 XC
Terminal window
# Richiesta base -- vedere cosa riceve il server di origine
curl "http://<PUBLIC_IP>/whoami/"
# Simulare una richiesta tramite F5 XC (con intestazioni iniettate)
curl "http://<PUBLIC_IP>/whoami/" \
-H "X-Forwarded-For: 203.0.113.50" \
-H "True-Client-IP: 203.0.113.50" \
-H "X-Forwarded-Proto: https"

Esempio di output:

Hostname: 534c5084e169
IP: 127.0.0.1
RemoteAddr: 172.17.0.1:55118
GET / HTTP/1.1
Host: 20.12.78.159
User-Agent: curl/8.5.0
Accept: */*
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Forwarded-Proto: https
X-Real-Ip: 104.219.105.84
Percorso/dvga/
Immaginedolevf/dvga:latest
Istanze4 (porte 5201-5204), sticky tramite ip_hash (SQLite per istanza)
Risorse0,5 CPU / 256 MiB RAM per istanza
FrameworkPython / Flask / GraphQL
Progettogithub.com/dolevf/Damn-Vulnerable-GraphQL-Application

DVGA è progettato appositamente per testare le vulnerabilità specifiche di GraphQL. Fornisce un GraphiQL IDE su /dvga/ per l’esplorazione interattiva delle query e un endpoint API GraphQL su /dvga/graphql. Ogni istanza utilizza il proprio database SQLite, quindi le sessioni sticky ip_hash garantiscono uno stato coerente.

ScenarioCategoriaVettore di attacco
GraphQL InjectionSicurezza APIQuery dannose tramite interpolazione di stringhe
Denial of ServiceSicurezza APIQuery profondamente annidate, query in batch, esaurimento delle risorse
Bypass dell’autorizzazioneSicurezza APIAccesso a dati non autorizzati tramite GraphQL
Divulgazione di informazioniSicurezza APIQuery di introspezione che rivelano i dettagli dello schema
Attacco di batchingSicurezza APIOperazioni multiple in una singola richiesta
Terminal window
# UI GraphiQL (IDE interattivo)
curl -sf "http://<PUBLIC_IP>/dvga/" -o /dev/null -w "%{http_code}"
# Query di introspezione -- enumerare lo schema completo
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"{ __schema { types { name fields { name } } } }"}'
# Elenco paste (query di esempio)
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"{ pastes { title content } }"}'
# Creare una paste (mutation)
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"mutation { createPaste(title:\"test\", content:\"hello\", public:true) { paste { title } } }"}'
Percorso/restaurant/
ImmagineBuild personalizzata da theowni/Damn-Vulnerable-RESTaurant-API-Game
Istanze4 (porte 8301-8304), round-robin (PostgreSQL condiviso)
Risorse0,5 CPU / 256 MiB RAM per istanza
DatabasePostgreSQL 15.4 condiviso (container restaurant-db, 0,5 CPU / 512 MiB)
FrameworkPython / FastAPI / PostgreSQL
Credenzialiadmin / password (PostgreSQL)
Progettogithub.com/theowni/Damn-Vulnerable-RESTaurant-API-Game

RESTaurant è una REST API vulnerabile e gamificata che copre l’OWASP API Security Top 10 2023. Utilizza FastAPI con documentazione Swagger UI automatica su /restaurant/docs. Tutte le 4 istanze condividono un singolo database PostgreSQL, quindi il bilanciamento del carico round-robin funziona senza sessioni sticky.

ScenarioOWASP API Top 10 2023Metodo
Broken Object Level Authorization (BOLA)API1Accesso agli ordini di altri utenti manipolando gli ID
Autenticazione compromessaAPI2Gestione debole dei token, credential stuffing
Broken Object Property Level AuthorizationAPI3Mass assignment sui campi del profilo utente
Consumo illimitato di risorseAPI4Nessun rate limiting sugli endpoint
Broken Function Level Authorization (BFLA)API5Accesso agli endpoint admin come utente normale
Server Side Request Forgery (SSRF)API7Manipolazione delle richieste URL lato server
Configurazione errata della sicurezzaAPI8Messaggi di errore dettagliati, credenziali predefinite
Terminal window
# Swagger UI
curl -sf "http://<PUBLIC_IP>/restaurant/docs" -o /dev/null -w "%{http_code}"
# Specifiche OpenAPI
curl -s "http://<PUBLIC_IP>/restaurant/openapi.json" | jq .info
# BOLA -- accedere all'ordine di un altro utente (dopo l'autenticazione)
curl -s "http://<PUBLIC_IP>/restaurant/orders/1" \
-H "Authorization: Bearer <token>"
# BFLA -- tentare un'azione admin come utente normale
curl -s -X POST "http://<PUBLIC_IP>/restaurant/admin/users" \
-H "Authorization: Bearer <user_token>" \
-H "Content-Type: application/json"
Porta8888 (dedicata — senza prefisso di percorso)
Immaginicrapi/crapi-web, crapi/crapi-identity, crapi/crapi-community, crapi/crapi-workshop, PostgreSQL, MongoDB, MailHog
Istanze7 microservizi (singola istanza ciascuno)
Risorse~3,0 CPU / ~2,0 GiB RAM totali
FrameworkReact SPA + microservizi Java/Go/Python
Progettogithub.com/OWASP/crAPI

crAPI è il progetto principale OWASP per i test di sicurezza delle API. Viene eseguito come 7 microservizi su una porta dedicata (8888) perché la React SPA codifica i propri percorsi API e non può essere servita dietro un prefisso di percorso. Il NSG consente il traffico in entrata sulla porta 8888.

MailHog acquisisce tutte le email inviate da crAPI (verifica account, reimpostazione password). Accedere a MailHog tramite tunnel SSH sulla porta 18025.

CategoriaVulnerabilità
BOLA (Broken Object Level Authorization)Accesso ai veicoli, ordini e report di altri utenti
BFLA (Broken Function Level Authorization)Escalation ad admin, accesso agli endpoint con restrizioni
Mass AssignmentModifica dei campi protetti (ruolo, saldo) tramite API
SSRF (Server Side Request Forgery)Manipolazione del recupero URL lato server
Manipolazione JWTFalsificazione o modifica dei token JWT per l’escalation dei privilegi
NoSQL InjectionIniezione di query negli endpoint basati su MongoDB
Esposizione eccessiva dei datiL’API restituisce dati utente sensibili
Terminal window
# Verificare che crAPI sia in esecuzione
curl -sf "http://<PUBLIC_IP>:8888" -o /dev/null -w "%{http_code}"
# Registrare un nuovo utente
curl -s -X POST "http://<PUBLIC_IP>:8888/identity/api/auth/signup" \
-H "Content-Type: application/json" \
-d '{"name":"Test User","email":"test@example.com","number":"1234567890","password":"Test1234!"}'
# Accedere
curl -s -X POST "http://<PUBLIC_IP>:8888/identity/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"Test1234!"}'
# Accedere a MailHog (tramite tunnel SSH per la verifica email)
# ssh -L 18025:localhost:18025 azureuser@<PUBLIC_IP>
# Quindi aprire http://localhost:18025 nel browser
Port 8888 -> crapi-web (React SPA + nginx)
-> crapi-identity (Java, user auth, JWT)
-> crapi-community (Go, forums, posts)
-> crapi-workshop (Python, vehicle service)
-> crapi-postgres (PostgreSQL)
-> crapi-mongo (MongoDB)
-> crapi-mailhog (email capture, port 18025)
Caso d’uso dimostrativoApp principaleApp secondaria
WAF — SQL InjectionDVWAJuice Shop
WAF — XSSDVWAJuice Shop
WAF — Command InjectionDVWA
Sicurezza API — BOLAVAmPI
Sicurezza API — Bypass autenticazioneVAmPIJuice Shop
Sicurezza API — Esposizione datiVAmPIhttpbin
Difesa Bot — Brute forceDVWAJuice Shop
Difesa Bot — ScrapingJuice Shop
Difesa lato client — DOM XSSJuice Shop
Difesa lato client — XSS persistenteDVWAJuice Shop
Difesa lato client — Card SkimmerCSD Demo
Difesa lato client — FormjackerCSD Demo
Difesa lato client — KeyloggerCSD Demo
Difesa lato client — CryptominerCSD Demo
Difesa lato client — DOM HijackCSD Demo
Sicurezza API — GraphQL injectionDVGA
Sicurezza API — GraphQL DoSDVGA
Sicurezza API — OWASP API Top 10 2023RESTaurantcrAPI
Sicurezza API — BFLARESTaurantcrAPI
Sicurezza API — Mass assignmentcrAPIRESTaurant
Sicurezza API — SSRFcrAPIRESTaurant
Sicurezza API — Manipolazione JWTcrAPI
Sicurezza API — NoSQL injectioncrAPI
Test di connettività di basehttpbin
Diagnostica delle richiestewhoamihttpbin
Verifica dell’iniezione di intestazioniwhoami