Назад к обновлениям
New releaseJul 28, 2026

ffuf v2.2.1

Быстрый веб-фаззер, написанный на Go

Поделиться

маскот ffuf

ffuf - Фаззь быстрее, дурак!

Быстрый веб-фаззер, написанный на Go.

Установка

  • Скачайте готовый бинарный файл со страницы релизов, распакуйте и запускайте!

    или

  • Если вы на Windows и используете Scoop, ffuf можно установить с помощью: scoop install ffuf

    или

  • Если вы на Windows и используете Winget, ffuf можно установить с помощью: winget install ffuf.ffuf

    или

  • Если вы на macOS и используете homebrew, ffuf можно установить с помощью: brew install ffuf

    или

  • Если у вас установлен свежий компилятор Go: go install github.com/ffuf/ffuf/v2@latest (эта же команда работает и для обновления)

    или

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

  1. Ffuf требует Go 1.20 или новее.
  2. Сборка go из чекаута показывает git-<date>-<commit> вместо тега. Локальная сборка не является официальным релизом, даже если вы находитесь на теге; встроенная в Go информация о сборке содержит коммит, но не имя тега — поэтому мы показываем точный коммит, из которого была выполнена сборка. Авторитетными версионированными бинарными файлами являются те, что находятся на странице релизов.

Примеры использования

Примеры использования ниже демонстрируют лишь простейшие задачи, которые можно выполнить с помощью ffuf.

Более подробная документация, охватывающая множество функций с большим количеством примеров, доступна в вики ffuf по адресу https://github.com/ffuf/ffuf/wiki

За более обширной документацией с примерами из реальной жизни и советами обязательно загляните в отличное руководство: «Everything you need to know about FFUF» от Майкла Скелтона (@codingo).

Вы также можете потренироваться в сканировании ffuf против живого хоста с разными уроками и сценариями использования: либо локально, используя docker-контейнер https://github.com/adamtlangley/ffufme, либо против живой размещённой версии на http://ffuf.me, созданной Адамом Лэнгли @adamtlangley.

Типичное обнаружение директорий

asciicast

Используя ключевое слово FUZZ в конце URL (-u):

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

Обнаружение виртуальных хостов (без DNS-записей)

asciicast

Предполагая, что размер ответа виртуального хоста по умолчанию составляет 4242 байта, мы можем отфильтровать все ответы такого размера (-fs 4242), фаззя заголовок Host:

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

Фаззинг GET-параметров

Фаззинг имён GET-параметров очень похож на обнаружение директорий и работает путём определения ключевого слова FUZZ как части URL. Здесь также предполагается, что неверное имя GET-параметра даёт ответ размером 4242 байта.

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

Если имя параметра известно, значения можно фаззить тем же способом. В этом примере предполагается, что неверное значение параметра возвращает HTTP-код ответа 401.

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

Фаззинг POST-данных

Это очень простая операция, снова с использованием ключевого слова FUZZ. В этом примере фаззится только часть POST-запроса. Мы снова отфильтровываем ответы с кодом 401.

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

Максимальное время выполнения

Если вы не хотите, чтобы ffuf работал бесконечно, используйте -maxtime. Это останавливает весь процесс по истечении заданного времени (в секундах).

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

При работе с рекурсией вы можете управлять максимальным временем для каждой задачи с помощью -maxtime-job. Это остановит текущую задачу по истечении заданного времени (в секундах) и продолжит со следующей. Новые задачи создаются, когда функция рекурсии обнаруживает поддиректорию.

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

Также можно комбинировать оба флага, ограничивая как максимальное время выполнения для каждой задачи, так и общее время выполнения. Если вы не используете рекурсию, оба флага ведут себя одинаково.

Использование внешнего мутатора для создания тест-кейсов

В этом примере мы будем фаззить JSON-данные, отправляемые через POST. В качестве мутатора используется Radamsa.

При использовании --input-cmd ffuf отображает совпадения по их позиции. Это же значение позиции будет доступно вызываемой команде как переменная окружения $FFUF_NUM. Мы будем использовать это значение позиции в качестве сида для мутатора. Файлы example1.txt и example2.txt содержат корректные JSON-нагрузки. Мы сопоставляем все ответы, но отфильтровываем код ответа 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

Конечно, вызывать мутатор для каждой нагрузки не очень эффективно, поэтому мы можем также предварительно сгенерировать нагрузки, всё ещё используя Radamsa в качестве примера:

# 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

Конфигурационные файлы

При запуске ffuf сначала проверяет, существует ли файл конфигурации по умолчанию. Путь по умолчанию для файла ffufrc — $XDG_CONFIG_HOME/ffuf/ffufrc. Вы можете настроить в этом файле одну или несколько опций, и они будут применяться к каждой последующей задаче ffuf. Пример файла ffufrc можно найти здесь.

Более подробное описание расположения файлов конфигурации можно найти в вики: https://github.com/ffuf/ffuf/wiki/Configuration

Категории