Статьи ⇒ PHP ⇒ Захват сессии (Hijacking)

Захват сессии (Hijacking)

Опубликовано: 26 мар 2011 в 19:46
Автор: Chris Shiflett  Перевод: freeeeez 

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

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

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

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

Рассмотрим типичный 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

Наша цель в том, чтобы усложнить последовательность HTTP запросов для хакера без ущерба для обычного пользователя. Представим, что за предыдущим запросом следует запрос уже от другого браузера:

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, который связан с сессией. Это усложняет угон сессии, делая ее несколько более защищенной.

Хотя это легко обойти. Куки можно получить за счет использования уязвимостей браузеров, таких как EI. Далее следует направить жертву на сайт злоумышленника, чтобы получить правильный заголовок User-Agent. Так что следует усилить защиту от hijacking'а.

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

<?php

$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'SHIFLETT';

/* Add any other data that is consistent */

$fingerprint = md5($string);

?>

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

Если проверка не удалась, следует запрашивать пароль для дополнительной аутентификации. Тем самым если есть ошибки в механизме сессии, в результате которых пользователь подозревается в атаке, требуется ввод пароля перед продолжением работы. На самом деле, пользователи оценят такую заботу об их безопасности.

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

Источник: PHP Security Consortium внешняя ссылка
Тэги:  •  •  • 
Нет комментариев
6 031 просмотр


Оставить комментарий:

Имя:
Email:
Сайт:
Комментарий:

Допустимые теги: <em> • <strong> • <u> • <sub> • <sup> • <blockquote>

Проверочный код:

Введите проверочный код, для подтверждения, что вы не робот.
P.S. Если вы робот, то, к сожалению, вы
не сможете прочитать символы с картинки.