Сессии. Cookies. Безопасность


У кого больше замок - у того безопасность круче
Какая меня муха укусила? Сидел бы и клепал код по шаблону. Нет ведь, захотелось копнуть поглубже.

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

Для чего вообще нужны сессии и куки?

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

Как работают COOKIE

COOKIE позволяют запомнить на стороне клиента какие-нибудь данные, нужные для работы с этим веб-сервером. Например запомнить логин/пароль пользователя. Остаётся только на стороне сервера каждый раз проверять пользователя на вшивость перед выполнением действия.

И всё! Технически проблема решена.

Cookie можно установить:
1. с помощью PHP


Вызов инструкции Setcookie повлечёт за собой отправку примерно такого HTTP-ответа сервера:

Set-Cookie: Test=Value; expires=Fri, 9 Oct 2009 00:00:00

Функция позволяет указывать все атрибуты cookie, такие как name, value, expire, path, string, domain, secure, httponly.

2. с помощью Javascript

document.cookie = "Test=Value; expires=Fri, 9 Oct 2009 00:00:00";

3. c помощью META-тегов

Замечательно, что этот мета-тег может находиться в любой области документа, а не только в <head>

Прочитать куки можно либо в PHP с помощью глобального массива $_COOKIE, либо в Javascript с помощью document.cookie

Безопасность cookie

Главная угроза для cookie — это его кража. А если в украденном cookie хранится логин/пароль понятно, что это ничего хорошего не даст. Даже если пароль хранится в cookie в зашифрованном виде

  1. У злоумышленника есть шанс его расшифровать.
  2. В ряде случаев злоумышленник может использовать пароль не расшифровывая, просто подставив куки себе в браузер

В общем ничего хорошего. Но как могут украсть cookie?

1. Получив доступ к компьютеру пользователя.
Cookie хранятся в открытом виде на диске и злоумышленник может просто скопировать нужные файлы себе. И не обязательно он должен иметь физический доступ к компьютеру. Достаточно запустить пользователю хитрого трояна. Мораль: регулярно обновляйте свои антивирусы!

2. Использовав уязвимость браузера.
Нет-нет да появляются отчёты о найденных уязвимостях в браузерах, и далеко не все пользователи оперативно обновляют свои браузеры. Например, на данный момент всё ещё наблюдается огромное количество пользователей использующих MSIE 6-7.
Мораль: оперативно обновляйте свой браузер

3. XSS-уязвимость веб-приложения.
Как бы ни был защищён браузер, его назначение посылать куки доверенному сайту, и если на странице доверенного сайта злоумышленник смог внедрить вредоносный код, то куки имеют все шансы оказаться в недобрых руках.

Как внедрить код? Можно например попытаться вставить ссылку на javascript в комментах или в любом месте, где позволяется вставлять пользовательские данные.

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

Как работают СЕССИИ

Сессии тоже хранят данные пользователя, но в отличие от cookie делают это на стороне сервера. Это гораздо безопаснее. Сервер одновременно может хранить у себя данные о сессиях большого количества пользователей и для того чтобы правильно идентифицировать пользователя и дать ему нужный контекст сессии пользователь каким-то образом должен сообщить свой SID (Session ID). Самый распространённый путь — используя cookie. Хотя иногда встречаются реализации передачи сессии через URL и через hidden-поля формы.

На PHP есть отдельная библиотека для работы с сессиями описание здесь

Безопасность сессии. Захват SID

Для того, чтобы получить доступ к данным чужой сессии, можно послать запрос серверу, указав SID жертвы. Правда есть ограничения, например по времени сеанса, но это уже нюансы. Вот только как узнать SID ?

Вариант лобовой — кража cookie (см. выше). Причём нужно сделать это сразу же после входа пользователя на сайт, ибо сессии довольно быстро устаревают.

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

Безопасность сессии. Фиксация SID

А зачем угадывать SID , если можно навязать пользователю свой желаемый SID! Для этого достаточно создать у пользователя cookie с желаемым SID, после чего пользователь логинится на сайт. У PHP есть особенность, если клиент при соединении с сервером указывает несуществующий SID — PHP создаёт такую сессию, и вся дальнейшая работа продолжается с указанным SID. Такой приём называется фиксацией.

Как это можно сделать
1. с помощью Javascript
Достаточно ухитриться и заставить пользователя выполнить у себя команду вида.

document.cookie = "PHPSESSID=1234";

Команда создаст у пользователя куки. При этом команда должна быть с сайта жертвы. Как это сделать — опять же XSS. Кстати, имеет смысл сразу делать куки сроком жизни на пару лет вперёд. Также имеет смысл обратить внимание на атрибут domain. Иногда удаётся расширить домен и распространить действие куки на ряд сайтов со сходным доменом.

2. c помощью META-тегов

Очень часто сайты удачно вырезают javascript из посылаемых пользователем данных, но пропускают другие теги. Например мета-теги. Так что, тоже имеет шанс сработать. Кстати современные браузеры не имеют возможности запретить обработку метатегов, в отличие от javascript.

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

Как противодействовать угрозам

В первую очередь вебмастер должен проверить свой сайт на предмет XSS-уязвимостей. Каждое значение вводимое пользователем должно тщательно проверяться. Задача довольно трудная, но нужная. В идеале лучше вообще запретить использование html тегов для ненадёжных пользователей.

Во-вторых для избежания фиксации сессии достаточно каждый раз при логине пользователя регенерировать SID с помощью функции session_regenerate_id(). Проблема фиксации сессии отпадёт сама собой.

В-третьих постараться привязать сессию к конкретному IP. Штатного механизма для этого нет, но можно просто запоминать в той же сессии IP пользователя и постоянно его проверять. Этот шаг должен существенно усложнить кражу сессии

Вместо послесловия

Вот пока всё, что я нарыл, пропустил через себя и понял. Если есть что существенное добавить — добавляйте :)

Сессии. Cookies. Безопасность: 5 комментариев

  1. zeleboba

    Большое спасибо за изложение этих азбучных истин) Чтобы понять их по мануалам все не хватало времени. А у тебя получилось рассказать как-то проще. Для меня это было очень полезно.

  2. altesack Автор записи

    Ага. У меня тоже всё не хватало времени. Вот что-то припёрло — и быстренько начитался.

  3. zeleboba

    Ну, если чего-то еще будешь изучать, то потом рассказывай) У тебя получается гораздо понятнее, чем в мануалах. Да и, в конце концов, можно тебя вопросами засыпать :D

  4. Сергей

    Блин а как защетить кражу данных которые хранятся в сессия
    у меня походу крадут некоторые значения ! и принцеп краже тоже не могу понять! кто что знает про защиту и способы краж? Надо сделать механизм защиты!

  5. Дима

    Товарищи юзайте утиль drop my right и не болейте мозгом по поводу атак извне на ваши кукисы администрируйте вашу систему установите Ром Диск переместите папку для временных файлов интернетов туда изучайте и удаляйте ненужное или все сразу ставьте движок сайта word press с гибким и расширяемым функционалом безопасности вот и все дела Удачи при разборе завалов в мануалах)

Комментарии запрещены.