Методы обхода httpOnly

httpOnly — это дополнительный флаг для HTTP-заголовка Set-Cookie, который указывает на запрет чтения/записи данных Cookie посредством JavaScript, отсюда и название: Cookie доступны только через протокол HTTP. Использование httpOnly позволяет веб-разработчикам установить собственную политику безопасности в отношении доступа к Cookie из среды браузера, что по замыслу разработчиков из Microsoft должно помочь в борьбе против XSS-уязвимостей. Однако обойти ограничения httpOnly довольно просто…

Впервые httpOnly был реализован в Internet Explorer 6 SP1 в далеком 2002 году. httpOnly прошел длинный путь, однако с тех времен спецификация практически не претерпела изменений. До сих пор не решена серьезная проблема, ставящая под сомнение безопасность данных Cookie с флагом httpOnly. Речь идет об Ajax и методе XMLHTTPResponse, с помощью которого можно получить доступ к Cookie, используя getAllResponseHeaders()/getResponseHeader(). Конечно некоторые меры были направлены на решение этой проблемы, в частности IE7 вырезает существующие Cookie с httpOnly из HTTP-заголовка Cookie, тем не менее пока что очень мало браузеров могут противостоять чтению из ответа заголовка Set-Cookie. Убедиться в этом, проверив свой браузер, можно здесь. Кстати среди самых популярных браузеров с httpOnly безопасно работает лишь Opera. Используемая мной Opera версии 9.52 вырезала из заголовков весь Set-Cookie, а вот FireFox 3.0.3 и Internet Explorer 7 показали HTTP-ответ как есть, без какой-либо обработки на предмет наличия Cookie с флагом httpOnly.

Другой проблемой является доступ к Cookie с httpOnly посредством метода TRACE. Напомню, что TRACE — это метод, предназначенный для отладки и анализа активности соединений. Отправив TRACE-запрос сервер возвратит посланные ему заголовки:

TRACE / HTTP/1.1
Host: foo.bar
X-Header: test
HTTP/1.1 200 OK
Date: Mon, 02 Dec 2002 19:24:51 GMT
Server: Apache/2.0.40 (Unix)
Content-Type: message/http

TRACE / HTTP/1.1
Host: foo.bar
X-Header: test

Как нетрудно догадаться, атакующий может получить доступ к безопасным кукам, отправив TRACE-запрос. Однако TRACE-запросы запрещены практически во всех современных браузерах — такой трюк работал только с IE6.

Таким образом, доверять защиту от XSS, лишь указывая флаг httpOnly, не стоит — лучше как следует позаботиться о безопасной фильтрации входных данных.

Ссылки:


7 комментариев

  1. AHToHuO, 13. октября 2008, 4:13

    спасибо за инфу!

     
  2. Best, 21. октября 2008, 12:29

    Чё-то я не понял, getAllResponseHeaders() возвращает заголовок сервера, а не клиента, соответственно и куки, которые мы видим, это не те, которые у нас уже установлены, а те, которые нам пытается поставить сайт, соответственно, если пользователь уже авторизировался, у него есть SessionID, то он передаёт его серверу при каждом запросе каждого скрипта, но сервер не ставит ему ничего обратно (никаких куков), поэтому я не вижу смысла в getAllResponseHeaders(). Объясни пожалуйста, а то я уже давно копался и с TRACE’ом, и с httpOnly, но так и не нашел решения.

     
  3. Raz0r, 21. октября 2008, 21:27

    >поэтому я не вижу смысла в getAllResponseHeaders()
    в этом как раз и заключается суть обхода httpOnly — браузеры не позволяют получить доступ js-скриптам к cookie как элементу dom, но посредством AJAX эта задача вполне решаема. Вообще здесь все зависит от конкретного веб-приложения, но действительно getAllResponseHeaders() будет эффективен лишь в тот момент, когда веб-приложение назначает cookie. Чтобы достичь этого можно произвести выход пользователя из системы (разумеется, если эта функция подвержена CSRF), а затем осуществить AJAX-вызов и получить заголовки с помощью getAllResponseHeaders()

     
  4. Best, 22. октября 2008, 11:24

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

     
  5. 1, 26. января 2009, 2:55
  6. Raz0r, 26. января 2009, 15:07

    Да, метод с TRACE очень древний и уже почти неакутален…

     
  7.  

    […] глобальных переменных, etc), так и пользователя (обход httpOnly, получение идентификаторов сессий). Уязвимость […]

     

Write a comment: