
Scanner XSS basé sur Rust avec sélection de payloads sensible au contexte, détection et contournement de WAF, crawling, callbacks XSS aveugles et analyse statique des sinks DOM.
Outil avancé de détection de XSS écrit en Rust, combinant une intelligence de payload sensible au contexte avec une largeur d'injection étendue.
Cet outil a été inspiré par XSStrike et XSSER. Les payloads ont été collectés à partir de différentes sources :
Merci les gars, vous êtes géniaux ❤️
Avertissement : À utiliser uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test.
<title>, <textarea>, etc.) et sélectionne les payloads les plus appropriés pour ce contexte plutôt que de tout envoyer aveuglémentReferer, User-Agent, X-Forwarded-For, X-Real-IP et d'autres en-têtes, ainsi que les valeurs de cookiesinnerHTML, eval, document.write, location.href, jQuery .html() et autres sinks dangereux avec détection de sourcegit clone https://github.com/fabian-affolter/xssearch
cd xssearch
nix-shell --run "cargo build --release"
# binary: target/release/xssearch
Build de release avec LTO et symboles supprimés :
nix-shell --argstr release true --run "$BUILD"
Nécessite Rust 1.75+.
cargo build --release
Un paquet est disponible pour les utilisateurs de Nix ou NixOS. Gardez à l'esprit que les dernières versions peuvent n'être présentes que dans le canal unstable.
nix-env -iA nixos.xssearch
xssearch [OPTIONS] <--url <URL> | --file <URLS_FILE>>
| Flag | Description |
|---|---|
-u, --url <URL> | URL cible. Utilisez FUZZ pour marquer un point d'injection personnalisé |
-f, --file <FILE> | Fichier avec une URL par ligne |
-d, --data <DATA> | Corps POST. Utilisez FUZZ pour marquer le point d'injection |
-H, --header <H> | En-tête de requête supplémentaire, répétable |
--cookie <COOKIE> | Chaîne de cookie |
--proxy <URL> | Proxy HTTP/HTTPS |
--timeout <N> | Délai d'attente des requêtes en secondes (par défaut : 10) |
--user-agent <UA> | User-Agent personnalisé |
--follow-redirects | Suivre les redirections HTTP |
--threads <N> | Requêtes concurrentes (par défaut : 2) |
--delay <MS> | Délai entre les requêtes en millisecondes |
--crawl | Explorer la cible pour les liens et formulaires |
--crawl-depth <N> | Profondeur d'exploration (par défaut : 3) |
--headers-inject | Tester les en-têtes HTTP courants comme points d'injection |
--cookie-inject | Tester les valeurs de cookies comme points d'injection |
--blind <URL> | URL de rappel Blind XSS |
--dom | Analyse statique des sinks DOM XSS |
--fuzz | Envoyer tous les payloads indépendamment du contexte de réflexion |
--payload-set <SET> | all | html | js | attr | poly | dom | mxss | waf (par défaut : all) |
--payloads-file <FILE> | Fichier de payloads personnalisé, un par ligne |
--encode <LIST> | Encodages séparés par des virgules : url,html,unicode,double,base64 |
--prefix <STR> | Chaîne à ajouter au début de chaque payload |
--suffix <STR> | Chaîne à ajouter à la fin de chaque payload |
--waf-detect | Identifier le WAF avant le scan |
--waf-bypass | Appliquer les transformations de contournement de WAF aux payloads |
--output-json <FILE> | Écrire les résultats dans un fichier JSON |
--output-md <FILE> | Écrire les résultats dans un fichier Markdown |
-v, --verbose | Sortie verbeuse (afficher le contexte, toutes les sondes) |
-V, --version | Afficher la version et quitter |
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
Le moyen le plus rapide de vérifier l'outil est de lancer localement un serveur Python intentionnellement vulnérable :
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
Puis scannez-le :
xssearch -u "http://127.0.0.1:9999/?q=test" -v
Sortie attendue : [Vuln] XSS in 'q' avec un payload de contexte HTML.
Ces images sont conçues spécifiquement pour tester des outils de sécurité et ne contiennent aucune donnée utilisateur réelle.