Предотвращение захвата сеанса


Как запретить нескольким клиентам использовать один и тот же идентификатор сеанса? Я спрашиваю об этом, потому что хочу добавить дополнительный уровень безопасности, чтобы предотвратить захват сеанса на моем веб-сайте. Если хакер каким-то образом выясняет идентификатор сеанса другого пользователя и делает запросы с этим SID, как я могу обнаружить, что на сервере есть разные клиенты, использующие один SID, а затем отклонить попытку захвата?

EDIT

Я принял ответ Гамбо после тщательное рассмотрение, потому что я пришел к пониманию того, что то, что я прошу, невозможно из-за ограничений a протокол HTTP без состояния. Я забыл о том, что, возможно, самый фундаментальный принцип HTTP, и теперь, когда я думаю об этом вопросе, кажется немного тривиальным.

Я уточнил что я имею в виду:

после входа пользователя A в систему example.com, ему дается некоторый случайный идентификатор сеанса, для простоты, пусть это будет'abc123'. Этот идентификатор сеанса хранится как файл cookie на стороне клиента и проверяется с помощью сеанса на стороне сервера, чтобы убедиться, что пользователь, который вошел в систему, остается в системе при переходе с одной веб-страницы на другую. Этот файл cookie, конечно, не должен был бы существовать, если бы HTTP не был безгосударственным. По этой причине, если пользователь B крадет SID пользователя A и создает файл cookie на своем компьютере со значением 'abc123', он бы успешно захватил сеанс пользователя A, но сервер просто не может законно распознать этого пользователя B запрос отличается от запросов пользователя A, и поэтому у сервера нет причин отклонять какой-либо запрос. Даже если мы должны были перечислить сеансы, которые уже были активны на сервере, и попытаться увидеть, обращается ли кто-то к сеансу, который уже активен, как мы можем определить, что это другой пользователь, который незаконно обращается к сеансу, а не тот же пользователь, который уже вошел в систему с идентификатором сеанса, но просто пытается сделать другой запрос с ним (т. е. перейти к другому пользователю страница.) Мы не можем проверить агента пользователя? Может быть обманут - но хорошо, как защита в глубине меры, тем не менее. IP-адрес? Может измениться по законным причинам-но вместо того, чтобы вообще не проверять IP-адрес, я предлагаю проверить что-то вроде первых двух октетов IP, так как даже пользователь в сети плана данных, у которого постоянно меняется IP по совершенно законным причинам, обычно будет иметь только последние два октета их изменения IP.

в сознании, это http без гражданства, который осуждает нас на то, что мы никогда не сможем полностью защитить наши веб-сайты от захвата сеанса, но хорошие практики (например, те, которые предоставил Гумбо) будут достаточно хороши, чтобы предотвратить значительное большинство атак сеанса. Поэтому попытка защитить сеансы от угона, отказав в нескольких запросах одного и того же SID, просто смехотворна и уничтожит всю цель сеансов.

8 57

8 ответов:

к сожалению, нет эффективного способа безошибочно идентифицировать запрос, который исходит от злоумышленника в противоположность подлинному запросу. Поскольку большинство свойств, которые проверяют меры счетчика, такие как IP-адрес или характеристики агента пользователя, либо ненадежны (IP-адрес может изменяться между несколькими запросами), либо могут быть легко подделаны (например, User-Agent заголовок запроса) и, таким образом, может привести к нежелательным ложным срабатываниям (т. е. подлинный IP-адрес пользователя) или ложным негативы (т. е. злоумышленник смог успешно подделать запрос с тем же User-Agent).

вот почему лучший способ предотвратить захват сеанса - убедиться, что злоумышленник не может узнать идентификатор сеанса другого пользователя. Это означает, что вы должны разработать приложение и его управление сеансами, что (1) злоумышленник не может угадать действительный идентификатор сеанса, используя достаточную энтропию, и (2) что нет другого способа для злоумышленника получить действительный идентификатор сеанса по известным атаки / вульерабельности, такие как обнюхивание сетевой связи, межсайтовые Скрипты, утечка через Referer и т. д.

тем не менее, вы должны:

  • используйте достаточно случайного ввода для генерации идентификатора сеанса (см. сессии.entropy_file,сессии.entropy_length и сессии.hash_function)
  • используйте HTTPS для защиты идентификатора сеанса во время передача
  • храните идентификатор сеанса в файле cookie, а не в URL, чтобы избежать утечки, хотя Referer (см. сессии.use_only_cookies)
  • установить cookie с помощью HttpOnly и Secure атрибуты для запрета доступа через JavaScript (в случае уязвимостей XSS) и для запрета передачи через небезопасный канал (см. сессии.cookie_httponly и сессии.cookie_secure)

