Разработка системы обнаружения атак веб-приложений на языке PHP

Изучение архитектуры современных веб-приложений, анализ проблем их информационной безопасности. Классификация систем обнаружения атак. Проектирование программного обеспечения для системы обнаружения атак веб-приложений на языке программирования PHP.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 30.06.2011
Размер файла 3,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

ВВЕДЕНИЕ

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

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

Тема информационной безопасности в веб-сфере крайне актуальна, так как обеспечение достаточного уровня защиты является неотъемлемой частью жизненного цикла любой системы, в том числе и веб-систем.

Целью настоящего дипломного проекта является разработка системы обнаружения атак веб-приложений на языке PHP, которая является одним из составляющих элементов, необходимых для создания качественного уровня защиты. Для полноценного охвата поставленной цели необходимо проанализировать существующие актуальные атаки, направленные на веб-приложения, а также системы, которые способны их обнаруживать. Выявить достоинства и недостатки существующих решений. Результатом данного дипломного проекта должна быть система обнаружения атак на веб_приложения, разработанная на языке PHP, в основе которой будет более лучшее решение, устраняющее полностью или частично выявленные недостатки существующих систем.

информационная безопасность атака программная

1 ИССЛЕДОВАНИЕ АКТУАЛЬНЫХ АТАК НА ВЕБ-ПРИЛОЖЕНИЯ И АНАЛИЗ СУЩЕСВУЮЩИХ СИСТЕМ ИХ ОБНАРУЖЕНИЯ

1.1 Архитектура современных веб-приложений

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

Сетевое взаимодействие в глобальной сети Интернет основано на технологии «клиент-сервер».

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

Серверная часть получает запрос от клиента, выполняет вычисления, после этого формирует веб-страницу и отправляет её клиенту по сети. Роль сервера выполняет так называемый веб-сервер - специальное программное обеспечение, обрабатывающее запросы клиентов и возвращающее ответы. Веб-сервер как известно, это основа глобальной сети Интернет [8].

В настоящее время одним из самых популярных является свободный веб-сервер - Apache.

Взаимодействие клиента и сервера основано на сетевом протоколе HTTP (сокр. от англ. HyperText Transfer Protocol - «протокол передачи гипертекста») - протоколе прикладного уровня передачи данных. Основой HTTP является указанная ранее технология «клиент-сервер», то есть предполагается существование потребителей (клиентов), которые инициируют соединение и посылают запрос, и поставщиков (серверов), которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом. HTTP в настоящее время повсеместно используется во Всемирной паутине для получения информации с веб-сайтов.

Веб-сайт, в широком смысле, это совокупность электронных документов (файлов) частного лица или организации в компьютерной сети, объединённая под одним адресом доменного имени.

Основным объектом манипуляции в HTTP является ресурс, на который указывает URI (англ. Uniform Resource Identifier) в запросе клиента. Обычно такими ресурсами являются хранящиеся на сервере файлы, но ими могут быть и логические объекты. Особенностью протокола HTTP является возможность указать в запросе и ответе способ представления одного и того же ресурса по различным параметрам: формату, кодировке, языку и т.д. Именно благодаря возможности указания способа кодирования сообщения, клиент и сервер могут обмениваться двоичными данными, хотя данный протокол является текстовым.

HTTP является протоколом прикладного уровня, аналогичными ему являются FTP и SMTP. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ».

Для идентификации ресурсов HTTP использует глобальные URI. В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ». Компоненты, использующие HTTP, могут самостоятельно осуществлять сохранение информации о состоянии, связанной с последними запросами и ответами. Браузер, посылающий запросы, может отслеживать задержки ответов. Сервер может хранить IP-адреса и заголовки запросов последних клиентов. Однако сам протокол не осведомлён о предыдущих запросах и ответах, в нём не предусмотрена внутренняя поддержка состояния, к нему не предъявляются такие требования [9].

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

Метод GET используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?».

Согласно стандарту HTTP, запросы типа GET считаются идемпотентными - многократное повторение одного и того же запроса GET должно приводить к одинаковым результатам (при условии, что сам ресурс не изменился за время между запросами). Это позволяет кэшировать ответы на запросы GET.

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

