The book of Magnus

IT-заметки и знания

Основы пентеста. Активный фаззинг веб-приложений

Tags = [ Fuzzing, Pentest_base ]

Термин "фаззинг" впервые появился в работе Барта Миллера "The Fuzz Generator" в 1988 году.

Активный фаззинг — это автоматическое или полуавтоматическое тестирование программ (в нашем случае веб-приложений) путём отправки некорректных, неожиданных или случайных данных на вход с целью обнаружения уязвимостей и ошибок.

Суть активного фаззинга

Отправить приложению какие-либо данные (например, заведомо некорректные) и посмотреть, как оно отреагирует. На практике это может быть:

  • Тестирование параметров в HTTP-запросах
  • Перебор директорий и файлов (Directory Busting)
  • Автоматическое тестирование на уязвимости: XXE, Command Injection, SQL Injection

Важно: SQLmap — это тоже фаззер!


1. Методы тестирования

Три подхода к тестированию

1.1 Чёрный ящик (Black Box)

  • Чаще всего используется при работе с удалёнными веб-сервисами
  • Данные на входе подаются в виде запросов
  • На выходе получаются веб-страницы или значения для анализа
  • Нет доступа к исходному коду

Применение:

  • Тестирование веб-приложений без доступа к коду
  • Sweeping — поиск похожих уязвимостей в различных приложениях

1.2 Серый ящик (Gray Box)

  • Комбинация чёрного ящика и reverse engineering
  • Частичный доступ к коду или документации
  • Сложно переоценить наличие исходного кода для тестирования

1.3 Белый ящик (White Box)

  • Полный доступ к исходному коду
  • Проверка может выполняться вручную или с помощью инструментов
  • Ручная проверка трудоёмкая и долгая

Инструменты:

  • Средства проверки на этапе компиляции
  • Браузеры исходного кода
  • Автоматические инструменты проверки кода (SAST)

2. Классификация фаззинга

По методу управления данными

Генерация (Generation-based)

  • Использование случайного набора данных
  • Создание данных для конкретных типов с нуля

Мутация (Mutation-based)

  • Внесение изменений в валидные данные
  • Модификация существующих входных данных

По "интеллекту"

Dumb Fuzzer (тупой фаззер)

  • Ничего не знает о структуре данных
  • Случайные мутации без понимания формата

Smart Fuzzer (умный фаззер)

  • Имеет представление о структуре данных
  • Может производить осмысленные манипуляции
  • Учитывает формат и протокол

3. Burp Suite

Незаменимый инструмент для тестирования веб-приложений. Позволяет манипулировать HTTP-запросами как угодно.

3.1 Burp Suite Repeater

Основной workflow:

  1. Запустить Burp Suite с включённым прокси
  2. Настроить браузер на использование Burp прокси
  3. Посетить целевой сайт через браузер
  4. Перейти в Proxy → HTTP History
  5. Выбрать интересующий запрос → ПКМ → Send to Repeater
  6. Во вкладке Repeater модифицировать запрос
  7. Нажать Send и анализировать ответ

3.2 Работа с GET-запросами

GET /page.php?a=1&b=2 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html

Параметры для тестирования: a и b

Эти параметры передают данные, отвечающие за логику работы приложения — их нужно тестировать в первую очередь.

3.3 Работа с POST-запросами

POST /login.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

username=admin&password=test

POST-запросы передают данные в теле, а не в URL, но суть тестирования остаётся той же.

3.4 Burp Suite Intruder

Возможности:

  • Фаззинг параметров, cookies, заголовков
  • Поиск директорий и файлов
  • Брутфорс форм авторизации
  • Перебор payload для различных уязвимостей
  • Эксплуатация слепых SQL-инъекций

Ограничение Community-версии:

  • Сильно занижена скорость перебора
  • Рекомендуется использовать альтернативы (см. ниже)

4. Dirb

DIRB — сканер веб-контента для поиска существующих (возможно, скрытых) веб-объектов.

Основы работы

  • Поиск по словарю
  • Формирует запросы к веб-серверу и анализирует ответ
  • Поставляется с готовыми словарями для атак

Синтаксис

dirb <URL> [<словарь>] [опции]

Основные опции