кроме того, вы также должны восстановить идентификатор сеанса при аннулировании старого (см. session_regenerate_id функции) после определенных изменений состояния сеанса (например, подтверждение подлинности после входа в систему или изменения авторизации/привилегий), и вы можете дополнительно делать это периодически, чтобы сократить промежуток времени для успешной атаки на захват сеанса.

мы можем сделать что-то подобное.

хранить идентификатор сеанса в базе данных. Также сохраните Ip-адрес и HTTP_USER_AGENT для этого идентификатора сеанса. Теперь, когда запрос поступает на сервер, содержащий соответствующий идентификатор сеанса, Проверьте, из какого агента и ip он поступает в ваш скрипт.

может сделать эту работу funda путем создания общей функции или класса для сеанса, чтобы каждый запрос был проверен перед его обработкой. Это вряд ли займет несколько микросекунд. Но, если много пользователи посещают ваш сайт, и у вас есть огромная база данных сеансов, тогда это может быть небольшая проблема с производительностью. Но, это, безусловно, будет очень безопасно по сравнению с другими методами, такими как = > Использование сеансов регенерации.

при регенерации идентификаторов сеанса снова мало шансов на захват сеанса.

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

пожалуйста, поправьте меня, если я где-то ошибаюсь.

есть много стандартных средств защиты от захвата сессии. Один из них-сопоставить каждую сессию с одним IP-адресом.

другие схемы может использовать HMAC, созданный из:

  • сетевой адрес IP клиента
  • заголовок user-agent, отправленный клиентом
  • идентификатор
  • секретный ключ, хранящийся на сервере

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

конечно, чтобы действительно быть безопасным, вы действительно должны заставить SSL для всех запросов, чтобы SID не мог быть перехвачен потенциальными злоумышленниками в первую очередь. Но не все сайты делают это (::кашель:: Переполнение Стека ::кашель::).

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

одна из простых реализаций может быть выполнена путем создания таблицы в базе данных , как зарегистрированные пользователи , а затем при входе в систему обновите эту таблицу с именем пользователя и его SID, это предотвратит другие логины как тот же пользователь , теперь во время выхода из системы просто запустите простой запрос , который удаляет зарегистрированные данные в базе данных , это также может быть использовано для отслеживания зарегистрированного пользователя на веб-сайте ur одновременно .

очевидно, что когда вы установите cookie сеанса в браузере, этот cookie отправляется в запросе. Теперь, когда приходит запрос, сервер будет проверять идентификатор сеанса в базе данных и предоставлять доступ. Чтобы предотвратить это, важно только сохранить агент и ip, чтобы перед проверкой сервер удостоверился, что доступ к сеансам предоставлен уникальному клиенту, а не уникальному идентификатору сеанса, который может быть захвачен.

Я не знаю о кодировании части хорошо. Поэтому я могу сказать вам алгоритм, чтобы сделать это. Настройка материалов, таких как SSL, или установка cookie сеанса для защиты и httpOnly не будет работать, если пользователь нюхает идентификатор сеанса из локальной сети(при условии, что пользователь и злоумышленник находятся в одной локальной сети).

Итак, что вы можете сделать, как только пользователь успешно войдет в приложение, установите уникальный токен для каждой страницы веб-приложения и следите за этим на стороне сервера. Так что если действительный пользователь отправляет запрос на доступ к определенной странице, маркер этой страницы также будет отправлен на сторону сервера. Поскольку маркеры уникальны для пользователя для определенного сеанса, даже если злоумышленник может получить идентификатор сеанса, он не может захватить сеанс пользователей, поскольку он не может предоставить действительный маркер серверу.

@Anandu M Das:

Я считаю, что вы можете иметь в виду использование токенов сеанса с каждым идентификатором сеанса. Этот сайт может объяснить использование токенов с сеансами:

https://blog.whitehatsec.com/tag/session-token/

хотя токены сеанса легко компрометируются атакой XSS, это не означает, что они никогда не должны использоваться. Я имею в виду, давайте посмотрим правде в глаза, если что-то было скомпрометировано уязвимостью безопасности на сервере, это не вина метода, это вина программиста, который ввел эту уязвимость (чтобы выделить моменты, сделанные Хессоном и ладьей).

Если вы следуете надлежащим соглашениям и практикам безопасности и защищаете свой сайт от SQL-инъекции, XSS и требуете, чтобы все сеансы управлялись через HTTPS, то вы можете легко управлять потенциальной атакой из CSRF с помощью токенов на стороне сервера, хранящихся в сеансе и обновляемых каждый раз, когда пользователь будет вызывать манипуляцию с их помощью сессия (например, $_POST представляется). Кроме того, никогда не храните сеансы или их содержимое в url-адресе, независимо от того, насколько хорошо вы думаете, что они закодированы.

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