E-mail Пароль
Забыли пароль?
Ardzo.Serenity - защита сайта от вирусов, троянов и внедрений

Захват сессий при атаке и взломе сайта

К списку статей

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

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

Рассмотрим на простом примере, как злоумышленники могут попробовать захватить сессию. Допустим, есть HTTP-запрос от пользователя:

GET / HTTP/1.1
Host: example.org
User-Agent: Mozilla/5.0 Gecko
Accept: text/xml, image/png, image/jpeg, image/gif, */*
Cookie: PHPSESSID=1234
И тут же приходит похожий запрос от другого пользователя в таком виде:
GET / HTTP/1.1
Host: example.org
User-Agent: Mozilla Compatible (MSIE)
Accept: text/xml, image/png, image/jpeg, image/gif, */*
Cookie: PHPSESSID=1234
Здесь видно, что куки одни и те же у обоих запросов, но пользователи, скорее всего разные. Ведь браузер не станет сам менять User-Agent между двумя запросами. Что бы разобраться в этом, нужно провести дополнительную процедуру проверки:
< ?php
session_start();

if (isset($_SESSION['HTTP_USER_AGENT']))
{
    if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
    {
        /* Prompt for password */
        exit;
    }
}
else
{
    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
}
?>
Хакеру теперь нужно будет узнать не только правильный идентификатор сессии, но и нужный User-Agent пользователя, что создает дополнительные затруднения для него. Хотя при большой напористости хакер может направить пользователя на подконтрольный ему сайт для получения User-Agent, а его куки получить, эксплуатируя уязвимости браузера, в особенности если это IE.

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

< ?php
$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'SHIFLETT';

/* Add any other data that is consistent */

$fingerprint = md5($string);
?>
Если такой маркер будет находиться во всех URL, и будет просто необходим для продолжения сессии наравне с самим идентификатором сессии, это повысит на порядок безопасность.

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