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

ЖАНРЫ

Техника сетевых атак
Шрифт:

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

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

карточки вместе с другими конфиденциальными данными, передаваемыми клиентом на сервер и даже исказить их!

Конечно, крупные on-line магазины, как правило, не содержат грубых ошибок. Но в сети огромное количество мелких поставщиков различного рода услуг, зачастую снабженных программным обеспечением, созданным «на коленках» Дядей Васей! Ошибки, описанные выше, очень характерны для кустарных разработок.

Врезка «информация»

Огромную опасность представляют недокументированные (или плохо документированные и малоизвестные) особенности интерпретаторов. И Perl в этом смысле не является исключением.

С его реализацией на платформе PC связан один громкий скандал. Фирма “Netscape” по некоторым причинам не поддержала в своем сервере ассоциации файловых расширений с исполняемыми приложениями. Вместо этого она предложила «волшебное» решение: вручную указывать требуемое приложение в самом URL. Так, например, вызвать “hello.pl” приходилось так: http://NetscapeServer/cgi-bin/perl.exe?hello.pl.

С первого взгляда ничем, кроме недовольного ворчания WEB-мастеров, это не чревато. Но уже беглое изучение документации по PC-версии Perl доказывает обратное. Особенность обработки командой строки приводит к тому, что на сервере может быть исполнена любая команда от имени интерпретатора. Достаточно воспользоваться конвейером, то есть конструкцией вида “| команда”.

Например, если набрать в командой строке “perl xxx|dir”, где ‘xxx’ имя любого, даже не обязательно существующего, скрипта, произойдет следующее: сперва, интерпретатором будет предпринята попытка запустить файл ‘xxx’, затем, независимо от успешности предыдущей операции, будет выполнена команда ‘dir’.

Врезка «замечание»

Выполнить любую команду Perl, например, ‘exec’ можно с помощью ключа командной строки, ‘-e’, о чем сообщается даже в короткой справке, выдаваемой при указании ключа ‘-h’ в командной строке.

Ниже приведен пример (на диске, прилагаемом к книге, он находится в файлах “/SRC/form.htm” и “/SRC/form.pl”) импровизированного виртуального магазина, занимающегося продажей товара через Internet c оплатой по кредитным карточкам. Перед первой покупкой посетителю (как это заведено в большинстве систем электронной торговли) необходимо зарегистрироваться - ввести свое имя и номер кредитной карты. Здесь не будет обсуждаться вопрос контроля достоверности представленной информации (это тема для отдельного разговора). Скрипт просто запоминает введенные сведения, и сверят всякий раз при загрузке.

· «HTML»

· «HEAD»

· «TITLE»VIRTUAL SHOP's "Hamburg"«/title»

· «META charset=windows-1251»

· «/HEAD»

·

· «BODY»

· «H1»«CENTER»VIRTUAL SHOP's "«U»Hamburg«/U»"«/CENTER»

· «HR»

· «/H1»

· «CENTER»

· «form method="POST" action="form.pl"»

· «br»Name:

· «BR»

· «input type="text" size="30" maxlength="300" name="name" value="Vasia"»

· «BR»

· «br»Credit card number:

· «BR»

· «input type="text" size="30" maxlength="30" name="card" value="OC271191"»

· «BR»

· «BR»

· «input type="submit" value="Welcome"»

· «/form»

· «/div»

· «HR»

· «/body»

·

· «/html»

·

· #!/usr/local/bin/perl

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

· print "«HEAD» «title»VIRTUAL SHOPs 'Hamburg'«/title»«/head»\n";

· print "«BODY» «H1»«CENTER»VIRTUAL SHOPs '«U»Hamburg«/U»'«/H1»«/CENTER»«HR»«BR»\n";

·

· parseparameters;

· $Name=$parameters{'name'};

· $Card=$parameters{'card'};

· $Passwd="None";

· $file="users.dat";

·

· open(F,"«$file") || die "File $file not exist!\n";

·

· while($f=«F»)

· {

· $tmp=«F»;

· if ("$Name\n"=~$f)

· {

· if ($tmp!~$Card)

· {

· print "«CENTER»«H1»Wrong Card Number«/H1»«HR»";

· die;

·}

·

· $Passwd=$tmp;

·}

·}

·

· if ($Passwd=~/None/)

· {

· open(F,"»$file");

· print F "$Name\n";

· print F "$Card\n";

· close(F);

· print "«B»New Buyer!«/B»«BR»\n";

·}

·

· print «EOF;

· Buyer:$Name

· «BR»

· Card:$Card

· «TABLE width=100% border=1»

· «TR»

· «TH»Product ID

· «TH»Product Name

· «TH»Purchase

· «TR»

· «TD»Y2ZA

Поделиться с друзьями: