Voltar às atualizações
New releaseJul 28, 2026

ffuf v2.2.1

Fuzzer web rápido escrito em Go

Compartilhar

ffuf mascot

ffuf - Fuzz mais rápido, seu tolo

Um fuzzer web rápido escrito em Go.

Instalação

  • Baixe um binário pré-compilado na página de releases, descompacte e execute!

    ou

  • Se você estiver no Windows com o Scoop, o ffuf pode ser instalado com: scoop install ffuf

    ou

  • Se você estiver no Windows com o Winget, o ffuf pode ser instalado com: winget install ffuf.ffuf

    ou

  • Se você estiver no macOS com o homebrew, o ffuf pode ser instalado com: brew install ffuf

    ou

  • Se você tiver um compilador Go recente instalado: go install github.com/ffuf/ffuf/v2@latest (o mesmo comando serve para atualizar)

    ou

  • git clone https://github.com/ffuf/ffuf ; cd ffuf ; go get ; go build

  1. O ffuf depende do Go 1.20 ou superior.
  2. Uma compilação Go a partir de um checkout mostra git-<date>-<commit> em vez da tag. Uma compilação local não é uma versão oficial, mesmo quando você está sobre uma tag, e as informações de compilação embutidas do Go nos dão o commit, mas não o nome da tag — por isso exibimos o commit exato a partir do qual foi compilado. Os binários versionados oficiais são os da página de releases.

Exemplo de uso

Os exemplos de uso abaixo mostram apenas as tarefas mais simples que você pode realizar usando o ffuf.

Uma documentação mais elaborada, que aborda muitos recursos com vários exemplos, está disponível no wiki do ffuf em https://github.com/ffuf/ffuf/wiki

Para uma documentação mais extensa, com exemplos de uso reais e dicas, não deixe de conferir o incrível guia: "Everything you need to know about FFUF" de Michael Skelton (@codingo).

Você também pode praticar suas varreduras de ffuf contra um host ao vivo com diferentes lições e casos de uso, seja localmente usando o contêiner docker https://github.com/adamtlangley/ffufme ou contra a versão hospedada em http://ffuf.me criada por Adam Langley @adamtlangley.

Descoberta típica de diretórios

asciicast

Usando a palavra-chave FUZZ no final da URL (-u):

ffuf -w /path/to/wordlist -u https://target/FUZZ

Descoberta de host virtual (sem registros DNS)

asciicast

Supondo que o tamanho padrão da resposta do virtualhost seja 4242 bytes, podemos filtrar todas as respostas com esse tamanho (-fs 4242) enquanto fazemos fuzzing no cabeçalho Host:

ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ" -fs 4242

Fuzzing de parâmetros GET

O fuzzing de nomes de parâmetros GET é muito semelhante à descoberta de diretórios e funciona definindo a palavra-chave FUZZ como parte da URL. Isso também assume um tamanho de resposta de 4242 bytes para um nome de parâmetro GET inválido.

ffuf -w /path/to/paramnames.txt -u https://target/script.php?FUZZ=test_value -fs 4242

Se o nome do parâmetro for conhecido, os valores podem ser alvo de fuzzing da mesma forma. Este exemplo assume um valor de parâmetro incorreto retornando o código de resposta HTTP 401.

ffuf -w /path/to/values.txt -u https://target/script.php?valid_name=FUZZ -fc 401

Fuzzing de dados POST

Esta é uma operação muito direta, novamente usando a palavra-chave FUZZ. Este exemplo faz fuzzing apenas em parte da requisição POST. Estamos filtrando novamente as respostas 401.

ffuf -w /path/to/postdata.txt -X POST -d "username=admin\&password=FUZZ" -u https://target/login.php -fc 401

Tempo máximo de execução

Se você não quiser que o ffuf execute indefinidamente, use o -maxtime. Isso interrompe todo o processo após um determinado tempo (em segundos).

ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime 60

Ao trabalhar com recursão, você pode controlar o maxtime por job usando -maxtime-job. Isso interrompe o job atual após um determinado tempo (em segundos) e continua com o próximo. Novos jobs são criados quando a funcionalidade de recursão detecta um subdiretório.

ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime-job 60 -recursion -recursion-depth 2

Também é possível combinar ambas as flags, limitando o tempo máximo de execução por job e o tempo total de execução. Se você não usar recursão, ambas as flags se comportam da mesma forma.

Usando um mutador externo para gerar casos de teste

Para este exemplo, faremos fuzzing de dados JSON enviados via POST. O Radamsa é usado como mutador.

Quando --input-cmd é usado, o ffuf exibe as correspondências pela sua posição. Esse mesmo valor de posição estará disponível para o chamador como uma variável de ambiente $FFUF_NUM. Usaremos esse valor de posição como semente para o mutador. Os arquivos example1.txt e example2.txt contêm payloads JSON válidos. Estamos correspondendo todas as respostas, mas filtrando o código de resposta 400 - Bad request:

ffuf --input-cmd 'radamsa --seed $FFUF_NUM example1.txt example2.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/FUZZ -mc all -fc 400