В отличие от метода GET, метод POST не считается идемпотентным, то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты (например, после каждой отправки комментария будет появляться одна копия этого комментария).

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

PHP (от англ. PHP: Hypertext Preprocessor - «PHP: препроцессор гипертекста» - «Инструменты для создания персональных веб-страниц») - скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяющихся для создания динамических веб-сайтов. Язык и его интерпретатор разрабатываются группой энтузиастов в рамках проекта с открытым кодом.

Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств для разработки веб-приложений.

Основные из них:

- автоматическое извлечение POST и GET-параметров, а также переменных окружения веб-сервера в предопределённые массивы;

- взаимодействие с большим количеством различных систем управления базами данных (MySQL, MySQLi, SQLite, PostgreSQL, Oracle (OCI8), Oracle, Microsoft SQL Server, Sybase, ODBC, mSQL, IBM DB2, Интерфейс PDO и др.);

- автоматизированная отправка HTTP-заголовков;

- работа с HTTP-авторизацией;

- работа с Cookies и сессиями;

- работа с локальными и удалёнными файлами, сокетами;

- обработка файлов, загружаемых на сервер;

- работа с XForms.

В настоящее время PHP используется сотнями тысяч разработчиков. Согласно рейтингу корпорации TIOBE, базирующемся на данных поисковых систем, в апреле 2011 года PHP находился на 5 месте среди языков программирования. К крупнейшим сайтам, использующим PHP, относятся Facebook, ВКонтакте, Wikipedia и др.

Как было отмечено выше, хранение массивов данных осуществляется на сервере, для этого используются системы управления базами данных (СУБД) - совокупность программных и лингвистических средств общего или специального назначения, обеспечивающих управление созданием и использованием баз данных. Наиболее распространенной СУБД использующейся для построения веб-приложений является свободная система управления базами данных MySQL [10].

MySQL является собственностью компании Oracle Corporation, получившей её вместе с поглощённой Sun Microsystems, осуществлявшей разработку и поддержку приложения. Данная СУБД сочетает в себе производительность, высокую надежность, простоту в использовании и большие возможности экономии. Благодаря этому MySQL является самой популярной в мире СУБД и надежной альтернативой проприетарному ПО для управления базами данных.

Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы. Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц [11].

Процесс управления данными (выборка, добавление, изменение, удаление), который происходит при взаимодействии между веб-приложением и СУБД осуществляется при помощи специального универсального языка запросов, который применяется для создания, модификации и управления данными в базах данных - SQL (англ. Structured Query Language - «язык структурированных запросов»).

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

Система управления содержимым (контентом) (англ. Content management system, CMS) - информационная система или компьютерная программа, используемая для обеспечения и организации совместного процесса создания, редактирования и управления контентом (то есть содержимым). Главной целью такой системы является возможность собирать в единое целое и объединять на основе ролей и задач все разнотипные источники знаний и информации, доступные как внутри организации, так и за ее пределами, а также возможность обеспечения взаимодействия сотрудников, рабочих групп и проектов с созданными ими базами знаний, информацией и данными так, чтобы их легко можно было найти, извлечь и повторно использовать привычным для пользователя образом.

В системе управления содержимым могут быть определены самые различные данные: документы, фильмы, фотографии, номера телефонов, научные данные и так далее. Такая система часто используется для хранения, управления, пересмотра и публикации документации. Контроль версий является одним из основных её преимуществ, когда содержимое изменяется группой лиц.

В общем случае системы управления содержимым делятся на:

- систему управления содержанием масштаба предприятия (англ. Enterprise Content Management System);

- система управления веб-содержимым (англ. Web Content Management System).

В силу того, что ECMS имеют глубокую внутреннюю классификацию по предметным областям (HRM, DMS, CRM, ERP и т.д.) термин CMS заместил собой WCMS, превратившись в синоним системы управления сайтами. Подобные CMS позволяют управлять текстовым и графическим наполнением веб-сайта, предоставляя пользователю интерфейс для работы с содержимым сайта, удобные инструменты хранения и публикации информации, автоматизируя процессы размещения информации в базах данных и её выдачи в HTML.

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