ОпцияОписание
-a <user-agent>Задать пользовательский User-Agent
-c <cookie>Установить cookie для HTTP-запроса
-fТонкая настройка при выявлении NOT_FOUND (404)
-H <header>Задать пользовательский HTTP-заголовок
-iПоиск без учёта регистра
-lПечатать заголовок Location когда найден
-N <code>Игнорировать ответы с этим HTTP-кодом
-o <file>Сохранить вывод в файл
-p <proxy[:port]>Использовать прокси
-rНе искать рекурсивно
-RИнтерактивная рекурсия
-SМолчаливый режим
-tНе принуждать к слешу / в URL
-u <user:pass>HTTP-аутентификация
-vПоказывать также страницы NOT_FOUND
-X <ext> / -x <exts>Применить расширения к каждому слову
-z <ms>Задержка между запросами

Горячие клавиши

  • n — Перейти к следующей директории
  • q — Остановить сканирование (сохранить состояние)
  • r — Показать статистику сканирования

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

# Базовое сканирование
dirb http://example.com

# С конкретным словарём
dirb http://example.com /usr/share/dirb/wordlists/common.txt

# С расширениями
dirb http://example.com -X .php,.html

# Через прокси с аутентификацией
dirb http://example.com -p http://127.0.0.1:8080 -u admin:password

5. Gobuster

Современный инструмент для перебора директорий, написанный на Go.

Преимущества

  • ✅ Многопоточность
  • ✅ Простой Unix-like интерфейс
  • ✅ Возможность точной настройки
  • ✅ Не требует runtime-окружения
  • ✅ Быстрее интерпретируемых скриптов (Python)
  • ✅ Компилируется на множестве платформ
  • ✅ Не выполняет рекурсивный брутфорс (фокус на скорости)

Установка

# Kali Linux
apt-get install gobuster

# Из исходников
go install github.com/OJ/gobuster/v3@latest

Режимы работы

  • dir — перебор директорий и файлов
  • dns — перебор поддоменов
  • vhost — перебор виртуальных хостов
  • s3 — перебор bucket'ов Amazon S3
  • fuzz — фаззинг параметров

Основные опции

Общие:

-t <threads>    # Количество потоков (по умолчанию: 10)
-v              # Verbose вывод
-w <wordlist>   # Путь к словарю
-q              # Тихий режим
-o <output>     # Файл для вывода

Для режима dir:

-u <url>        # URL цели
-x <extensions> # Расширения файлов
-s <codes>      # Положительные коды статуса (200,204,301,302,307)
-k              # Пропустить верификацию SSL
-a <agent>      # User-Agent
-c <cookies>    # Cookies
-H <header>     # Дополнительный заголовок
-f              # Добавлять / для директорий
-l              # Показывать длину ответа
-n              # Не показывать коды статуса
-r              # Следовать редиректам

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

# Базовый поиск директорий
gobuster dir -u http://example.com -w /usr/share/wordlists/dirb/common.txt

# С расширениями и потоками
gobuster dir -u http://example.com \
  -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt \
  -x php,html,txt \
  -t 50

# Показывать все коды ответа
gobuster dir -u http://example.com -w wordlist.txt -s "200,204,301,302,307,403"

# С cookies и custom заголовками
gobuster dir -u http://example.com -w wordlist.txt \
  -c "session=abc123" \
  -H "X-Forwarded-For: 127.0.0.1"

# Поиск поддоменов
gobuster dns -d example.com -w subdomains.txt

# Через прокси
gobuster dir -u http://example.com -w wordlist.txt -p http://127.0.0.1:8080

Фильтрация результатов

# Исключить код 404
gobuster dir -u http://example.com -w wordlist.txt -b 404

# Показывать только определённые коды
gobuster dir -u http://example.com -w wordlist.txt -s "200,301"

6. Wfuzz

Мощный фреймворк для фаззинга веб-приложений с Python API.

Установка

pip install wfuzz

Основная концепция

Ключевое слово FUZZ заменяется на payload из словаря:

wfuzz -w wordlist.txt http://example.com/FUZZ

6.1 Фаззинг директорий

wfuzz -w /usr/share/wordlists/dirb/common.txt \
  --hc 404 \
  http://example.com/FUZZ

6.2 Фаззинг файлов

