ВЕБ-БЕЗОПАСНОСТЬ

01 / УПРАВЛЕНИЕ СЕССИЕЙ

Session
fixation.

Злоумышленник знает идентификатор сессии ещё до входа жертвы.

Как возникает атака и какой шаг её останавливает

SESSION ID7F·A9·2Cизвестен заранее
01Атакующий
02Жертва
03Сервер
01 / ОСНОВАSESSION FIXATION

Сессия связывает запросы
с конкретным пользователем.

Браузер хранит случайный идентификатор, а сервер по нему находит данные текущей сессии.

БРАУЗЕРХранит cookie
ЗАПРОС К САЙТУ
→
СЕРВЕРНаходит сессию
!

ID сессии — не пароль. Но пока он действителен, сервер может воспринимать его предъявителя как вошедшего пользователя.

02 / ТОЧКА УЯЗВИМОСТИДО ВХОДА → ПОСЛЕ ВХОДА

Опасность возникает, когда
ID не меняется после входа.

Анонимный идентификатор получает права аккаунта — и остаётся известным атакующему.

01УЯЗВИМО
До входа
ID A
→
→
После входа
ID A
ID сохранён
02БЕЗОПАСНО
До входа
ID A
→
→
После входа
ID B
Новый ID

КЛЮЧЕВОЙ ПРИНЦИП При смене уровня доступа сессия должна получить новый идентификатор.

03 / СЦЕНАРИЙАТАКА В ЧЕТЫРЕ ШАГА

Атакующий получает доступ, если известный ему ID переживает вход жертвы.

Упрощённый учебный сценарий показывает, где именно нарушается граница доверия.

01Получает ID

Атакующий узнаёт идентификатор анонимной сессии.

02Закрепляет его

Тот же ID оказывается в браузере жертвы.

03Жертва входит

Сервер связывает старый ID с её аккаунтом.

04Повторно использует

Атакующий предъявляет известный ему ID.

ОДИН И ТОТ ЖЕ ID
до входа→после входа
04 / РАЗЛИЧИЕFIXATION ≠ HIJACKING

При фиксации ID известен до входа; при краже его узнают позже.

Разница в моменте получения идентификатора помогает выбрать правильную защиту.

SESSION FIXATION
АТАКУЮЩИЙ ЗНАЕТ IDЖЕРТВА ВХОДИТ

Проблема — сервер оставляет прежний ID действительным после аутентификации.

SESSION HIJACKING
ЖЕРТВА ВХОДИТАТАКУЮЩИЙ УЗНАЁТ ID

Проблема — действующий ID становится доступен постороннему после входа.

В обоих случаях действующий ID может открыть чужую сессию. Момент его появления у атакующего различается.

05 / ГЛАВНАЯ ЗАЩИТАРЕГЕНЕРАЦИЯ ID

Новый ID после входа разрывает цепочку атаки.

После проверки учётных данных сервер выдаёт новый случайный ID и прекращает действие старого.

АНОНИМНАЯ СЕССИЯID Aизвестен атакующему
ВХОД×старый ID отозван
СЕССИЯ АККАУНТАID Bновый случайный ID
Правило: смена ID нужна при входе и при каждом повышении привилегий.
06 / УСИЛЕНИЕ ЗАЩИТЫCOOKIE ATTRIBUTES

Настройки cookie ограничивают пути навязывания и утечки ID.

Они дополняют ротацию сессии, но не заменяют её.

07 / СЕРВЕРНЫЕ ПРАВИЛАНЕ ДОВЕРЯТЬ ID КЛИЕНТА

Сервер принимает только выданные им действующие сессии.

Произвольный или уже отозванный идентификатор не должен превращаться в доступ к аккаунту.

01Генерировать

Криптографически случайный ID на сервере.

02Проверять

Не принимать чужой, несуществующий и устаревший ID как новую сессию.

03Отзывать

При выходе, смене прав и повторном входе прекращать действие старого ID.

08 / ПРОВЕРКАТЕСТОВАЯ СРЕДА

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

Тестируйте только приложение, на проверку которого у вас есть разрешение.

1

Откройте анонимную сессию и запишите её ID.

2

Войдите в тестовый аккаунт и сравните новый ID.

3

Проверьте, что старый ID больше не даёт доступ.

ОЖИДАЕМЫЙ РЕЗУЛЬТАТID изменился; старый отозван.
ПРИЗНАК ОШИБКИСтарый ID открывает аккаунт.
09 / ИТОГЧЕК-ЛИСТ

Новая привилегия — новый идентификатор сессии.

Запомните одну центральную меру и три ошибки, которые её сводят на нет.

ПРАВИЛОВход → новый ID → старый ID недействителен
01

Оставлять анонимный ID после входа.

02

Считать cookie-флаги заменой ротации.

03

Не отзывать ID при выходе и смене прав.

Источники: OWASP Session Management Cheat Sheet · MDN Set-Cookie · MDN Secure cookie configuration

ЗАМЕТКИ К СЛАЙДАМ01 / 10
01

Session fixation: ID известен до входа