1. Генерация страниц по запросу. Системы такого типа работают на основе связки «Модуль редактирования - База данных - Модуль представления». Модуль представления генерирует страницу с содержанием при запросе на него, на основе информации из базы данных. Информация в базе данных изменяется с помощью модуля редактирования. Страницы заново создаются сервером при каждом запросе, что в свою очередь создаёт дополнительную нагрузку на системные ресурсы. Нагрузка может быть многократно снижена при использовании средств кэширования, которые имеются в современных веб-серверах.

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

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

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

1.2 Анализ проблем информационной безопасности веб-приложений

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

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

1. Систему управления контентом (CMS) - непосредственно само веб-приложение.

2. Веб-сервер - необходимый для работы веб-приложения и взаимодействия с браузерами клиентов.

3. Сервер СУБД - необходимый для хранения данных веб-приложения.

4. HTTP Прокси-сервер - необходимый для уменьшения нагрузки на веб-сервер.

5. FTP-сервер - необходимый для удаленного доступа к файлам и скриптам веб-приложения.

6. Почтовый сервер - необходимый для получения и отправки почтовых сообщений клиентам (пользователям).

Совокупность всех компонентов составляющих инфраструктуру веб-приложений представлена на рисунке 1.1.

Рисунок 1.1 - Инфраструктура современного веб-приложения

Каждый из этих компонентов может содержать различного рода уязвимости и нарушение работоспособности одного из них может привести к полному или частичному нарушению функционирования веб-приложения, что может привести к значительным убыткам компаний. Поэтому для обеспечения безопасности веб-приложения необходимо следить за уровнем безопасности каждого компонента инфраструктуры [12].

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

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

Злоумышленник находит уязвимость в веб-приложении, проводит атаку на получения доступа к нему (как правило, получение пароля администратора), далее злоумышленник, пользуясь привилегиями прав администратора, пытается загрузить на сервер веб-шелл (специальный скрипт позволяющий получить контроль над сервером). Загрузив веб-шелл, злоумышленник может получить информацию об установленном на сервере ПО, такую как версия интерпретатора PHP, включенные параметры, модули и функции. Кроме того, большинство хостинг-компаний используют в качестве серверной ОС Linux. Как известно в ОС Linux наиболее уязвимым элементом является ядро, чем может воспользоваться злоумышленник. Узнав версию ядра, злоумышленник ищет информацию об уязвимостях данного ядра. В глобальной сети Интернет, как правило, кроме информации об уязвимостях в публичный доступ предоставляется эксплоит (компьютерная программа, фрагмент программного кода или последовательность команд, использующие уязвимости в программном обеспечении и применяемые для проведения атаки на вычислительную систему), который позволяет эксплуатировать данную уязвимость и повысить права в системе. Таким образом, веб-приложение является первым уязвимым звеном, которое потенциально может позволить злоумышленнику получить доступ над всем сервером [13].

Компанией White Hat Security было проведено исследование более 3000 веб-сайтов на выявление уязвимостей и сбора статистических данных. Общая статистика выявленных уязвимостей в 2011 году представлена на рисунке 1.2.

Представленные уязвимости являются неновыми, тем не менее, они не теряют своей актуальности в и современное время.

Рисунок 1.2 - Статистика уязвимостей веб-сайтов в 2011 году

Рассмотрим подробно наиболее актуальные и популярные уязвимости веб-приложений, которые может эксплуатировать злоумышленник:

1) SQL-инъекция - один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода. Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере. Атака типа SQL-инъекция может быть возможна из-за некорректной обработки входных данных, используемых в SQL-запросах.

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

В MySQL есть специальный символ, обозначающий комментарий - это «--» который может использоваться непосредственно в SQL-запросе, таким образом наличие уязвимости SQL-инъекция позволяет злоумышленнику внедрять свой произвольный SQL запрос, изменяя оригинальный запрос и получать данные из базы данных. Следовательно, злоумышленник может потенциально получить идентификационные данные всех пользователей, зарегистрированных в базе данных [14].

Когда злоумышленник пытается выполнить атаку SQL-инъекция, сервер возвращает сообщения об ошибках, что синтаксис SQL-запроса является некорректным. Но существует случай, когда при попытке провести SQL-инъекцию, злоумышленник не получает сообщения об ошибках, что довольно сильно затрудняет проведения данной атаки, тем не менее это не делает ее проведение невозможным. Такой вид атаки называется Blind SQL-injection (Слепая SQL-инъекция). В данном случае злоумышленник может попытаться провести ряд SQL-запросов, основанных на логических условиях и также несанкционированно получить информацию из базы данных MySQL.

В этом случае проведение такого рода атаки сводится к манипуляции логикой SQL-запросов, то есть передаче уязвимому скрипту корректных и некорректных логических конструкций для получения данных из таблиц MySQL.

Защита от уязвимостей такого вида основывается на фильтрации входящих параметров, а именно:

- фильтрация строковых параметров;

- фильтрация числовых параметров.

Для фильтрации входящих строковых параметров необходимо применить PHP функцию mysql_real_escape_string (string $unescaped_string). Данная функция осуществляет экранирование специальных символов (x00, \n, \r, \, ', " и \x1a.) в строке данных, экранирование заключается в добавление символа «обратного слеша» - «\». Таким образом, экранируя специальные символы, т.е. меняя их специальное значение, данная функция обеспечивает безопасность строковых данных. Пример использования данной функции представлен в приложении [А].

Кроме строковых параметров веб-приложению могут передаваться числовые данные и, как правило, это целые числа. Для защиты от нарушения логики SQL-запроса и проведения SQL-атаки через числовой параметр необходимо использовать PHP-функцию intval (mixed $var). Смысл использования данной функции заключается в том, что она возвращает целое число из входящей переменной и в том случае, если злоумышленник попытается нарушить логику SQL-запроса, вводя специальные символы или другие данные, данная функция все равно будет возвращать целое число и логика запроса не нарушится. Пример использования данной функции представлен в приложении [А].

Многие сервера баз данных поддерживают возможность отправки параметризованных запросов (подготовленные выражения). При этом параметры внешнего происхождения отправляются на сервер отдельно от самого запроса либо автоматически экранируются клиентской библиотекой. В ядро PHP, начиная с версии 5.1, включено специальное расширение - PDO.

PHP Data Objects (PDO) - расширение для PHP, предоставляющее разработчику простой и универсальный интерфейс для доступа к различным базам данных.

PDO предлагает единые методы для работы с различными базами данных, хотя текст запросов может немного отличаться. Так как многие СУБД реализуют свой диалект SQL, который в той или иной мере поддерживает стандарты ANSI и ISO, то при использовании простых запросов можно добиться совместимости между различными языками. На практике это означает, что можно достаточно легко перейти на другую СУБД, при этом не меняя или незначительно изменяя код программы [15].

PDO не использует абстрактных слоёв для подключения к БД, наподобие ODBC, а использует для разных БД их «родные» драйверы, что позволяет добиться высокой производительности. В настоящее время для PDO существуют драйверы практически ко всем общеизвестным СУБД и интерфейсам. Впрочем, есть и драйвер для подключения к ODBC.

Параметризованные запросы имеют два основных преимущества:

1. SQL-запрос должен быть обработан (или подготовлен) только один раз, при этом он может быть выполнен с теми же или другими параметрами. Когда запрос подготовлен, СУБД будет анализировать, обобщать и оптимизировать выполнение запроса. Для сложных запросов этот процесс может быть весьма ощутим, особенно если запрос необходимо выполнять несколько раз с разными параметрами. Использование параметризованных запросов позволяет избежать необходимость выполнения этих операций для каждого запроса, тем самым увеличивается производительность и быстрота выполнения запросов.

2. Параметры, которые предаются в параметризованных запросах, не нужно обрамлять кавычками. Драйвер автоматически производит это. Если запросы в веб-приложении строятся на основе параметризованных запросах, то разработчик может иметь большую уверенность, что SQL-инъекцию произвести будет невозможно (однако, если в веб-приложении имеются места, где параметризованные запросы не используются или запросы не фильтруются, то проведение SQL-инъекции остается потенциально возможным). Пример составления запроса с использованием PDO приведен в приложении [А].

2) XSS (англ. Сross Site Sсriрting - «межсайтовый скриптинг») - тип уязвимости интерактивных информационных систем в веб-сфере. XSS возникает, когда в генерируемые сервером страницы по какой-то причине попадают пользовательские скрипты. Специфика подобных атак заключается в том, что вместо непосредственной атаки сервера они используют уязвимый сервер в качестве средства атаки на клиента.