# С двумя словарями: имена и расширения
wfuzz -w names.txt -w extensions.txt \
  --hc 404 \
  http://example.com/FUZZ.FUZ2Z

6.3 Фильтрация результатов

Скрытие (hide):

--hc <codes>    # Hide по коду ответа
--hl <lines>    # Hide по количеству строк
--hw <words>    # Hide по количеству слов
--hh <chars>    # Hide по количеству символов

Показ (show):

--sc <codes>    # Show только эти коды
--sl <lines>    # Show только эти количества строк
--sw <words>    # Show только эти количества слов
--sh <chars>    # Show только эти количества символов

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

# Поиск рабочих параметров
wfuzz -c -z range,0-100 \
  --hc 404 \
  http://example.com/page.php?id=FUZZ

# Из файла
wfuzz -c -z file,params.txt \
  http://example.com/page.php?FUZZ=value

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

wfuzz -z file,passwords.txt \
  -d "username=admin&password=FUZZ" \
  --hc 302 \
  http://example.com/login.php

6.6 Фаззинг Cookies

wfuzz -z file,wordlist.txt \
  -b "cookie1=FUZZ" \
  -b "cookie2=value2" \
  http://example.com/

6.7 Фаззинг заголовков

wfuzz -z file,headers.txt \
  -H "X-Custom-Header: FUZZ" \
  -H "User-Agent: CustomBot" \
  http://example.com/

6.8 Множественный фаззинг

# Два payload одновременно
wfuzz -z file,usernames.txt \
  -z file,passwords.txt \
  -d "username=HFUZZ&password=WFUZZ" \
  http://example.com/login.php

6.9 Кодирование payload

# Base64
wfuzz -u "http://example.com/?page=FUZZ" \
  -z file,wordlist.txt,base64 \
  --sw 40

# Цепочка кодировок
wfuzz -u "http://example.com/?data=FUZZ" \
  -z list,payload,none-base64-md5

Доступные кодировки:

wfuzz -e encoders

Популярные:

  • base64 — Base64 кодирование
  • md5 — MD5 хеш
  • sha1 — SHA1 хеш
  • urlencode — URL-кодирование
  • html_escape — HTML escape
  • hexlify — HEX-кодирование

6.10 Типы payload

wfuzz -e payloads

Основные типы:

  • file — из файла
  • list — список значений
  • range — диапазон чисел
  • stdin — из стандартного ввода

Примеры:

# Range
wfuzz -z range,1-100 http://example.com/user?id=FUZZ

# List
wfuzz -z list,admin-root-test http://example.com/FUZZ

# Stdin
cat wordlist.txt | wfuzz -z stdin http://example.com/FUZZ

7. Ffuf (Fuzz Faster U Fool)

Современный и очень быстрый фаззер, написанный на Go.

Установка

# Kali Linux
sudo apt install ffuf

# Go
go install github.com/ffuf/ffuf@latest

Основные преимущества

  • 🚀 Очень быстрый
  • 💾 Оптимизированная работа с памятью
  • 🔧 Гибкая настройка
  • 📊 Удобный вывод результатов
  • 🎨 Цветной вывод

7.1 Фаззинг директорий и файлов

ffuf -u "http://example.com/FUZZ" \
  -w /usr/share/wordlists/dirb/common.txt \
  -c

С расширениями:

ffuf -u "http://example.com/FUZZ" \
  -w wordlist.txt \
  -e .php,.html,.txt \
  -c -t 100

Фильтрация:

# По размеру ответа
ffuf -u "http://example.com/FUZZ" -w wordlist.txt -fs 4242

# По количеству слов
ffuf -u "http://example.com/FUZZ" -w wordlist.txt -fw 100

# По количеству строк
ffuf -u "http://example.com/FUZZ" -w wordlist.txt -fl 50

# По коду статуса
ffuf -u "http://example.com/FUZZ" -w wordlist.txt -fc 404,403

7.2 Брутфорс формы авторизации

ffuf -u "http://example.com/login.php" \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=HFUZZ&password=WFUZZ" \
  -w usernames.txt:HFUZZ \
  -w passwords.txt:WFUZZ \
  -fs 14 \
  -c -t 100 \
  -mc all

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

