Обход WAF: как лимиты тела запроса позволяют скрыть полезную нагрузку

Обход WAF: как лимиты тела запроса позволяют скрыть полезную нагрузку

Есть старый трюк, который с завидным постоянством всплывает в отчётах пентестов: некоторые веб-экраны анализируют только первые n байт тела HTTP-запроса. Всё, что длиннее, может пройти «как есть» до приложения. Отсюда и идея: добавить в начало тела запроса большой блок нейтральных данных, а полезную нагрузку спрятать дальше по потоку. Если фильтр не дочитывает — он просто не видит «жало».

Звучит почти как магия, но это вовсе не она, а инженерный компромисс. В реальной жизни у WAF есть жесткие лимиты на буферизацию и время анализа, особенно на насыщенном трафике. Разработчики балансируют между глубиной проверки и пропускной способностью. Где-то стоит порог на размер инспектируемого тела, где-то — упрощаются правила для длинных загрузок. В итоге появляется окно, в которое можно просунуть специфические полезные нагрузки.

И да, трюк не универсален: современные решения умеют разбирать поток частями, пересобирать фрагменты, распаковывать вложения и распознавать «подмену формы». Но крайние режимы и экзотические конфигурации встречаются чаще, чем хотелось бы. Особенно в цепочках из CDN, L7 балансировщика и самого приложения, где один компонент верит другому на слово.

Разберёмся, как именно работает этот подход на концептуальном уровне, где тут уязвимые места, как легально и безопасно проверять свои системы и чем отвечать синим командам. Сразу важная оговорка: ниже нет пошаговых инструкций для обхода защит и эксплуатационных примеров — только обзор, методология и защита. Если вы с «синей» стороны, вам это даже полезнее: понимать трюк означает уметь корректно его закрыть.

Как работает трюк с лимитами: без магии и лишнего героизма

В основе — предположение, что WAF не всегда анализирует весь объём тела HTTP-запроса (POST, PUT, PATCH и т. п.), а обрезает поток по порогу. Это может быть фиксированное число байт, может быть динамическое правило, зависящее от типа контента, может быть особый путь обработки больших загрузок. Для веб-экрана это способ оставаться быстрым и не «класть» приложение под нагрузкой.

Злоумышленник пользуется этой экономией: формирует запрос с «прологом» из нейтральных данных, после которого идёт та самая полезная нагрузка. Фильтр видит только «пролог», машет рукой и пропускает поток дальше. На стороне приложения полезная нагрузка разбирается уже без «надзора». Если на уровне бизнес-логики нет валидаторов, нормализации и ограничения допустимых шаблонов, беда рядом.

Почему это срабатывает? Во-первых, исторически многие сигнатуры ориентированы на первые байты и на «типичный» размер тела формы. Во-вторых, распаковка и декодирование (gzip, deflate, base64) тоже стоят ресурсов, и их часто отключают на периметре. В-третьих, фронт-прокси и CDN не всегда честно докладывают бэкенду реальный размер и тип содержимого, а WAF рассчитывает на upstream. Чем сложнее тракт, тем больше шансов на рассогласование.

Отдельная история — фрагментированный ввод: chunked-кодирование в HTTP/1.1, DATA-фреймы в HTTP/2, смешанный трафик через промежуточные прокси. Если инспекция реализована только как «буферизуй первые X байт и сравни с шаблонами», потоковая доставка с «длинным вступлением» легко делает окно для атаки шире.

Вывод прост: если часть трафика заведомо не инспектируется глубоко, «пролог» становится ширмой. На этом уровне мысли и стоит держать дальнейший фокус: не на «магических байтах», а на процессной дыре — несоответствии глубины проверки уровню риска.

Что за программа nowafpls и чем она полезна в легальных проверках

В прошлом году команда Assetnote опубликовала минималистичный инструмент для исследований и пентестовnowafpls. Это расширение к прокси-инструментам, которое помогает формировать запросы с контролируемым «прологом» и наблюдать, как меняется поведение фильтрации. Концептуально — очень простой помощник для быстрой гипотезы «а если WAF смотрит только первые n байт?».