Для данного термина используют сокращение «XSS», чтобы не было путаницы с каскадными таблицами стилей, использующих сокращение «CSS».

Условно XSS можно разделить на активные и пассивные.

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

При активных XSS вредоносный скрипт хранится на сервере, и срабатывает в браузере жертвы при открытии какой-либо страницы заражённого сайта. Их также называют вторым типом XSS.

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

JavaScript - объектно-ориентированный скриптовый язык программирования. Является диалектом языка ECMAScript.

JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам [16].

Основные архитектурные черты: динамическая типизация, слабая типизация, автоматическое управление памятью, прототипное программирование, функции как объекты первого класса.

На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java, но при этом лёгким для использования непрограммистами. Языком JavaScript не владеет какая-либо компания или организация, что отличает его от ряда языков программирования, используемых в веб-разработке.

JavaScript позволяет потенциальным авторам вредоносного кода запускать его на любом компьютере сети: для этого достаточно открыть на нём веб-страницу. Это обуславливает наличие двух принципиальных ограничений:

- JavaScript-программы выполняются в песочнице, в которой они могут выполнять только ограниченный круг действий, а не задачи программирования общего назначения (например, создание файлов, работа с сокетами),

- для JavaScript-кода применяется политика общего происхождения, в соответствии с которой скрипт, встроенный в страницу, не может получить доступ к ряду свойств объектов другой страницы (в частности, к большинству свойств объекта document) при отличии в протоколе, хосте и номере порта этих страниц.

Помимо этого, разработчики браузеров вносят дополнительные ограничения в ответ на имеющие место злоупотребления. Так появился, в частности, запрет на открытие окна, размер одной стороны которого меньше ста пикселей [17].

Самым простым способом обнаружения данной уязвимости является передача в точки входа информации php-скрипту конструкции вида:

<script>alert();</script>

Теги <script></script> указывают браузеру на выполнение JavaScript, расположенного между этими тегами, функция alert(); выводит сообщения, таким образом, если выполнится хотя бы данный элементарный код на языке JavaScript, то php-скрипт, входящий в состав веб-приложения является потенциально уязвимым и фактически позволяет выполнить любой произвольный код на языке JavaScript.

Наиболее распространенной целью эксплуатации злоумышленником уязвимости XSS является кража HTTP Cookie.

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

- аутентификации пользователя;

- хранения персональных предпочтений и настроек пользователя;

- отслеживания состояния сессии доступа пользователя;

- ведения статистики о пользователях.

Как и атака типа SQL-инъекция, XSS также основана на нефильтрации передаваемых php-скрипту параметров. Соответственно защита от подобного рода атак должна строиться на применение фильтрующей обработки всех входящих данных.

Существуют следующие основные способы фильтрации данных:

- обработка всех HTML тегов и замена их аналогами во входящих параметрах;

- обработка всех пользовательских URI;

- прогнозирование действий, которые следует ожидать от пользователя.

Обработку всех HTML тегов и замена их безвредными аналогами во входящих параметрах осуществляет php-функция htmlentities (string $string). Существует почти аналогичная функция htmlspecialchars (string $string), которая является более ограниченной и ее применение не рекомендуется.

Фрагмент кода, демонстрирующий применение данной функции, приведен в приложении [А].

Если позволить пользователям указывать их собственные URI (например, указать персональный аватар, загружать изображения), то необходимо быть уверенным, что они не могут использовать URI, «зараженный» javascript: или vbscript: спецификациями. PHP функция parse_url() осуществляет разбиение URI в ассоциативный массив по частям. Используя данную функцию можно легко проверить URI (к примеру, допустимыми могут быть http: или ftp: и недопустимыми javascript:). Другим способом применения данной функции является проверка доверенных доменов, если необходимо ограничить возможность указывать любые URI. Кроме того, одним из способов защиты является создание специальных поддоменов, на которых будут осуществляться критические, с точки зрения безопасности, операции (например bank.site.ru, private.site.ru) и к которым доступ пользователь будет получать после прохождения процесса авторизации.