# Поиск параметров
ffuf -u "http://example.com/?FUZZ=value" \
  -w params.txt \
  -fs 626 \
  -c -t 100

# Поиск значений
ffuf -u "http://example.com/?id=FUZZ" \
  -w values.txt \
  -c

7.4 Работа с заголовками

⚠️ КРИТИЧЕСКИ ВАЖНО:

Ffuf по умолчанию НЕ добавляет заголовки. Если форма требует Content-Type, его нужно указать явно:

ffuf -u "http://example.com/api" \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TOKEN" \
  -d '{"key":"FUZZ"}' \
  -w wordlist.txt

7.5 Фаззинг поддоменов

ffuf -u "http://FUZZ.example.com" \
  -w subdomains.txt \
  -c

7.6 Виртуальные хосты

ffuf -u "http://example.com" \
  -H "Host: FUZZ.example.com" \
  -w vhosts.txt \
  -c

7.7 Дополнительные опции

-mc all         # Match all status codes
-t <threads>    # Количество потоков (default: 40)
-p <delay>      # Задержка между запросами
-rate <n>       # Ограничение запросов в секунду
-timeout <n>    # Таймаут запроса
-o <file>       # Вывод в файл (JSON, CSV, HTML)
-v              # Verbose mode
-s              # Молчаливый режим

7.8 Сохранение результатов

# JSON
ffuf -u "http://example.com/FUZZ" -w wordlist.txt -o results.json -of json

# HTML
ffuf -u "http://example.com/FUZZ" -w wordlist.txt -o results.html -of html

# CSV
ffuf -u "http://example.com/FUZZ" -w wordlist.txt -o results.csv -of csv

8. Dirsearch

Простой и эффективный инструмент для перебора директорий.

Установка

git clone https://github.com/maurosoria/dirsearch.git
cd dirsearch
python3 dirsearch.py -h

Основные возможности

  • ✅ Многопоточность
  • ✅ Keep-alive соединения
  • ✅ Поддержка множества расширений
  • ✅ Составление отчётов (текст, JSON)
  • ✅ Эвристическое выявление невалидных страниц
  • ✅ Рекурсивный брутфорс
  • ✅ Поддержка HTTP-прокси
  • ✅ Случайные User-Agent
  • ✅ Пакетная обработка

Основной синтаксис

python3 dirsearch.py -u <URL> -e <расширения> [опции]

Основные опции

-u <url>              # URL цели
-l <file>             # Файл с URL-ами
-e <extensions>       # Расширения (php,asp,html)
-w <wordlist>         # Словарь
-t <threads>          # Количество потоков
-x <codes>            # Исключить коды статуса
-r                    # Рекурсивный поиск
-R <depth>            # Глубина рекурсии
--timeout <n>         # Таймаут
--proxy <proxy>       # HTTP прокси
--random-agents       # Случайные User-Agent
--header <header>     # Дополнительные заголовки
-o <file>             # Вывод в файл

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

# Базовое сканирование
python3 dirsearch.py -u http://example.com -e php,html

# С конкретным словарём
python3 dirsearch.py -u http://example.com \
  -e php,html \
  -w /usr/share/wordlists/dirb/common.txt

# Рекурсивный поиск
python3 dirsearch.py -u http://example.com \
  -e php \
  -r \
  -R 2

# С кастомными заголовками
python3 dirsearch.py -u http://example.com \
  -e php \
  --header "Cookie: session=abc123" \
  --header "X-Forwarded-For: 127.0.0.1"

# Через прокси
python3 dirsearch.py -u http://example.com \
  -e php \
  --proxy http://127.0.0.1:8080

# Сохранение результатов
python3 dirsearch.py -u http://example.com \
  -e php \
  -o results.txt

9. Словари для фаззинга

9.1 FuzzDB

Большой проект, объединяющий фаззинг-базы по назначению.

Содержит:

  • Распространённые пути файлов и директорий
  • Пути логов и конфигурационных файлов
  • Шаблоны атак (строки для эксплуатации)
  • Шаблоны ответов (для идентификации уязвимостей)
  • Web-shells для различных платформ
  • Словари для брутфорса
  • Документацию

Установка:

git clone https://github.com/fuzzdb-project/fuzzdb.git