Инструмент полезен именно тем, что снимает рутину: не нужно вручную «набивать» тело запроса и бояться смазать форматирование. В рамках лаборатории или легального теста безопасности вы меняете параметры «фонового шума» и смотрите на две метрики — что видит фильтр в логах и как реагирует приложение. Это помогает уже на подготовительном этапе понять, стоит ли углублять сценарий и звать «тяжёлую артиллерию» для глубокой проверки.

Важно: мы не публикуем эксплуатационных инструкций. Любые действия с инструментами, имитирующими обход защит, допустимы только при письменном разрешении владельца системы и в границах утверждённого сценария тестирования. За деталями установки и использования обращайтесь к официальной документации проекта — она достаточно прозрачна и не нуждается в пересказе тут. Ссылка на репозиторий: github.com/assetnote/nowafpls.

Если вы работаете в Burp или Caido, идея та же: расширение добавляет удобную «надстройку» к репитеру, чтобы экспериментировать с объёмом вставки и наблюдать реакцию. С профессиональной точки зрения это просто ещё одна тестовая линейка, как чек-лист на разные кодировки, разные заголовки кэширования, разные типы multipart-форм. Не более и не менее.

Наконец, честный совет: относитесь к таким утилитам как к индикаторам, а не как к «волшебным ключам». Их цель — быстро выявить подозрительную зону в конфигурации. Серьёзная работа начинается там, где подключаются разработчики, SRE и безопасность, чтобы выровнять тракт: от CDN и балансировщиков до фреймворка и бизнес-валидаторов.

Этика и методология: как тестировать, чтобы спать спокойно

Любая проверка периметра на устойчивость к обходу WAF — это зона повышенной ответственности. В отличие от обычной валидации форм, вы сознательно создаёте нетипичные, тяжёлые запросы и наблюдаете, как инфраструктура справляется. Делать это без мандата — всё равно что проверять замки у соседей «из любопытства». Поэтому первое правило очевидно: письменное разрешение и согласованный план тестов.

Второе правило — минимизация воздействия. Работайте на стендах и в окнах низкой нагрузки, используйте безопасные маркеры вместо реальных полезных нагрузок, заранее уведомляйте команды мониторинга, чтобы никто не принял ваши эксперименты за инцидент. Логи пригодятся: фиксируйте заголовки, тайминги, ответы, поведение промежуточных звеньев.

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

Четвёртое — границы сценариев. Не лезьте в эксплуатацию бизнес-логики, если цель — именно проверить «глубину зрения» фильтра. Не пытайтесь «дожимать» уязвимости, которые вы не согласовывали: из узкого теста на обход фильтра легко скатиться в полноценный Red Team, а это другой объём рисков и соглашений.

И пятое — коммуникация. Грамотно описанная находка — половина успеха. Заказчику важны не байты и не экзотика, а ответ на простой вопрос: каков риск, где граница ответственности (CDN, WAF, приложение), и что конкретно делать. Чем яснее и спокойнее вы это объясните, тем быстрее всё поправят.

Что делать синим командам: детектирование и контрмеры

Если вы со стороны эксплуатации и ИБ, хорошая новость в том, что трюк с «длинным прологом» очень даже виден в телеметрии. Плохая — при неправильных порогах он может тихо проходить в шуме. Нужны и процессные, и технические меры. Начнём с наблюдаемости: научитесь видеть большие тела запросов и нетипичные распределения размеров по эндпоинтам. Чаще всего атаки нацелены на узкий набор маршрутов.

Дальше — сопоставление. Сравнивайте то, что видел периметр (лог WAF/CDN), с тем, что видел бэкенд (access-лог приложения, APM). Любое расхождение в размере/типе содержимого — тревожный сигнал. Простейшие эвристики улучшают картину: скачкообразные изменения среднего размера тела, всплески «почти одинаковых» больших запросов, нарастание доли длинных форм в «тишине ночи».

