
Un leggero collector e server di payload per Blind XSS (Cross-Site Scripting) realizzato con Flask
Un raccoglitore Blind XSS (Cross-Site Scripting) leggero e server di payload costruito con Flask. Serve un payload JavaScript che cattura i dati del browser della vittima (cookie, localStorage, frammenti DOM, ecc.) e li inoltra a una dashboard basata su SQLite protetta da HTTP Basic Auth.
/p.js serve un payload JS autonomo usando sendBeacon o fetch/c (JSON/FormData) e GET /c.gif (pixel beacon compatibile con CSP)/events elenca gli eventi catturati, /events/<id>/view mostra i dettagli completi/payloads offre 14 varianti di payload XSS più un editor JS personalizzatoADMIN_USER / ADMIN_PASSWORDbxss.db viene ricostruito da zeroDockerfile e docker-compose.yml inclusi# Set credentials
echo "ADMIN_USER=admin" > .env
echo "ADMIN_PASSWORD=your-admin-password" >> .env
# Build and run
docker compose up -d --build
Dashboard: http://127.0.0.1:8089/events (il browser richiederà le credenziali Basic Auth)
pip install -r requirements.txt
export ADMIN_USER="admin"
export ADMIN_PASSWORD="your-admin-password"
gunicorn -b 127.0.0.1:8080 --workers 2 --threads 4 wsgi:app
/payloads (dopo l'autenticazione) per copiare un payload XSS./events.| Metodo | Percorso | Descrizione |
|---|---|---|
| GET | /p.js | JavaScript del payload XSS |
| POST | /c | Riceve JSON/FormData dal payload |
| GET | /c.gif | Pixel beacon (compatibile con CSP) |
| Metodo | Percorso | Descrizione |
|---|---|---|
| GET | /events | Ultimi 500 eventi |
| GET | /events/<id> | Dettaglio evento in JSON |
| GET | /events/<id>/view | Dettaglio evento in HTML |
| GET/POST | /payloads | Generatore di payload + editor JS personalizzato |
| Metodo | Percorso | Descrizione |
|---|---|---|
| GET | /_healthz | Controllo di stato |
| Variabile | Predefinito | Descrizione |
|---|---|---|
ADMIN_USER | admin | Nome utente della dashboard |
ADMIN_PASSWORD | changeme | Password della dashboard |
DB_PATH | ./bxss.db | Percorso del database SQLite |
MAX_BODY | 524288 | Dimensione massima del corpo del collector (byte) |
RATE_LIMIT_COUNT | 60 | Numero massimo di richieste al collector per finestra (per IP) |
RATE_LIMIT_WINDOW | 60 | Finestra di rate limit in secondi |
LOG_LEVEL | INFO | Livello di logging Python |
Il JS personalizzato viene modificato e memorizzato tramite la pagina di amministrazione
/payloads(persistito nella tabellasettingsdi SQLite) e aggiunto a/p.js. Non viene più letto da un file.
blindxss-lite/
├── wsgi.py # WSGI entry point
├── requirements.txt # Python dependencies
├── Dockerfile # Container image
├── docker-compose.yml # Compose config
├── .env # Credentials (don't commit)
└── app/
├── __init__.py # App factory, CORS, health check
├── config.py # Config + .env loader
├── db.py # SQLite layer
├── collectors.py # /p.js, /c, /c.gif
├── events.py # /events admin
├── payloads.py # /payloads admin
├── utils.py # Helpers + Basic Auth decorator
├── static/
│ └── style.css
└── templates/
├── events.html
├── event.html
└── payloads.html
document.cookiePayload:

Risultato:

Dettaglio risultato:

.env non dovrebbe mai essere committato nel controllo di versione.