Структура:

fuzzdb/
├── attack/
│   ├── sql-injection/
│   ├── xss/
│   ├── file-upload/
│   ├── lfi/
│   └── ...
├── discovery/
│   ├── predictable-filepaths/
│   └── ...
└── ...

9.2 SecLists

Огромная коллекция списков для security-тестирования.

Установка:

git clone https://github.com/danielmiessler/SecLists.git

Основные категории:

SecLists/
├── Discovery/
│   ├── Web-Content/
│   │   ├── common.txt
│   │   ├── directory-list-2.3-medium.txt
│   │   ├── raft-large-directories.txt
│   │   └── ...
│   └── DNS/
├── Passwords/
│   ├── Common-Credentials/
│   ├── Leaked-Databases/
│   └── ...
├── Usernames/
├── Fuzzing/
│   ├── SQLi/
│   ├── XSS/
│   ├── LFI/
│   └── ...
└── ...

Популярные словари:

Директории:

  • directory-list-2.3-medium.txt — 220k строк
  • directory-list-2.3-small.txt — 87k строк
  • common.txt — 4.6k строк
  • raft-large-directories.txt — 62k строк

Файлы:

  • raft-large-files.txt
  • raft-large-words.txt

Параметры:

  • burp-parameter-names.txt

9.3 PayloadsAllTheThings

Популярный репозиторий с payload'ами для различных уязвимостей.

Установка:

git clone https://github.com/swisskyrepo/PayloadsAllTheThings.git

Категории:

  • CRLF Injection
  • CSV Injection
  • Command Injection
  • LDAP Injection
  • NoSQL Injection
  • SQL Injection
  • XSS Injection
  • XXE Injection
  • SSRF
  • File Inclusion (LFI/RFI)
  • File Upload
  • Open Redirect
  • Server Side Template Injection (SSTI)
  • XML External Entity
  • XPATH Injection
  • OAuth
  • JWT (JSON Web Token)
  • PHP Type Juggling
  • Insecure Deserialization
  • And many more...

9.4 Расположение словарей в Kali Linux

# Dirb
/usr/share/dirb/wordlists/

# Dirbuster
/usr/share/dirbuster/wordlists/

# Wordlists (общие)
/usr/share/wordlists/

# SecLists (если установлен)
/usr/share/seclists/

9.5 Рекомендации по выбору словарей

Для быстрого теста:

  • common.txt (~4.6k)
  • directory-list-2.3-small.txt (~87k)

Для полного сканирования:

  • directory-list-2.3-medium.txt (~220k)
  • directory-list-2.3-big.txt (~1.2M)

Для целевого тестирования:

  • Специализированные словари из SecLists
  • Кастомные словари под конкретную CMS/технологию

10. Практические примеры

10.1 Комплексное сканирование директорий

# Gobuster - быстрое сканирование
gobuster dir -u http://target.com \
  -w /usr/share/wordlists/dirb/big.txt \
  -x php,txt,html,zip,bak \
  -t 100 \
  -o gobuster_results.txt

# Ffuf - с фильтрацией
ffuf -u "http://target.com/FUZZ" \
  -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt \
  -e .php,.html,.txt \
  -fc 404,403 \
  -c -t 100 \
  -o ffuf_results.json

10.2 Поиск backup-файлов

# Типичные backup расширения
ffuf -u "http://target.com/FUZZ" \
  -w filenames.txt \
  -e .bak,.old,.backup,.zip,.tar.gz,.sql,.db \
  -c -t 50

10.3 Фаззинг API endpoints

# REST API
ffuf -u "http://api.target.com/v1/FUZZ" \
  -w api-endpoints.txt \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -mc all \
  -c

# GraphQL
wfuzz -z file,graphql-queries.txt \
  -d '{"query":"FUZZ"}' \
  -H "Content-Type: application/json" \
  http://target.com/graphql

10.4 Поиск уязвимых параметров

# LFI testing
wfuzz -c -z file,lfi-payloads.txt \
  "http://target.com/page.php?file=FUZZ" \
  --hc 404

# SQL Injection detection
wfuzz -c -z file,sqli-payloads.txt \
  "http://target.com/product.php?id=FUZZ" \
  --hh 1234

