Может ли флаг HttpOnly предотвратить атаку с фиксацией сеанса?
У меня есть необходимость сохранить идентификатор сессии после входа в систему. Мой файл cookie идентификатора сессии помечен как HttpOnly. Такая настройка абсолютно безопасна? Может ли злоумышленник выполнить атаку с фиксацией сеанса, если мой файл cookie сеанса - HttpOnly?
1 ответ
TLDR: Да, в PHP и Firefox можно добавить второй файл cookie сеанса, который в силу порядка в заголовке предпочтительнее исходного. Также Да, если есть другая функциональность, которая позволяет устанавливать идентификаторы сессии на сервере. Это зависит от конкретной функциональности приложения.
Полное объяснение
Зависит от того, какие другие функции у вас есть на вашем сайте для управления сессиями. В некоторых редких случаях приложение позволяет пользователю установить сеанс через HTTP-запрос. Например, через параметр GET.
Я полагаю, что вы хотите знать, возможно ли зафиксировать идентификатор сеанса, если исходный идентификатор сеанса установлен в файле cookie с флагом HttpOnly. Поэтому я провел небольшой тест на PHP-приложении, на котором проводил пентест. Удивительно, но вы можете установить новый PHPSESSID через JavaScript, внедренный как XSS. Если уже был файл cookie PHPSESSID с флагом HttpOnly, он просто помещает этот файл рядом с другим. В моем случае, в Firefox, он отправил следующие куки на сервер после моей попытки установить PHPSESSID через document.cookie = "PHPSESSID=FIXATEDSESSIONID":
Cookie: PHPSESSID=FIXATEDSESSIONID; __utma=139474299.465096418.1547461023.1548839033.1548851774.5; __utmz=139474299.1547461023.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); acceptCookies=true;
Таким образом, теперь в запросе есть два идентификатора сеанса. В моей настройке, с PHP 5.6.25, сервер берет первый файл cookie для привязки сеанса. Так что в случае с Firefox и PHP 5.6.25 я смог зафиксировать свой идентификатор сессии (FIXATEDSESSIONID) с помощью JavaScript. Исходный идентификатор сеанса все еще находится в запросе, но он игнорируется сервером. Обратите внимание, что FIXATEDSESSIONID - это буквально идентификатор сеанса, который я ввел. Поэтому не было необходимости получать законный идентификатор сеанса с сервера PHP.
Лучше иметь сессионный cookie как HttpOnly
потому что это, очевидно, делает сессию более безопасной.
Правильный способ избежать уязвимости фиксации сеанса - создать новый сеанс для пользователя при аутентификации.
Проверьте статью OWASP о фиксации сессии. Он содержит информацию о методах для выполнения этого вида атаки.