
Escáner XSS basado en Rust con selección de payloads consciente del contexto, detección y evasión de WAF, crawling, callbacks de XSS ciego y análisis estático de sinks del DOM.
Herramienta avanzada de detección de XSS escrita en Rust, que combina inteligencia de payloads consciente del contexto con la amplitud de inyección.
Esta herramienta se inspiró en XSStrike y XSSER. El payload fue recolectado de diferentes fuentes:
Gracias chicos, son increíbles ❤️
Advertencia: Úsalo solo contra sistemas que poseas o para los que tengas autorización escrita explícita para probar.
<title>, <textarea>, etc.) y selecciona los payloads más apropiados para ese contexto en lugar de disparar todo a ciegasReferer, User-Agent, X-Forwarded-For, X-Real-IP y otras cabeceras, además de valores de cookiesinnerHTML, eval, document.write, location.href, jQuery .html() y otros sinks peligrosos con detección de origengit clone https://github.com/fabian-affolter/xssearch
cd xssearch
nix-shell --run "cargo build --release"
# binary: target/release/xssearch
Compilación de release con LTO y símbolos eliminados:
nix-shell --argstr release true --run "$BUILD"
Requiere Rust 1.75+.
cargo build --release
Para usuarios de Nix o NixOS hay un paquete disponible. Ten en cuenta que las últimas versiones pueden
estar presentes solo en el canal unstable.
nix-env -iA nixos.xssearch
xssearch [OPTIONS] <--url <URL> | --file <URLS_FILE>>
| Flag | Descripción |
|---|---|
-u, --url <URL> | URL objetivo. Usa FUZZ para marcar un punto de inyección personalizado |
-f, --file <FILE> | Archivo con una URL por línea |
-d, --data <DATA> | Cuerpo POST. Usa FUZZ para marcar el punto de inyección |
-H, --header <H> | Cabecera de solicitud adicional, repetible |
--cookie <COOKIE> | Cadena de cookie |
--proxy <URL> | Proxy HTTP/HTTPS |
--timeout <N> | Tiempo de espera de solicitud en segundos (predeterminado: 10) |
--user-agent <UA> | User-Agent personalizado |
--follow-redirects | Seguir redirecciones HTTP |
--threads <N> | Solicitudes concurrentes (predeterminado: 2) |
--delay <MS> | Retardo entre solicitudes en milisegundos |
--crawl | Rastrear el objetivo en busca de enlaces y formularios |
--crawl-depth <N> | Profundidad de rastreo (predeterminado: 3) |
--headers-inject | Probar cabeceras HTTP comunes como puntos de inyección |
--cookie-inject | Probar valores de cookies como puntos de inyección |
--blind <URL> | URL de callback para Blind XSS |
--dom | Análisis estático de sinks DOM XSS |
--fuzz | Disparar todos los payloads independientemente del contexto de reflexión |
--payload-set <SET> | all | html | js | attr | poly | dom | mxss | waf (predeterminado: all) |
--payloads-file <FILE> | Archivo de payloads personalizado, uno por línea |
--encode <LIST> | Codificaciones separadas por comas: url,html,unicode,double,base64 |
--prefix <STR> | Anteponer cadena a cada payload |
--suffix <STR> | Añadir cadena a cada payload |
--waf-detect | Identificar WAF antes del escaneo |
--waf-bypass | Aplicar transformaciones de bypass de WAF a los payloads |
--output-json <FILE> | Escribir hallazgos en archivo JSON |
--output-md <FILE> | Escribir hallazgos en archivo Markdown |
-v, --verbose | Salida detallada (mostrar contexto, todos los sondeos) |
-V, --version | Imprimir versión y salir |
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
La forma más rápida de verificar la herramienta es levantar localmente un servidor Python intencionalmente vulnerable:
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
Luego escanéalo:
xssearch -u "http://127.0.0.1:9999/?q=test" -v
Salida esperada: [Vuln] XSS in 'q' con un payload de contexto HTML.
Estas imágenes están diseñadas específicamente para probar herramientas de seguridad y no contienen datos reales de usuarios.
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