
Rust-basierter XSS-Scanner mit kontextabhängiger Payload-Auswahl, WAF-Erkennung und -Umgehung, Crawling, Blind-XSS-Callbacks und statischer DOM-Sink-Analyse.
Fortgeschrittenes XSS-Erkennungstool, geschrieben in Rust, das kontextbewusste Payload-Intelligenz mit der Injektionsbreite kombiniert.
Dieses Tool wurde von XSStrike und XSSER inspiriert. Die Payloads wurden aus verschiedenen Quellen gesammelt:
Danke Leute, ihr seid großartig ❤️
Warnung: Nur gegen Systeme verwenden, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben.
<title>, <textarea> usw.) und wählt die für diesen Kontext am besten geeigneten Payloads aus, anstatt blind alles abzufeuernReferer, User-Agent, X-Forwarded-For, X-Real-IP und andere Header sowie Cookie-WerteinnerHTML, eval, document.write, location.href, jQuery .html() und anderen gefährlichen Sinks mit Quellenerkennunggit clone https://github.com/fabian-affolter/xssearch
cd xssearch
nix-shell --run "cargo build --release"
# binary: target/release/xssearch
Release-Build mit LTO und entfernten Symbolen:
nix-shell --argstr release true --run "$BUILD"
Erfordert Rust 1.75+.
cargo build --release
Für Nix- oder NixOS-Nutzer ist ein Paket verfügbar. Beachten Sie, dass die neuesten Releases möglicherweise nur
im unstable-Kanal vorhanden sind.
nix-env -iA nixos.xssearch
xssearch [OPTIONS] <--url <URL> | --file <URLS_FILE>>
| Flag | Beschreibung |
|---|---|
-u, --url <URL> | Ziel-URL. Verwenden Sie FUZZ, um einen benutzerdefinierten Injektionspunkt zu markieren |
-f, --file <FILE> | Datei mit einer URL pro Zeile |
-d, --data <DATA> | POST-Body. Verwenden Sie FUZZ, um den Injektionspunkt zu markieren |
-H, --header <H> | Zusätzlicher Request-Header, wiederholbar |
--cookie <COOKIE> | Cookie-String |
--proxy <URL> | HTTP/HTTPS-Proxy |
--timeout <N> | Request-Timeout in Sekunden (Standard: 10) |
--user-agent <UA> | Benutzerdefinierter User-Agent |
--follow-redirects | HTTP-Redirects folgen |
--threads <N> | Gleichzeitige Requests (Standard: 2) |
--delay <MS> | Verzögerung zwischen Requests in Millisekunden |
--crawl | Ziel nach Links und Formularen durchsuchen |
--crawl-depth <N> | Crawl-Tiefe (Standard: 3) |
--headers-inject | Gängige HTTP-Header als Injektionspunkte testen |
--cookie-inject | Cookie-Werte als Injektionspunkte testen |
--blind <URL> | Blind-XSS-Callback-URL |
--dom | Statische DOM-XSS-Sink-Analyse |
--fuzz | Alle Payloads abfeuern, unabhängig vom Reflexionskontext |
--payload-set <SET> | all | html | js | attr | poly | dom | mxss | waf (Standard: all) |
--payloads-file <FILE> | Benutzerdefinierte Payload-Datei, eine pro Zeile |
--encode <LIST> | Kommagetrennte Kodierungen: url,html,unicode,double,base64 |
--prefix <STR> | String jedem Payload voranstellen |
--suffix <STR> | String an jeden Payload anhängen |
--waf-detect | WAF vor dem Scannen per Fingerprint identifizieren |
--waf-bypass | WAF-Bypass-Transformationen auf Payloads anwenden |
--output-json <FILE> | Ergebnisse in JSON-Datei schreiben |
--output-md <FILE> | Ergebnisse in Markdown-Datei schreiben |
-v, --verbose | Ausführliche Ausgabe (Kontext anzeigen, alle Sonden) |
-V, --version | Version ausgeben und beenden |
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
Der schnellste Weg, das Tool zu verifizieren, ist, lokal einen absichtlich verwundbaren Python-Server hochzufahren:
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
Dann scannen Sie es:
xssearch -u "http://127.0.0.1:9999/?q=test" -v
Erwartete Ausgabe: [Vuln] XSS in 'q' mit einem HTML-Kontext-Payload.
Diese Images sind speziell für das Testen von Sicherheitstools entwickelt und enthalten keine echten Benutzerdaten.
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