10.5 Брутфорс с интеллектуальной фильтрацией

# Первый запрос - определяем размер fail-ответа
curl -s http://target.com/login -d "user=wrong&pass=wrong" | wc -c
# Допустим, вернуло 1523 байта

# Фаззим с фильтрацией
ffuf -u "http://target.com/login" \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "user=admin&pass=FUZZ" \
  -w passwords.txt \
  -fs 1523 \
  -c

11. Продвинутые техники

11.1 Bypass WAF/IPS

Техники обхода:

  1. Изменение User-Agent
ffuf -u "http://target.com/FUZZ" \
  -w wordlist.txt \
  -H "User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)"
  1. Задержка между запросами
ffuf -u "http://target.com/FUZZ" \
  -w wordlist.txt \
  -rate 10 \
  -p 0.5-2
  1. Ротация IP через прокси
ffuf -u "http://target.com/FUZZ" \
  -w wordlist.txt \
  -x http://proxy1:8080,http://proxy2:8080
  1. Кодирование payload
wfuzz -u "http://target.com/FUZZ" \
  -w wordlist.txt,urlencode

11.2 Рекурсивный фаззинг

# Скрипт для рекурсивного фаззинга
#!/bin/bash

URL="http://target.com"
WORDLIST="/usr/share/wordlists/dirb/common.txt"
DEPTH=3

function fuzz_recursive() {
    local url=$1
    local depth=$2
    
    if [ $depth -eq 0 ]; then
        return
    fi
    
    # Фаззим текущий уровень
    results=$(ffuf -u "${url}/FUZZ" -w $WORDLIST -fc 404 -mc 200,301,302 -s)
    
    # Для каждого найденного пути
    echo "$results" | while read -r path; do
        echo "[+] Found: ${url}/${path}"
        
        # Рекурсивно фаззим найденный путь
        fuzz_recursive "${url}/${path}" $((depth-1))
    done
}

fuzz_recursive $URL $DEPTH

11.3 Корреляция результатов

# Сканируем тремя инструментами
gobuster dir -u http://target.com -w wordlist.txt -o gobuster.txt
ffuf -u http://target.com/FUZZ -w wordlist.txt -o ffuf.json
dirsearch.py -u http://target.com -w wordlist.txt -o dirsearch.txt

# Находим уникальные результаты
cat gobuster.txt ffuf.json dirsearch.txt | sort | uniq > all_results.txt

12. Автоматизация

12.1 Bash-скрипт для комплексного фаззинга

#!/bin/bash

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Параметры
TARGET=$1
WORDLIST="/usr/share/wordlists/dirb/common.txt"
EXTENSIONS="php,html,txt,js,zip,bak"
THREADS=50
OUTPUT_DIR="fuzzing_results_$(date +%Y%m%d_%H%M%S)"

# Проверка аргументов
if [ -z "$TARGET" ]; then
    echo -e "${RED}[!] Usage: $0 <target_url>${NC}"
    exit 1
fi

# Создаём директорию для результатов
mkdir -p "$OUTPUT_DIR"

echo -e "${GREEN}[+] Starting comprehensive fuzzing of $TARGET${NC}"
echo -e "${YELLOW}[*] Results will be saved to $OUTPUT_DIR${NC}"

# 1. Gobuster - директории
echo -e "${YELLOW}[*] Running Gobuster (directories)...${NC}"
gobuster dir -u "$TARGET" \
    -w "$WORDLIST" \
    -x "$EXTENSIONS" \
    -t "$THREADS" \
    -o "$OUTPUT_DIR/gobuster_dirs.txt" \
    2>/dev/null

# 2. Ffuf - файлы
echo -e "${YELLOW}[*] Running Ffuf (files)...${NC}"
ffuf -u "${TARGET}/FUZZ" \
    -w "$WORDLIST" \
    -e ".${EXTENSIONS//,/,.}" \
    -fc 404 \
    -c -t "$THREADS" \
    -o "$OUTPUT_DIR/ffuf_files.json" \
    -of json \
    -s