Начните с вопроса: что будет, если злоумышленник знает идентификатор сессии человека ещё до того, как тот вошёл в аккаунт? Это и есть ключевая идея фиксации сессии. Атакующему не обязательно узнавать пароль жертвы: ему нужен действующий идентификатор, который сайт позже свяжет с её аккаунтом.

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

ЗАМЕТКИ К СЛАЙДАМ02 / 10
02

Сессия связывает запросы с пользователем

HTTP-запросы сами по себе не помнят предыдущие действия. Поэтому после создания сессии сервер выдаёт браузеру идентификатор, обычно через cookie. В следующих запросах браузер возвращает этот ID, а сервер находит связанные с ним данные: например, сведения о входе и права пользователя.

Идентификатор не равен паролю и обычно выглядит как случайная строка. Однако действующий ID может служить пропуском в сессию. Поэтому его нельзя раскрывать, предсказуемо генерировать или бесконтрольно сохранять при изменении прав. На следующем листе сравним два варианта входа.

ЗАМЕТКИ К СЛАЙДАМ03 / 10
03

Уязвимость возникает, когда ID не меняется

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

Нижняя строка показывает безопасный переход: после проверки учётных данных сервер создаёт ID B, связывает с ним аккаунт и прекращает действие ID A. Именно этот переход разрывает цепочку. Даже если прежний ID известен постороннему, он больше не даёт доступ.

ЗАМЕТКИ К СЛАЙДАМ04 / 10
04

Атака развивается в четыре шага

Сценарий на листе намеренно упрощён и нужен для понимания механизма. Сначала атакующий получает идентификатор анонимной сессии. Затем добивается того, чтобы браузер жертвы использовал этот же ID. Конкретные пути навязывания зависят от уязвимостей и настроек приложения.

После этого жертва самостоятельно входит в свой аккаунт. Ошибка возникает, если сервер оставляет тот же ID действительным, только теперь уже с правами пользователя. Атакующий предъявляет известный ему идентификатор и попадает в чужую сессию. Защиту нужно поставить на переходе от анонимного состояния к авторизованному.

ЗАМЕТКИ К СЛАЙДАМ05 / 10
05

Фиксация отличается от кражи сессии

Фиксацию сессии часто путают с перехватом или кражей уже активной сессии. Разница не в результате — в обоих случаях атакующий может получить доступ, — а в последовательности событий. При fixation он знает ID до того, как жертва войдёт. При hijacking узнаёт идентификатор уже после входа.

Эта разница важна для выбора меры защиты. Ротация ID при входе прежде всего ломает сценарий фиксации. Защита от утечки действующего ID требует и других мер: защищённого соединения, корректных cookie-настроек и устранения уязвимостей, через которые данные могут раскрыться.

ЗАМЕТКИ К СЛАЙДАМ06 / 10
06

Регенерация ID разрывает цепочку

Центральное действие выполняет сервер после успешной проверки учётных данных: создаёт новый криптографически случайный ID, привязывает к нему авторизованную сессию и делает прежний ID недействительным. Недостаточно просто отправить новую cookie, если старый токен остаётся активным на сервере.

Такую смену проводят не только при первоначальном входе, но и при повышении привилегий: например, когда пользователь открывает административную область или подтверждает чувствительное действие. Анонимный идентификатор не должен автоматически наследовать новые права. Это главный пункт рекомендаций OWASP по предотвращению session fixation.

ЗАМЕТКИ К СЛАЙДАМ07 / 10
07

Настройки cookie усиливают защиту

Атрибут Secure ограничивает передачу cookie защищённым соединением. HttpOnly запрещает доступ к ней через JavaScript и снижает риск раскрытия ID при XSS. SameSite помогает ограничить отправку cookie в межсайтовых запросах. Domain и Path задают область действия; лишнее расширение Domain позволяет большему числу поддоменов влиять на cookie.

Префикс __Host- накладывает дополнительные ограничения: cookie должна быть Secure, иметь Path=/ и не содержать Domain. Он полезен там, где подходит такая область действия. Но ни один из этих атрибутов не исправляет ситуацию, когда сервер оставляет известный ID после входа. Ротация остаётся обязательной.

ЗАМЕТКИ К СЛАЙДАМ08 / 10
08

Сервер доверяет только своим сессиям

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

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

ЗАМЕТКИ К СЛАЙДАМ09 / 10
09

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

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

Второй шаг столь же важен: старый ID должен перестать открывать защищённые данные. Если ID сменился в браузере, но прежний ещё работает на сервере, защита неполная. Зафиксируйте ожидаемый результат в автоматическом тесте, чтобы ошибка не вернулась после изменения логики авторизации.

ЗАМЕТКИ К СЛАЙДАМ10 / 10
10

Новая привилегия — новый ID

Завершите простым правилом: при переходе на новый уровень доступа сервер выдаёт новый идентификатор, а старый делает недействительным. Именно это непосредственно предотвращает фиксацию сессии. Рядом должны работать безопасные cookie, ограничение сроков и строгая проверка идентификаторов.

Попросите аудиторию назвать три типичные ошибки: не менять ID после входа, считать Secure или HttpOnly полной заменой ротации и забывать отзывать сессию при выходе или смене прав. Для самостоятельного чтения рекомендуйте OWASP Session Management Cheat Sheet и документацию MDN по cookie.

Сделано на ХостAI