Как правило, можно определить из текущего запроса ограниченное количество действий, которое пользователь может осуществить на следующем этапе. Например, пользователь может редактировать как-то документ, тогда ожидаемыми действиями могут быть либо сохранение результата, либо отмена всех внесенных изменений. Такая система прогнозирования действий пользователя может помочь при обнаружении и предотвращении атак типа XSS. Данная система может быть построена, к примеру, по следующему принципу: для каждого запроса сгенерировать все возможные URI, которые ожидаются от следующего действия пользователя в виде строки или хеша в сессии. Далее сравнить следующий запрос пользователя со значениями в сгенерированном массиве, при этом, если нет совпадений необходимо использовать некоторую логику (полностью зависит от структуры и логики самого приложения), которая сможет определить является ли запрашиваемый URI безопасным, возможно пользователь просто перешел из другой части сайта и не собирается производить каких-либо злоумышленных действий [18].

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

3) CSRF (англ. Сross Site Request Forgery - «Подделка межсайтовых запросов», также известен как XSRF) - вид атак на посетителей веб-сайтов, использующий недостатки протокола HTTP. Если жертва заходит на сайт, созданный злоумышленником, от её лица тайно отправляется запрос на другой сервер (например, на сервер платёжной системы), осуществляющий некую вредоносную операцию (например, перевод денег на счёт злоумышленника). Для осуществления данной атаки, жертва должна быть авторизована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, который не может быть проигнорирован или подделан атакующим скриптом.

Данный тип атак, вопреки распространённому заблуждению, появился достаточно давно: первые теоретические рассуждения появились в 1988 году, а первые уязвимости были обнаружены в 2000 году.

Одно из применений CSRF - эксплуатация пассивных XSS, обнаруженных на другом сервере. Так же возможны отправка писем (спам) от лица жертвы и изменение каких-либо настроек учётных записей на других сайтах (например, секретного вопроса для восстановления пароля) [19].

Наиболее простым для понимания способом защиты от данного типа атак, является механизм, когда веб-сайты должны требовать подтверждения большинства действий пользователя и проверять поле HTTP_REFERER, если оно указано в запросе.

Однако этот механизм имеет ряд недостатков. Во-первых, перед разработчиком встает вопрос об обработке запросов, не имеющих заголовка Referer как такового. Многие из персональных межсетевых экранов и анонимизирующих proxy-серверов вырезают Referer, как потенциально небезопасный заголовок. Соответственно, если сервер будет игнорировать подобные запросы, группа наиболее «параноидально» настроенных граждан не смогут с ним работать. Во-вторых, в некоторых ситуациях заголовок Referer может быть подделан. Уязвимость заключается в возможности использования символов перевода строки в имени HTTP-метода, что позволяет изменять заголовки и даже внедрять дополнительный запрос. Ограничением этого метода является то, что он работает только в случае наличия между пользователем и сервером HTTP-Proxy или размещения серверов на одном IP-адресе, но с разными доменными именами.

Другим распространённым способом защиты является механизм, когда с каждой сессией пользователя ассоциируется дополнительный секретный ключ, предназначенный для выполнения POST-запросов. Пользователь посылает этот ключ внутри тела каждого POST-запроса, при выполнении каких-либо действий, а сервер проверяет этот ключ. Преимуществом данного механизма является отсутствие необходимости осуществлять парсинг поля HTTP_REFERER, а значит и нет необходимости учитывать множество нюансов, возможных вариантов присутствия или отсутствия различных элементов этого поля. Недостатками же являются: требование возможности организации пользовательских сессий и требование динамической генерации HTML-кода активных страниц сайта [20].

4) PHP-инъекция (англ. Remote File Inclusion - «Удаленное выполнение произвольного кода») - один из способов взлома веб-сайтов, работающих на PHP, заключающийся в выполнении постороннего кода на серверной стороне.

Целью удаленного выполнения атаки - получение контроля над веб-приложением и выполнения произвольных команд через скриптовый интерфейс. Один из таких общих интерфейсов для многих php-приложений является шаблонная система. Шаблонная система предоставляет механизм, посредством которого шаблонные заполнители разметки страницы заменяются действительными значениями php-приложения. Один из простых способов реализации такой системы, это использовать нотацию объявления переменных в языке PHP в шаблоне, а затем передать код шаблона php-функции eval(), чтобы значения переменных шаблона заменились соответствующими значениями. Но в этом случае злоумышленник может просто вставить php-код в представленный текст и шаблонная система выполнит (интерпретирует как php-код) его.