# 3. Поиск backup файлов
echo -e "${YELLOW}[*] Searching for backup files...${NC}"
ffuf -u "${TARGET}/FUZZ" \
    -w <(cat "$OUTPUT_DIR/gobuster_dirs.txt" | grep -oP '/\K[^/]+$') \
    -e .bak,.old,.backup,.zip,.tar.gz \
    -fc 404 \
    -c -t "$THREADS" \
    -o "$OUTPUT_DIR/backups.json" \
    -of json \
    -s

# 4. Анализ результатов
echo -e "${GREEN}[+] Fuzzing completed!${NC}"
echo -e "${YELLOW}[*] Found directories and files:${NC}"
cat "$OUTPUT_DIR"/gobuster_dirs.txt | grep -E "Status: (200|301|302)" | wc -l
echo -e "${YELLOW}[*] Results saved to $OUTPUT_DIR/${NC}"

12.2 Python-скрипт для интеллектуального фаззинга

#!/usr/bin/env python3
import requests
import sys
from concurrent.futures import ThreadPoolExecutor, as_completed
from urllib.parse import urljoin

class IntelligentFuzzer:
    def __init__(self, target, wordlist, threads=50):
        self.target = target
        self.wordlist = wordlist
        self.threads = threads
        self.results = []
        
    def test_path(self, path):
        """Тестирует один путь"""
        url = urljoin(self.target, path)
        try:
            response = requests.get(url, timeout=5, allow_redirects=False)
            return {
                'url': url,
                'status': response.status_code,
                'length': len(response.content),
                'path': path
            }
        except:
            return None
    
    def analyze_response(self, result):
        """Анализирует ответ и определяет интересность"""
        if not result:
            return False
        
        # Интересные коды статуса
        interesting_codes = [200, 201, 204, 301, 302, 307, 401, 403, 500]
        
        if result['status'] in interesting_codes:
            return True
        
        # Необычный размер ответа
        if result['length'] > 1000 or result['length'] == 0:
            return True
        
        return False
    
    def fuzz(self):
        """Основной метод фаззинга"""
        with open(self.wordlist, 'r') as f:
            paths = [line.strip() for line in f]
        
        print(f"[+] Fuzzing {self.target} with {len(paths)} paths...")
        
        with ThreadPoolExecutor(max_workers=self.threads) as executor:
            futures = {executor.submit(self.test_path, path): path 
                      for path in paths}
            
            for future in as_completed(futures):
                result = future.result()
                if self.analyze_response(result):
                    self.results.append(result)
                    print(f"[+] {result['url']} - {result['status']} ({result['length']} bytes)")
        
        print(f"\n[+] Found {len(self.results)} interesting paths")
        return self.results

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print(f"Usage: {sys.argv[0]} <target_url> <wordlist>")
        sys.exit(1)
    
    fuzzer = IntelligentFuzzer(sys.argv[1], sys.argv[2])
    fuzzer.fuzz()

13. Сравнительная таблица инструментов

ИнструментЯзыкСкоростьГибкостьПростотаРекомендация
DirbC⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Для начинающих
GobusterGo⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Быстрое сканирование
WfuzzPython⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Продвинутый фаззинг
FfufGo⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Лучший выбор
DirsearchPython⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Хороший баланс
Burp IntruderJava⭐⭐ (free)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐GUI, платная версия

14. Best Practices

14.1 Подготовка к фаззингу

  1. Разведка перед фаззингом:

    • Определить используемые технологии (Wappalyzer, WhatWeb)
    • Проверить robots.txt и sitemap.xml
    • Изучить структуру сайта вручную
  2. Выбор словарей:

    • Начать с небольших словарей (common.txt)
    • При необходимости использовать большие
    • Создавать кастомные словари под конкретную CMS
  3. Настройка инструментов:

    • Использовать разумное количество потоков (50-100)
    • Настроить правильную фильтрацию
    • Проверить, что все заголовки установлены корректно

14.2 Во время фаззинга

  1. Мониторинг:

    • Следить за результатами в реальном времени
    • Корректировать фильтры при необходимости
    • Проверять интересные находки вручную
  2. Этика:

    • Не создавать излишнюю нагрузку на сервер
    • Использовать задержки между запросами
    • Получить разрешение перед тестированием
  3. Документирование:

    • Сохранять все результаты
    • Делать скриншоты интересных находок
    • Вести лог проведённых тестов

