Сессия

Атаки на сессию

Обычно выполняются за счет cookie с украденным session id и локальным хранилищем данных, которое соответствует этому идентификатору сессии. Если идентификатор сессии скомпрометирован, или хранилище данных не является безопасным (/tmp на общей машине) сессии уязвимы для атак.

Session Fixation

  • Пользователь получает фиксированный идентификатор сессии.
  • Злоумышленник заставляет пользователя кликнуть по ссылке с зафиксированным идентификатором сессии.

Можно установить идентификатор сессии через строку запроса, чтобы присвоить юзеру определенную сессию. Чаще всего это достигается путем добавления идентификатора сессии к ссылке:

<a href="http://example.org/index.php?PHPSESSID=1234">
    Click here
</a>

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

Session Hijacking

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

  • Крадется session_id.
  • Выполняется с помощью ссылки или cookie, содержащей session_id.

Меры предостороженности

  • Использование хэш-значений для для важных данных (md5(), sha1()).
  • Использование crypt($string,$optional_salt) для хранения паролей.
  • Использование шифрования в одну сторону, основанное на стандартных Unix DES-based алгоритмах.
<?php
$hashed_password = crypt(‘mypassword’); 
if (crypt($user_input, $hashed_password) == $hashed_password) 
{ 
    echo “Password verified!”; 
}