Контрмеры зависят от стека, но базовые принципы общие. Во-первых, включайте полноценную инспекцию тела для чувствительных маршрутов: авторизация, загрузка файлов, сериализованные форматы. Лучше платить производительностью там, где риск велик, чем потом чинить последствия. Во-вторых, выравнивайте тракт: договоритесь, кто распаковывает что и где, чтобы не было «двойной слепоты» между CDN, прокси и WAF.

В-третьих, вводите валидаторы на уровне приложения. WAF — лишь первая линия обороны. Нормализация входных данных, строгие схемы для JSON/XML, whitelisting допустимых полей и размеров, проверка заголовков и соответствия Content-Type фактическому содержимому — те самые boring-вещи, что спасают чаще всего. И, конечно, ограничения: максимальные размеры, timeouts, back-pressure.

Наконец, оперативные настройки. Поиграйте лимитами и профилями в самом WAF: для чувствительных зон поднимите глубину анализа, запретите «упрощённые» пути для длинных тел, включите декодирование и инспекцию после распаковки. Отдельно проверьте, как система ведёт себя на фрагментированных запросах (chunked, HTTP/2), и правда ли «видит» содержимое после «вступления».

Симптом Что смотреть Почему важно
Много крупных POST на один эндпоинт Дистрибуция размеров тела, время ответа, совпадение шаблонов Сигнал о попытке «задвинуть» вредонос в «хвост» тела
Расхождение размеров у WAF и приложения Логи периметра vs access-логи бэкенда Признак неполной инспекции или расслоения тракта
Аномально длинные multipart-формы Парсинг boundary, количество частей, незаполненные поля Попытка маскировки полезной нагрузки среди «пустых» частей
Подозрительные сжатия Сопоставление Content-Encoding и фактического содержимого Скрытие полезной нагрузки в упаковке, избегание декодирования

Короткий чек-лист и вывод

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

  • Видимость: заведите дешёвые, но информативные метрики по размерам тел запросов и по конкретным маршрутам. Без этого вы слепы.
  • Выравнивание тракта: договоритесь, кто распаковывает, кто нормализует, кто проверяет. Устраняйте «зоны никого» между CDN, прокси, WAF и приложением.
  • Глубина на чувствительных зонах: авторизация, загрузки, сериализованные форматы — максимум проверки и минимум компромиссов.
  • Жёсткая валидация на бэкенде: схемы, whitelists, соответствие типов, пределы размеров — скучная классика, которая спасает.
  • Оперуправление: профили WAF для «рисковых» маршрутов, инспекция после распаковки, корректная обработка chunked/HTTP/2.

И финальная мысль. «Мусор в начале запроса» — это не «хакерская магия», а симптом технологического долга на периметре. Его не лечат молотком сигнатур, его лечат прозрачной архитектурой и здравым смыслом. Если вы пентестер — фиксируйте наблюдения корректно и этично, с акцентом на риск и зону ответственности. Если вы из эксплуатации — не стесняйтесь поднимать глубину проверки там, где на кону данные и деньги. А за деталями исследовательских инструментов всегда обращайтесь к их официальным руководствам: nowafpls на GitHub, методологии — к OWASP WSTG. Без фанатизма, но и без самоуспокоенности.

Отказ от ответственности. Я не могу предоставить пошаговые инструкции по установке и применению инструментов, предназначенных для обхода защит. Используйте информацию из статьи исключительно для повышения устойчивости собственных систем и проведения легальных проверок с письменного согласия владельца ресурсов.


nowafpls WAF валидация инспекция обход пролог тело запроса
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.

Конференция по защите данных «Гарда: Сохранить всё»

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

При поддержке ФСТЭК и Минцифры. Москва, 16.10.2025.

Присоединяйтесь!

Реклама. 16+ ООО «Гарда Технологии», ИНН 5260443081


Юрий Кочетов

Здесь я делюсь своими не самыми полезными, но крайне забавными мыслями о том, как устроен этот мир. Если вы устали от скучных советов и правильных решений, то вам точно сюда.