заключающаяся в передаче приложению неправильных, неожиданных или случайных данных с целью вызвать у приложения максимальное удивление • Один из основных способов тестирования при BlackBox • Правильный фаззинг это целое искусство • Уметь хорошо фаззить весьма прибыльно
SecLists (https://github.com/danielmiessler/SecLists) • FuzzDB (https://github.com/fuzzdb-project/fuzzdb) • wfuzz list (https://github.com/xmendez/wfuzz/tree/master/wordlist) • Payload all the things (https://github.com/swisskyrepo/PayloadsAllTheThings)
можно понять, что пейлоад сработал • Идея в добавление в словари пейлоадов с отстуком на внешний сервер • Socket vs DNS – по DNS предпочтительнее (а лучше и так, и так) • Можно использовать BurpSuite Collaborator
забываем выключить Payload Encoding • Правила пишутся в RegExp формате Пейлоад на входе: q%00we\qwe”\ 1. Заменяем \ на \\ -> qwe\\qwe”\\ 2. Заменяем “ на \” -> qwe\\qwe\”\\ 3. Заменяем %FF на \xFF, где FF это хекс -> q\x00we\\qwe\”\\ Пейлоад на выходе: q\x00we\\qwe\”\\
URLEncode: %00 • JSON: \x00 Чем больше байт брутим, тем больше запросов: • 256 запросов для одного байта • 65536 запросов для двух байт • 16777216 запросов для трех байт
влиять на то, как будет обработан другой index.php?value=123&action=search • Например изменяя значение параметра action можно загнать value в разные куски кода • Адаптация фаззинга под логику работы приложения может дать очень хороший результат
запросы (основные инструменты + плагины) • Позволяет по ним искать • Позволяет выгружать результаты в CSV и ElasticSearch • Turbo Intruder • Скриптовый аналог Intruder • Copy as Python-Requests • Позволяет быстро перенести запросы из BurpSuite в Python скрипт
длину ответа, то можно просмотреть уязвимость Реальный кейс из жизни: • Неправильный пароль – Login or password incorrect. • Ошибка – Login or password incorrect! Варианты решения: • Intruder Grep Match/Extract • Comparing Responses (мечта)
Мутируемый параметр попадает в ответ сервера • На странице присутствует фрагмент, который меняется при каждой загрузке • Таймеры/рандомы произвольной длины в теле ответа Возможные решения: • Опять же Intruder Grep Match/Extract • Выгрузка результатов и последующий анализ • Расширение возможностей (далее об этом поговорим)
позволяет добавлять свои обработчики над запросами • Для дебага можно использовать Session Tracer или MITMProxy Логика следующая: • Включаем поддержку Cookie Jar в Intruder • Добавляем макрос на логин и обновление Cookie Jar • Добавляем Handling Rule, который: • Ловит в ответе сервера ключевое слово/регулярку, указывающее на то, что сессия умерла • Вызывает макрос, который логинится и обновляет Cookie Jar
дополнительные запросы • Самый частый пример – CSRF токен при авторизации. Необходимые итерации фаззера: 1. Сделать GET запрос к странице /login/ 2. Получить CSRF токен из ответа сервера 3. Сделать POST запрос с мутированными данными и свежим CSRF токеном Using Burp's Session Handling Rules with anti-CSRF Tokens: https://support.portswigger.net/customer/portal/articles/2906338-using-burp-s-session-handling-rules-with-anti-csrf-tokens
Модульная система Минусы: • Медленный (очень медленный) • Скудная документация • Множество тонкостей при написание модулей • Фиксированный язык программирования (Python) • Дебаг из коробки ужасен • Нету возможности вывода в консоль
нем заголовок Wrapper • Если находит, то смотрит его значение и передает управление нужному Wrapper’у • Класс Wrapper’а делает необходимые действия и возвращает управление проксе • MITMProxy удаляет из запроса весь заголовок Wrapper и пропускает пакет дальше POST /index.php?id=1 HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 ... Wrapper: 5 Content-Length: 8 test=123
без MITMProxy • MITMProxy просто читает пакет и пересылает его дальше Результаты: • Напрямую - 32 секунды • Через MITMProxy - 7 минут 30 секунд Простейший Wrapper модуль для MITMProxy: • https://github.com/trololomgwtf/mitmproxy-wrapper/
Облегченный, а значит быстрый • Гибкость в реализации Минусы: • BurpSuite работает только с Socks прокси • Придется работать с HTTPS напрямую • Реализаций пока нету, нужно кодить :)
шансов что-то найти • Правильный выбор словаря и его дополнение это очень важно • Нужно понимать, какие части HTTP запроса могут попасть в логику приложения • Важно адаптировать фаззинг под приложение и конкретную страницу • Необходимость дополнительных действий во время фаззинга – не приговор