
Scanner XSS baseado em Rust com seleção de payload sensível ao contexto, detecção e bypass de WAF, crawling, callbacks de XSS cego e análise estática de sinks no DOM.
Ferramenta avançada de deteção de XSS escrita em Rust, combinando inteligência de payloads sensível ao contexto com a amplitude de injeção.
Esta ferramenta foi inspirada no XSStrike e no XSSER. O payload foi recolhido de diferentes fontes:
Obrigado pessoal, vocês são incríveis ❤️
Aviso: Utilize apenas contra sistemas que possui ou para os quais tem autorização escrita explícita para testar.
<title>, <textarea>, etc.) e seleciona os payloads mais apropriados para esse contexto em vez de disparar tudo cegamenteReferer, User-Agent, X-Forwarded-For, X-Real-IP e outros cabeçalhos, além de valores de cookiesinnerHTML, eval, document.write, location.href, jQuery .html() e outros sinks perigosos com deteção de origemgit clone https://github.com/fabian-affolter/xssearch
cd xssearch
nix-shell --run "cargo build --release"
# binary: target/release/xssearch
Compilação de release com LTO e símbolos removidos:
nix-shell --argstr release true --run "$BUILD"
Requer Rust 1.75+.
cargo build --release
Para utilizadores de Nix ou NixOS existe um pacote disponível. Tenha em conta que as versões mais recentes podem
estar presentes apenas no canal unstable.
nix-env -iA nixos.xssearch
xssearch [OPTIONS] <--url <URL> | --file <URLS_FILE>>
| Flag | Descrição |
|---|---|
-u, --url <URL> | URL alvo. Use FUZZ para marcar um ponto de injeção personalizado |
-f, --file <FILE> | Ficheiro com um URL por linha |
-d, --data <DATA> | Corpo POST. Use FUZZ para marcar o ponto de injeção |
-H, --header <H> | Cabeçalho de pedido extra, repetível |
--cookie <COOKIE> | String de cookie |
--proxy <URL> | Proxy HTTP/HTTPS |
--timeout <N> | Timeout do pedido em segundos (predefinição: 10) |
--user-agent <UA> | User-Agent personalizado |
--follow-redirects | Seguir redirecionamentos HTTP |
--threads <N> | Pedidos concorrentes (predefinição: 2) |
--delay <MS> | Atraso entre pedidos em milissegundos |
--crawl | Rastrear o alvo à procura de links e formulários |
--crawl-depth <N> | Profundidade de rastreio (predefinição: 3) |
--headers-inject | Testar cabeçalhos HTTP comuns como pontos de injeção |
--cookie-inject | Testar valores de cookies como pontos de injeção |
--blind <URL> | URL de callback para Blind XSS |
--dom | Análise estática de sinks DOM XSS |
--fuzz | Disparar todos os payloads independentemente do contexto de reflexão |
--payload-set <SET> | all | html | js | attr | poly | dom | mxss | waf (predefinição: all) |
--payloads-file <FILE> | Ficheiro de payloads personalizado, um por linha |
--encode <LIST> | Codificações separadas por vírgulas: url,html,unicode,double,base64 |
--prefix <STR> | Acrescentar string no início de cada payload |
--suffix <STR> | Acrescentar string no fim de cada payload |
--waf-detect | Identificar WAF antes da análise |
--waf-bypass | Aplicar transformações de bypass de WAF aos payloads |
--output-json <FILE> | Escrever descobertas num ficheiro JSON |
--output-md <FILE> | Escrever descobertas num ficheiro Markdown |
-v, --verbose | Saída detalhada (mostrar contexto, todas as sondagens) |
-V, --version | Imprimir versão e sair |
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
A forma mais rápida de verificar a ferramenta é iniciar localmente um servidor Python intencionalmente vulnerável:
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
Depois analise-o:
xssearch -u "http://127.0.0.1:9999/?q=test" -v
Saída esperada: [Vuln] XSS in 'q' com um payload de contexto HTML.
Estas imagens são criadas especificamente para testes de ferramentas de segurança e não contêm dados reais de utilizadores.
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