- Регистрация
- 7 Авг 2025
- Сообщения
- 19
- Реакции
- 0
- Баллы
- 1
- Возраст
- 31
Техника «Cookie Sandwich» для обхода HttpOnly: практика эксплуатации
Введение
В пентестах веб-приложений часто встаёт задача обойти флаг HttpOnly, который защищает cookie от доступа со стороны JavaScript. В этом материале разбирается малоизвестный трюк — «cookie sandwich». Приём базируется на устаревших механизмах обработки cookie ($Version, кавычки, спецсимволы) и позволяет злоумышленнику получить доступ к данным, которые по задумке должны быть недоступны.
Суть метода
Идея в том, что веб-серверы по-разному интерпретируют cookie в заголовках, если в них вставить специальные символы и устаревшие атрибуты. Cookie sandwich создаёт ситуацию, когда один cookie «вклинивается» внутрь другого, и сервер ошибочно раскрывает содержимое защищённого HttpOnly.
Демонстрация
Создание «сэндвича»:
Заголовок на выходе:
Сервер может воспринять sessionId как часть значения param1, и тем самым отдать его в ответе, даже если он был установлен с HttpOnly.
Особенности обработки
— Apache Tomcat переключается в режим RFC2109, если встречает $Version.
— Если значение начинается с кавычек, парсер читает до следующей неэкранированной кавычки.
— Символы после «\» игнорируются.
Именно эти особенности позволяют злоумышленнику «захватить» дополнительные cookie между param1 и param2.
Flask и Python-фреймворки
Во Flask устаревший атрибут $Version не обязателен, так как кавычки в значениях поддерживаются по умолчанию. Атака выглядит так:
Ответ сервера:
Реальный пример
Мишенью часто становятся системы аналитики, где visitorId хранится в cookie и отображается на странице:
Если атакующий добьётся исполнения JS (например, через XSS), то сможет получить доступ к данным и обойти HttpOnly.
Эксплуатация на практике: кража PHPSESSID
Ответ:
Итоговая схема:
— Жертва заходит на страницу с XSS.
— JS выставляет $Version, session и dummy с нужными путями.
— Отправляется запрос к tracking-endpoint.
— Сервер сам раскрывает HttpOnly cookie в JSON.
Заключение
Cookie sandwich — это не просто «курьёз протокола», а реальный способ эксфильтрации HttpOnly cookie. В пентестах подобные техники помогают выявлять слабости на стыке браузеров, серверов и WAF-фильтров. Для защиты необходимо:
— переходить на строгий парсинг по RFC6265,
— избегать устаревших cookie ($Version и пр.),
— жёстко фильтровать ввод и устранять XSS,
— проверять работу аналитических и трекинговых сервисов.
Введение
В пентестах веб-приложений часто встаёт задача обойти флаг HttpOnly, который защищает cookie от доступа со стороны JavaScript. В этом материале разбирается малоизвестный трюк — «cookie sandwich». Приём базируется на устаревших механизмах обработки cookie ($Version, кавычки, спецсимволы) и позволяет злоумышленнику получить доступ к данным, которые по задумке должны быть недоступны.
Суть метода
Идея в том, что веб-серверы по-разному интерпретируют cookie в заголовках, если в них вставить специальные символы и устаревшие атрибуты. Cookie sandwich создаёт ситуацию, когда один cookie «вклинивается» внутрь другого, и сервер ошибочно раскрывает содержимое защищённого HttpOnly.
Демонстрация
Создание «сэндвича»:
JavaScript:
document.cookie = $Version=1;;document.cookie = param1="start;document.cookie = param2=end";; Заголовок на выходе:
Код:
Cookie: $Version=1; param1="start; sessionId=secret; param2=end Особенности обработки
— Apache Tomcat переключается в режим RFC2109, если встречает $Version.
— Если значение начинается с кавычек, парсер читает до следующей неэкранированной кавычки.
— Символы после «\» игнорируются.
Именно эти особенности позволяют злоумышленнику «захватить» дополнительные cookie между param1 и param2.
Flask и Python-фреймворки
Во Flask устаревший атрибут $Version не обязателен, так как кавычки в значениях поддерживаются по умолчанию. Атака выглядит так:
Код:
Cookie: param1="start; sessionId=secret; param2=end" Код:
Set-Cookie: param1="start\073 sessionId=secret\073 param2=end"; Реальный пример
Мишенью часто становятся системы аналитики, где visitorId хранится в cookie и отображается на странице:
HTML:
Эксплуатация на практике: кража PHPSESSID
- XSS-уязвимость: инъекция через oncontentvisibilityautostatechange.
- Поиск открытого cookie: endpoint отражает session в JSON.
- Cookie downgrade: использование $Version для принудительного парсинга по RFC2109.
- Финальная атака: упорядочивание cookie (через path=/json) и отражение PHPSESSID в ответе.
Код:
Cookie: $Version=1; session="deadbeef; PHPSESSID=secret; dummy=qaz" Код:
{"session":"deadbeef; PHPSESSID=secret; dummy=qaz"} Итоговая схема:
— Жертва заходит на страницу с XSS.
— JS выставляет $Version, session и dummy с нужными путями.
— Отправляется запрос к tracking-endpoint.
— Сервер сам раскрывает HttpOnly cookie в JSON.
Заключение
Cookie sandwich — это не просто «курьёз протокола», а реальный способ эксфильтрации HttpOnly cookie. В пентестах подобные техники помогают выявлять слабости на стыке браузеров, серверов и WAF-фильтров. Для защиты необходимо:
— переходить на строгий парсинг по RFC6265,
— избегать устаревших cookie ($Version и пр.),
— жёстко фильтровать ввод и устранять XSS,
— проверять работу аналитических и трекинговых сервисов.