14.3 После фаззинга

  1. Анализ результатов:

    • Проверить все найденные пути вручную
    • Определить потенциальные векторы атак
    • Составить отчёт о находках
  2. Дополнительное тестирование:

    • Фаззить найденные параметры
    • Тестировать файлы на уязвимости
    • Проверять backup-файлы

15. Типичные ошибки

❌ Частые ошибки начинающих

  1. Использование слишком больших словарей

    • Начинайте с малого
    • Увеличивайте только при необходимости
  2. Игнорирование фильтрации

    • Всегда фильтруйте 404
    • Определяйте и фильтруйте ложные срабатывания
  3. Забывают про заголовки

    • Ffuf требует явного указания Content-Type
    • Не забывайте про cookies и authorization
  4. Слишком много потоков

    • Можно перегрузить сервер
    • Можно попасть под rate-limit или бан
    • Оптимально: 50-100 потоков
  5. Не сохраняют результаты

    • Всегда используйте опции вывода в файл
    • Сохраняйте в нескольких форматах

16. Дополнительные инструменты

16.1 Другие популярные фаззеры

Feroxbuster:

# Современный Rust-фаззер
feroxbuster -u http://target.com -w wordlist.txt

Turbo Intruder (Burp Extension):

  • Очень быстрый
  • Требует Burp Suite
  • Поддерживает Python-скрипты для кастомной логики

Arjun:

# Специализируется на поиске параметров
arjun -u http://target.com/page.php

ParamSpider:

# Извлекает параметры из Wayback Machine
python3 paramspider.py --domain target.com

16.2 Инструменты анализа

httpx:

# Анализ найденных URL
cat found_urls.txt | httpx -status-code -content-length -title

meg:

# Делает запросы к списку путей на множестве хостов
meg --verbose paths.txt hosts.txt

17. Практические задания

Задание 1: Базовое сканирование

Используя любой инструмент, найдите все доступные директории на тестовом сайте.

Задание 2: Поиск backup-файлов

Найдите backup-файлы с расширениями: .bak, .old, .backup, .zip

Задание 3: Фаззинг параметров

Найдите рабочие GET-параметры на странице /search.php

Задание 4: Комплексный тест

Проведите полное сканирование:

  1. Найдите все директории
  2. Найдите все файлы с расширениями php, html, txt
  3. Найдите backup-файлы
  4. Найдите административные панели

18. Этические и юридические аспекты

⚠️ ВАЖНО

Активный фаззинг — это потенциально агрессивная техника, которая:

  1. Создаёт нагрузку на сервер

    • Тысячи запросов в минуту
    • Может привести к DoS
  2. Оставляет явные следы

    • В логах веб-сервера
    • В системах мониторинга
    • В WAF/IPS
  3. Может быть незаконным

    • Без письменного разрешения
    • Даже на "заброшенных" сайтах
    • Может рассматриваться как кибератака

Всегда получайте письменное разрешение:

  • От владельца системы
  • С указанием scope тестирования
  • С указанием допустимых методов

Альтернативы для обучения:

  • HackTheBox
  • TryHackMe
  • PortSwigger Web Security Academy
  • PentesterLab
  • Личные виртуальные машины (DVWA, WebGoat, Mutillidae)

19. Полезные ресурсы

Словари

Обучение

Сообщества


Заключение

Активный фаззинг веб-приложений — мощная техника, с помощью которой находится большинство уязвимостей в веб-приложениях.

Ключевые моменты:

Эффективность фаззинга зависит от:

  • Качества словарей
  • Правильной настройки инструментов
  • Анализа результатов
  • Креативности тестировщика

Рекомендуемый подход:

  1. Начать с быстрого сканирования (ffuf/gobuster)
  2. Проанализировать результаты
  3. Провести целевой фаззинг найденных точек входа
  4. Использовать специализированные payload'ы для конкретных уязвимостей

Всегда помните:

  • Получайте разрешение перед тестированием
  • Не создавайте излишнюю нагрузку
  • Документируйте все находки
  • Практикуйтесь на легальных платформах

С опытом приходит понимание:

  • Какие параметры тестировать
  • Какие payload использовать
  • Как интерпретировать результаты
  • Где искать нестандартные векторы атак

Удачи в изучении фаззинга! 🚀