É claro que não é muito eficiente chamar o mutador para cada payload, então também podemos pré-gerar os payloads, ainda usando o Radamsa como exemplo:

# Generate 1000 example payloads
radamsa -n 1000 -o %n.txt example1.txt example2.txt

# This results into files 1.txt ... 1000.txt
# Now we can just read the payload data in a loop from file for ffuf

ffuf --input-cmd 'cat $FFUF_NUM.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/ -mc all -fc 400

Arquivos de configuração

Ao executar o ffuf, ele primeiro verifica se existe um arquivo de configuração padrão. O caminho padrão para um arquivo ffufrc é $XDG_CONFIG_HOME/ffuf/ffufrc. Você pode configurar uma ou várias opções neste arquivo, e elas serão aplicadas em todos os jobs subsequentes do ffuf. Um exemplo de arquivo ffufrc pode ser encontrado aqui.

Uma descrição mais detalhada sobre os locais dos arquivos de configuração pode ser encontrada no wiki: https://github.com/ffuf/ffuf/wiki/Configuration

As opções de configuração fornecidas na linha de comando substituem as carregadas do arquivo ffufrc padrão. Nota: isso não se aplica a flags de CLI que podem ser fornecidas mais de uma vez. Um desses exemplos é a flag -H (header). Nesse caso, os valores de -H fornecidos na linha de comando serão adicionados aos do arquivo de configuração.

Além disso, caso você queira usar vários arquivos de configuração para diferentes casos de uso, você pode fazer isso definindo o caminho do arquivo de configuração usando a flag de linha de comando -config, que recebe o caminho do arquivo de configuração como parâmetro.

Uso

Para definir o caso de teste para o ffuf, use a palavra-chave FUZZ em qualquer lugar na URL (-u), cabeçalhos (-H) ou dados POST (-d).

Fuzz Faster U Fool - v2.1.0

HTTP OPTIONS:
  -H                  Header `"Name: Value"`, separated by colon. Multiple -H flags are accepted.
  -X                  HTTP method to use
  -b                  Cookie data `"NAME1=VALUE1; NAME2=VALUE2"` for copy as curl functionality.
  -cc                 Client cert for authentication. Client key needs to be defined as well for this to work
  -ck                 Client key for authentication. Client certificate needs to be defined as well for this to work
  -d                  POST data
  -http2              Use HTTP2 protocol (default: false)
  -ignore-body        Do not fetch the response content. (default: false)
  -r                  Follow redirects (default: false)
  -raw                Do not encode URI (default: false)
  -recursion          Scan recursively. Only FUZZ keyword is supported, and URL (-u) has to end in it. (default: false)
  -recursion-depth    Maximum recursion depth. (default: 0)
  -recursion-strategy Recursion strategy: "default" for a redirect based, and "greedy" to recurse on all matches (default: default)
  -replay-proxy       Replay matched requests using this proxy.
  -sni                Target TLS SNI, does not support FUZZ keyword
  -timeout            HTTP request timeout in seconds. (default: 10)
  -u                  Target URL
  -x                  Proxy URL (SOCKS5 or HTTP). For example: http://127.0.0.1:8080 or socks5://127.0.0.1:8080

GENERAL OPTIONS:
  -V                  Show version information. (default: false)
  -ac                 Automatically calibrate filtering options (default: false)
  -acc                Custom auto-calibration string. Can be used multiple times. Implies -ac
  -ach                Per host autocalibration (default: false)
  -ack                Autocalibration keyword (default: FUZZ)
  -acs                Custom auto-calibration strategies. Can be used multiple times. Implies -ac
  -c                  Colorize output. (default: false)
  -config             Load configuration from a file
  -json               JSON output, printing newline-delimited JSON records (default: false)
  -maxtime            Maximum running time in seconds for entire process. (default: 0)
  -maxtime-job        Maximum running time in seconds per job. (default: 0)
  -noninteractive     Disable the interactive console functionality (default: false)
  -p                  Seconds of `delay` between requests, or a range of random delay. For example "0.1" or "0.1-2.0"
  -rate               Rate of requests per second (default: 0)
  -s                  Do not print additional information (silent mode) (default: false)
  -sa                 Stop on all error cases. Implies -sf and -se. (default: false)
  -scraperfile        Custom scraper file path
  -scrapers           Active scraper groups (default: all)
  -se                 Stop on spurious errors (default: false)
  -search             Search for a FFUFHASH payload from ffuf history
  -sf                 Stop when > 95% of responses return 403 Forbidden (default: false)
  -t                  Number of concurrent threads. (default: 40)
  -v                  Verbose output, printing full URL and redirect location (if any) with the results. (default: false)

MATCHER OPTIONS:
  -mc                 Match HTTP status codes, or "all" for everything. (default: 200-299,301,302,307,401,403,405,500)
  -ml                 Match amount of lines in response
  -mmode              Matcher set operator. Either of: and, or (default: or)
  -mr                 Match regexp
  -ms                 Match HTTP response size
  -mt                 Match how many milliseconds to the first response byte, either greater or less than. EG: >100 or <100
  -mw                 Match amount of words in response