PHP предоставляет несколько разных способов подключения скрипов и выполнения кода, содержащегося в них, в том числе и команд командной оболочки. Это означает, что разработчики должны предпринимать специальные меры предосторожности и фильтрации входящих параметров, значений базы данных и других не доверенных входящих параметров перед передачей этих данных на выполнение или обработку веб-приложением [21].

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

- функции include() и require();

- функция eval();

- функция preg_replace() с шаблонным модификатором e;

- скриптовые шаблоны (шаблонизаторы).

Эксплуатируя данную уязвимость, существует возможность исполнения произвольного PHP-кода, а также чтения любых доступных файлов на веб-сервере, что в свою очередь позволяет получить контроль над веб-сервером. Рассмотрим данную уязвимость наглядно на примере php-скрипта, содержащего следующую строку:

<?php if(!empty($_GET['page'])) include($_GET['page']); ?>

В данной строке происходит проверка переменной, полученной из HTTP GET параметра pаgе, и, если переменная не пустая, то происходит подключение и выполнение файла с именем, хранящимся в качестве значения этой переменной. Следует обратить внимание на то, что расширение подключаемого файла не имеет значения. Любой файл с любым расширением будет подключен и выполнен как РНР-скрипт, при этом выполнен будет только код, заключенный в теги РНР (<?php...?>), все остальное будет отображено в браузере в текстовом виде.

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

<?php include($_GET['page'].".txt");?>

В этом случае, применяется классический прием отбрасывания расширения подключаемого файла с использованием «ядовитого нуля» (символа конца строки с кодом %00), основанный на том, что функции include(), require(), include_once(), require_once() не являются бинарно безопасными.

index.php?page=/etc/passwd%00 соответствует include(/etc/passwd)

Однако, при включенной директиве интерпретатора PHP magic_quotes_gpc = ON, используемый в таких целях «ядовитый ноль» подвергается экранированию и, как следствие, становится неэффективным:

index.php?page=/etc/passwd%00 соответствует include(/etc/passwd\0)

В такой ситуации, также существует возможность реализовать внедрение произвольного PHP-кода с использованием двух особенностей в функциях PHP, используемых для взаимодействия с файловой системой:

1. Нормализация пути. Интерпретатор PHP обрабатывает строку, содержащую путь до файла или папки, особым образом, в частности лишние символы «/» и «/.» удаляются.

2. Усечение пути. Интерпретатор PHP в зависимости от платформы имеет ограничение на длину пути, определяемое константой MAX_PATH, в результате чего все символы, находящиеся за пределами этого значения, отбрасываются.

В результате можно составить запрос, содержащий в передаваемом серверу параметре необходимое число символов «/» или «/.»:

index.php?page=/etc/passwd//[…]// соответствует include(/etc/passwd)

Количество символов «/» отличается на разных платформах, но в большинстве случаев максимальная длина полного пути (т.е. после преобразования относительного в абсолютный путь) равна 4096 байт.

Кроме того, существует локальное внедрение PHP-кода ( анг. Local PHP Include) - это уязвимость, позволяющая выполнять в качестве PHP-скрипта любой доступный на чтение файл, расположенный на удаленном сервере.

Встречаются ситуации, когда в приложении существует фильтрация удаленного подключения с использованием протоколов HTTP и FTP.

В этом случае можно воспользоваться тем, что реализации функций include(), require(), include_once(), require_once() позволяют подключать и исполнять файлы, доступные на удаленном сервере не только по протоколам HTTP и FTP, но и по протоколам HTTPS, FTPS и TFTP, что не отражено в официальной документации.

index.php?page=https://site/shell.php? соответствует

