Сессия
Атаки на сессию
Обычно выполняются за счет 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!”;
}