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

Categorias