
Um coletor e servidor de payload leve para Blind XSS (Cross-Site Scripting) construído com Flask
Um coletor e servidor de payload Blind XSS (Cross-Site Scripting) leve, construído com Flask. Ele serve um payload JavaScript que captura dados do navegador da vítima (cookies, localStorage, trechos do DOM, etc.) e os encaminha para um dashboard com backend SQLite protegido por HTTP Basic Auth.
/p.js serve um payload JS autocontido usando sendBeacon ou fetch/c (JSON/FormData) e GET /c.gif (beacon de pixel compatível com CSP)/events lista os eventos capturados, /events/<id>/view mostra os detalhes completos/payloads oferece 14 variantes de payload XSS além de um editor JS personalizadoADMIN_USER / ADMIN_PASSWORDbxss.db o reconstrói do zeroDockerfile e docker-compose.yml incluídos# 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 (o navegador solicitará 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 (após autenticar) para copiar um payload XSS./events.| Método | Caminho | Descrição |
|---|---|---|
| GET | /p.js | JavaScript do payload XSS |
| POST | /c | Recebe JSON/FormData do payload |
| GET | /c.gif | Pixel beacon (compatível com CSP) |
| Método | Caminho | Descrição |
|---|---|---|
| GET | /events | Últimos 500 eventos |
| GET | /events/<id> | Detalhe do evento em JSON |
| GET | /events/<id>/view | Detalhe do evento em HTML |
| GET/POST | /payloads | Gerador de payload + editor de JS personalizado |
| Método | Caminho | Descrição |
|---|---|---|
| GET | /_healthz | Verificação de integridade |
| Variável | Padrão | Descrição |
|---|---|---|
ADMIN_USER | admin | Nome de usuário do painel |
ADMIN_PASSWORD | (obrigatório) | Senha do painel — a inicialização falha se não for definida |
DB_PATH | ./bxss.db | Caminho do banco de dados SQLite |
PUBLIC_URL | (vazio) | URL base pública para os payloads gerados (use quando estiver atrás de um túnel/proxy reverso; recorre ao host da requisição) |
TRUST_PROXY | (vazio) | Defina 1 para confiar em X-Forwarded-For/CF-Connecting-IP para o IP do cliente (apenas quando atrás de um proxy reverso confiável; necessário nesse caso, ou todos os clientes compartilharão o IP do proxy para limitação de taxa) |
MAX_BODY | 524288 | Tamanho máximo do corpo do coletor (bytes) |
RATE_LIMIT_COUNT | 60 | Máximo de requisições ao coletor por janela (por IP) |
RATE_LIMIT_WINDOW | 60 | Janela de limitação de taxa em segundos |
LOG_LEVEL | INFO | Nível de logging do Python |
O JS personalizado é editado e armazenado pela página de administração
/payloads(persistido na tabelasettingsdo SQLite) e anexado a/p.js. Ele não é mais lido de um arquivo.
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.cookiePayloads:

Resultado:

Detalhe do resultado:

.env nunca deve ser commitado no controle de versão.