
Scanner XSS basato su Rust con selezione del payload context-aware, rilevamento e bypass del WAF, crawling, callback XSS cieco e analisi statica dei sink DOM.
Strumento avanzato di rilevamento XSS scritto in Rust, che combina l'intelligenza dei payload context-aware con l'ampiezza dell'iniezione.
Questo strumento è stato ispirato da XSStrike e XSSER. I payload sono stati raccolti da diverse fonti:
Grazie ragazzi, siete fantastici ❤️
Attenzione: Utilizzare solo contro sistemi di propria proprietà o per i quali si dispone di esplicita autorizzazione scritta per il test.
<title>, <textarea>, ecc.) e seleziona i payload più appropriati per quel contesto invece di sparare tutto alla ciecaReferer, User-Agent, X-Forwarded-For, X-Real-IP e altri header, oltre ai valori dei cookieinnerHTML, eval, document.write, location.href, jQuery .html() e altri sink pericolosi con rilevamento della sorgentegit clone https://github.com/fabian-affolter/xssearch
cd xssearch
nix-shell --run "cargo build --release"
# binary: target/release/xssearch
Build di release con LTO e simboli rimossi:
nix-shell --argstr release true --run "$BUILD"
Richiede Rust 1.75+.
cargo build --release
Per gli utenti Nix o NixOS è disponibile un pacchetto. Tenere presente che le release più recenti potrebbero
essere presenti solo nel canale unstable.
nix-env -iA nixos.xssearch
xssearch [OPTIONS] <--url <URL> | --file <URLS_FILE>>
| Flag | Descrizione |
|---|---|
-u, --url <URL> | URL di destinazione. Usare FUZZ per marcare un punto di iniezione personalizzato |
-f, --file <FILE> | File con un URL per riga |
-d, --data <DATA> | Corpo POST. Usare FUZZ per marcare il punto di iniezione |
-H, --header <H> | Header di richiesta aggiuntivo, ripetibile |
--cookie <COOKIE> | Stringa cookie |
--proxy <URL> | Proxy HTTP/HTTPS |
--timeout <N> | Timeout della richiesta in secondi (predefinito: 10) |
--user-agent <UA> | User-Agent personalizzato |
--follow-redirects | Segui i redirect HTTP |
--threads <N> | Richieste concorrenti (predefinito: 2) |
--delay <MS> | Ritardo tra le richieste in millisecondi |
--crawl | Esplora la destinazione per link e form |
--crawl-depth <N> | Profondità di scansione (predefinito: 3) |
--headers-inject | Testa gli header HTTP comuni come punti di iniezione |
--cookie-inject | Testa i valori dei cookie come punti di iniezione |
--blind <URL> | URL di callback per Blind XSS |
--dom | Analisi statica dei sink DOM XSS |
--fuzz | Invia tutti i payload indipendentemente dal contesto di riflessione |
--payload-set <SET> | all | html | js | attr | poly | dom | mxss | waf (predefinito: all) |
--payloads-file <FILE> | File di payload personalizzato, uno per riga |
--encode <LIST> | Codifiche separate da virgola: url,html,unicode,double,base64 |
--prefix <STR> | Anteponi una stringa a ogni payload |
--suffix <STR> | Aggiungi una stringa a ogni payload |
--waf-detect | Identifica il WAF prima della scansione |
--waf-bypass | Applica trasformazioni di bypass WAF ai payload |
--output-json <FILE> | Scrivi i risultati in un file JSON |
--output-md <FILE> | Scrivi i risultati in un file Markdown |
-v, --verbose | Output dettagliato (mostra contesto, tutte le sonde) |
-V, --version | Stampa la versione ed esci |
xssearch -u "https://example.com/search?q=test"
xssearch -u "https://example.com/login" -d "user=admin&pass=FUZZ"
xssearch -u "https://example.com/" --crawl --waf-detect --headers-inject -v
xssearch -u "https://example.com/?q=FUZZ" --waf-detect --waf-bypass --encode url,html
xssearch -u "https://example.com/contact" -d "msg=FUZZ" \
--blind "https://abc123.oast.fun/xssearch"
xssearch -u "https://example.com/app" --dom --no-banner
xssearch -u "https://example.com/?q=test" --output-json results.json
xssearch -u "https://example.com/?q=test" --output-md report.md
xssearch -f targets.txt --crawl --waf-detect --output-json results.json --output-md report.md
xssearch -u "https://example.com/?q=test" --proxy http://127.0.0.1:8080 -v
Il modo più rapido per verificare lo strumento è avviare localmente un server Python intenzionalmente vulnerabile:
python3 - <<'EOF'
import http.server, urllib.parse
class H(http.server.BaseHTTPRequestHandler):
def log_message(self, *a): pass
def do_GET(self):
p = urllib.parse.urlparse(self.path)
q = urllib.parse.parse_qs(p.query)
val = q.get('q', [''])[0]
body = f'<html><body><p>Search: {val}</p></body></html>'.encode()
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.end_headers()
self.wfile.write(body)
http.server.HTTPServer(('127.0.0.1', 9999), H).serve_forever()
EOF
Poi scansionarlo:
xssearch -u "http://127.0.0.1:9999/?q=test" -v
Output atteso: [Vuln] XSS in 'q' con un payload in contesto HTML.
Queste immagini sono create appositamente per il test di strumenti di sicurezza e non contengono dati utente reali.
docker run -d -p 8080:80 vulnerables/web-dvwa
# Set security level to Low in the UI first
xssearch -u "http://localhost:8080/vulnerabilities/xss_r/?name=test" \
--cookie "PHPSESSID=<your-session>; security=low"
docker run -d -p 8081:8080 webgoat/goat-and-wolf
xssearch -u "http://localhost:8081/WebGoat/" --crawl --crawl-depth 2 -v
docker run -d -p 3000:3000 bkimminich/juice-shop
xssearch -u "http://localhost:3000/" --crawl --dom -v