include(https://site/shell.php)

В некоторых случаях, например, когда фильтрация на уровне mod_rewrite в .htaccess, можно воспользоваться способом с применением URL ENCODE

index.php?page=%68ttp://site/shell.php? соответствует

include(http://site/shell.php)

Существуют следующие подходы по обеспечению безопасности веб-приложения против атак типа PHP-инъекция:

- ограничение списка допустимых расширений загружаемых файлов;

- фильтрация посторонних символов в подключаемом файле;

- фильтрация допустимых значений подключаемых файлов.

Если в приложении предусмотрена загрузка каких-либо файлов (графических, текстовых и т.д.), при этом не осуществляется контроль допустимых расширений, злоумышленник может воспользоваться этим и под видом, к примеру, своего фото, может загрузить php-скрипт (веб-шелл), который позволит ему получить полный контроль над веб-приложением.

Одним из решений данной проблемы является определение массива, который будет определять список допустимых расширений и при загрузке информации будет осуществляться контроль, при этом если расширение не является допустимым, то оно может быть переименовано во что-то нейтральное, к примеру (.upload) и при этом пользователю будет выведено соответствующее сообщение или загрузка данного файла будет отклонена [32].

Другим решением может являться информация Content-Type, которую посылает браузер при загрузке файлов и доступ к которому можно получить, используя значение глобального массива $_FILES[$name]['type']. Хотя при этом нет способа точно узнать является MIME тип файла правильным, так как он может быть поддельным, тем не менее, данный способ может тоже помочь при контроле допустимых расширений [22].

Фильтрацию посторонних символов, которые могут быть потенциально опасными можно осуществить разными способами, одним из них может быть пример, приведенный в приложении [А].

Фильтрацию допустимых значений переменной, содержащей информацию о подключаемом файле, можно осуществить, например как показано в приложении [А].

Самым рекомендуемым подходом по повышению уровня защиты от данного вида атак является исключение динамического подключения файлов.

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

Рисунок 1.3 - Актуальные атаки на веб-приложения

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

Для обеспечения более высокого и качественного уровня безопасности веб-приложений используются системы обнаружения атак [23].

Система обнаружения атак (СОА) - это программное или аппаратное средство, предназначенное для обнаружения вредоносной активности, которая может нарушить безопасность компьютерной системы.

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

1.3 Классификация систем обнаружения атак веб-приложений

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

СОА являются дополнительным элементом при построении системы, которая обеспечивает безопасность сети или компьютерной системы, а также дополнительным рубежом перед злоумышленниками [24].

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

Как правило, различают два типа систем:

- локальные СОА;

- сетевые СОА.

Рассмотрим подробнее каждый тип с указанием основных достоинств и недостатков.

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

Целью локальной СОА является слежение за всеми событиями, происходящими в компьютерной системе и проверка их на соответствие модели безопасности. В то время, как сетевая СОА отслеживает проходящие сетевые пакеты, локальная система обнаружения атак проверяет, какая программа обращается к каким ресурсам. Локальная СОА просто ведет наблюдение за текущим состоянием системы, за хранимой информацией (как в оперативной памяти, так и в файловой системе), за данными системных журналов и проверяет, насколько это состояние соответствует «нормальному».

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

Таблица 1.1 - Преимущества и недостатки локальных систем обнаружения атак

Преимущества

Недостатки

Могут обнаруживать атаки, которые могу не видеть сетевые СОА

Трудны в управлении

Отслеживание и анализирование производимых приложением или ОС действий (процессов)

Могут влиять на производительности системы

Не нужно дополнительное оборудование для установки

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

Сетевая СОА просматривает все входящие пакеты на наличие в них подозрительных признаков. Если, например, обнаружено большое количество запросов на TCP соединение с широким диапазоном различных портов, то, вероятней всего, проводится сканирование портов.

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

Сетевые СОА пытаются обнаружить атаки, анализируя совпадения с шаблонами подозрительной активности в сетевом трафике. Сетевые системы обнаружения атак, как правило, могу хорошо распознавать атаки, требующие низкого уровня воздействия на сеть. Этот тип СОА может также противостоять атакам, направленным против нескольких объектов в сети. Главным преимуществом сетевых систем обнаружения атак является их способность контролировать данные и события, не влияя на локальную производительность. Тем не менее, сетевые СОА не могут контролировать активность, которая происходит на локальной системе, что является недостатком, в отличие от локальной СОА. Кроме того, сетевые системы обнаружения атак могу корректно анализировать протоколы или приложения, которые используют зашифрованные данные, при условии, если ключевая информация доступна для СОА.


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.