FILTER OPTIONS:
  -fc                 Filter HTTP status codes from response. Comma separated list of codes and ranges
  -fl                 Filter by amount of lines in response. Comma separated list of line counts and ranges
  -fmode              Filter set operator. Either of: and, or (default: or)
  -fr                 Filter regexp
  -fs                 Filter HTTP response size. Comma separated list of sizes and ranges
  -ft                 Filter by number of milliseconds to the first response byte, either greater or less than. EG: >100 or <100
  -fw                 Filter by amount of words in response. Comma separated list of word counts and ranges

INPUT OPTIONS:
  -D                  DirSearch wordlist compatibility mode. Used in conjunction with -e flag. (default: false)
  -e                  Comma separated list of extensions. Extends FUZZ keyword.
  -enc                Encoders for keywords, eg. 'FUZZ:urlencode b64encode'
  -ic                 Ignore wordlist comments (default: false)
  -input-cmd          Command producing the input. --input-num is required when using this input method. Overrides -w.
  -input-num          Number of inputs to test. Used in conjunction with --input-cmd. (default: 100)
  -input-shell        Shell to be used for running command
  -mode               Multi-wordlist operation mode. Available modes: clusterbomb, pitchfork, sniper (default: clusterbomb)
  -request            File containing the raw http request
  -request-proto      Protocol to use along with raw request (default: https)
  -w                  Wordlist file path and (optional) keyword separated by colon. eg. '/path/to/wordlist:KEYWORD'

OUTPUT OPTIONS:
  -debug-log          Write all of the internal logging to the specified file.
  -o                  Write output to file
  -od                 Directory path to store matched results to.
  -of                 Output file format. Available formats: json, ejson, html, md, csv, ecsv (or, 'all' for all formats) (default: json)
  -or                 Don't create the output file if we don't have results (default: false)

EXAMPLE USAGE:
  Fuzz file paths from wordlist.txt, match all responses but filter out those with content-size 42.
  Colored, verbose output.
    ffuf -w wordlist.txt -u https://example.org/FUZZ -mc all -fs 42 -c -v

  Fuzz Host-header, match HTTP 200 responses.
    ffuf -w hosts.txt -u https://example.org/ -H "Host: FUZZ" -mc 200

  Fuzz POST JSON data. Match all responses not containing text "error".
    ffuf -w entries.txt -u https://example.org/ -X POST -H "Content-Type: application/json" \
      -d '{"name": "FUZZ", "anotherkey": "anothervalue"}' -fr "error"

  Fuzz multiple locations. Match only responses reflecting the value of "VAL" keyword. Colored.
    ffuf -w params.txt:PARAM -w values.txt:VAL -u https://example.org/?PARAM=VAL -mr "VAL" -c

  More information and examples: https://github.com/ffuf/ffuf

Modo interativo

Ao pressionar ENTER durante a execução do ffuf, o processo é pausado e o usuário é levado a um modo interativo semelhante a um shell:

entering interactive mode
type "help" for a list of commands, or ENTER to resume.
> help

available commands:
 afc  [value]             - append to status code filter 
 fc   [value]             - (re)configure status code filter 
 afl  [value]             - append to line count filter 
 fl   [value]             - (re)configure line count filter 
 afw  [value]             - append to word count filter 
 fw   [value]             - (re)configure word count filter 
 afs  [value]             - append to size filter 
 fs   [value]             - (re)configure size filter 
 aft  [value]             - append to time filter 
 ft   [value]             - (re)configure time filter 
 rate [value]             - adjust rate of requests per second (active: 0)
 queueshow                - show job queue
 queuedel [number]        - delete a job in the queue
 queueskip                - advance to the next queued job
 restart                  - restart and resume the current ffuf job
 resume                   - resume current ffuf job (or: ENTER) 
 show                     - show results for the current job
 savejson [filename]      - save current matches to a file
 help                     - you are looking at it
> 

neste modo, os filtros podem ser reconfigurados, a fila gerenciada e o estado atual salvo em disco.

Ao (re)configurar os filtros, eles são aplicados retroativamente e todas as correspondências falso-positivas da memória que teriam sido filtradas pelos filtros recém-adicionados são excluídas.

O novo estado das correspondências pode ser exibido com o comando show, que imprime todas as correspondências como se tivessem sido encontradas pelo ffuf.

Como as correspondências "negativas" não são armazenadas na memória, afrouxar os filtros infelizmente não pode trazer de volta as correspondências perdidas. Para esse tipo de cenário, o usuário pode usar o comando restart, que redefine o estado e inicia o job atual do início.

Contribuindo

Relatórios de bugs, solicitações de recursos e pull requests são bem-vindos. Consulte CONTRIBUTING.md para começar e a seção Contributing do wiki para a documentação de arquitetura e testes.

Licença

O ffuf é distribuído sob a licença MIT. Consulte LICENSE.

Categorias