Сводный отчет Hacker Intelligence – Анатомия SQL инъекции

Сводный отчет Hacker Intelligence – Анатомия SQL инъекции

Главной темой отчета группы Hacker Intelligence Initiative (HII) компании Imperva за текущий месяц является рост атак на web-приложения с помощью SQL инъекции (SQLi).

Главной темой отчета группы Hacker Intelligence Initiative (HII) компании Imperva за текущий месяц является рост атак на web-приложения с помощью SQL инъекции (SQLi). Динамика прошедшего года подтвердилась, SQL-инъекция стала широко применяться на практике даже людьми, не имеющими обширных знаний в области информационной безопасности, и на это есть свои причины. Наиболее существенной причиной можно назвать нацеленность SQLi-атак на кражу закрытых данных. Известные инциденты, случавшиеся с Sony, Nokia, Heartland Payment Systems и даже сайтом Леди Гага, произошли благодаря успешным SQLi–атакам, компрометирующим информацию, хранящуюся в базах данных приложения. LulzSec, одна из известных хакерских групп, сделала SQL-инъекции своим основным оружием. В данном отчете содержится информация о том, насколько широко стали распространены SQLi-атаки, как они действуют, а также каким образом хакеры пытаются повысить их эффективность. С 2005 года и до сегодняшнего дня 83% успешных краж конфиденциальной информации приходятся на долю SQL-инъекции.

За последние девять месяцев мониторинга 30 web-приложений нами было обнаружено, что:

  • Злоумышленники часто используют SQL-инъекции. С июля наблюдаемые нами веб приложения посредством SQL-инъекции, в среднем, были атакованы 71 раз в час. Отдельные приложения иногда атаковались особенно часто, пиковые цифры достигали 800-1300 раз в час.
  • Нарушители все чаще обходят элементарную защиту. Хакеры используют усовершенствованные варианты SQL-инъекции, позволяющие обходить сигнатурные защитные механизмы.
  • Хакеры автоматизируют свою деятельность с помощью легко доступных утилит. Несмотря на то, что методы SQLi-атак постоянно совершенствуются, проведение самих атак не требует никаких базовых знаний. Основными утилитами для проведения SQL-инъекции являются Sqlmap и Havij.
  • Нарушители используют скомпрометированные компьютеры, чтобы скрыть свою личность, а также увеличить эффект атаки с помощью автоматизации. Для автоматизации атаки хакеры используют распределенную сеть уже скомпрометированных ими ранее компьютеров. Эти «зомби» используются взаимозаменяемо, что позволяет нарушителям преодолевать механизм защиты с помощью черных списков.
  • Около 41% SQLi-атак инициируются всего лишь 10 хостами. В очередной раз можно заметить закономерность. За большинство атак ответственны малое число источников.

Для более эффективного решения данной проблемы необходимо:

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

В данном отчете будут рассмотрены самые популярные хакерские утилиты, проблемы, вызванные SQli-атаками на web приложения, и пути их решения.

SQL-инъекция

В данном типе атак нарушители используют уязвимости web приложений для получения несанкционированного доступа к закрытым данным организации. Для непосвященных, это значит ввод кода в поля формы web-сайта. Например, вместо ввода номера кредитной карты или своей фамилии, хакер может ввести ‘x’=’x’. При использовании определенного кода, на странице web-сайта отобразятся конфиденциальные данные.

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

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

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

Детальный анализ

Встречаемость атак

На протяжении последних девяти месяцев нами был осуществлен мониторинг попыток SQLi-атак на 30 действующих web приложений различных размеров и направленности. В среднем, было выявлено 53 попытки SQL-инъекции за час и 1093 за день. Начиная с июля был отмечен небольшой рост числа SQLинъекций: 71 атака за час, 1589 за день.



В среднем

Минимум

Максимум

Срединное значение

Среднее квадратичное отклонение

Атак/час

С декабря 2010

53

1

7950

9

197

С июля

71

1

4937

8

259

Атак/день

С декабря 2010

1093

44

21724

600

1909

С июля

1589

106

8204

1162

1508

Таблица 1: статистика встречаемости SQli-атак

Большое значение среднего квадратичного отклонения означает значительное колебание числа атак. Например, согласно полученным данным, как правило, на приложение проводилось менее 3000, а иногда и меньше 500, SQLi-атак в день. Тем не менее, на протяжении нескольких дней было зафиксировано около 8000 попыток SQLi-атак на приложения.

Анализируя полученные данные, можно выявить тенденцию. В среднем, проводилось 50-100 попыток атаки за час и около 1100 за день, с редкими пиковыми значениями (рисунок 1). Явным показателем автоматизации является большое количество проводимых атак за короткие промежутки времени.

Рисунок 1: случаи SQLi-атак по часам

Средства атаки

Как было отмечено ранее, высокая частота атак является признаком использования средств автоматизации. Некоторые из этих средств были определены либо по HTTP User-Agent заголовкам, либо по хорошо известным характеристикам векторов инъекции, генерируемых этими программами. Наши данные показали, что каждый хост использует одну из программ. Далее приведем небольшой обзор этих программ:

Sqlmap

Sqlmap – свободно распространяемое программное обеспечение. Данная программа автоматизирует процесс поиска и использования уязвимостей для SQL-инъекции, а также позволяет получить контроль над сервером баз данных. Sqlmap позволяет определять используемую БД, получать информацию из базы данных, получать доступ к файловой системе, а также выполнять команды в операционной системе через внеполосное подключение. Эта программа поддерживает пять методов SQL-инъекции: логический вслепую, по времени вслепую, на основе ошибок, с помощью оператора UNION и на основе вложенных запросов.

Рисунок 2: скриншот программы Sqlmap

Havij

Havij – простая программа для автоматизации SQLi-атак с оконным интерфейсом. Ее возможности совпадают с возможностями предыдущей программы, единственное отличие – более дружественный интерфейс. Havij распространяется itsecteam, Иранской компанией, занимающейся безопасностью. Havij внедряет выражение «UNION ALL SELECT», и далее продолжает добавлять поля в union-запрос, чтобы выяснить число используемых столбцов. Каждое выражение выбирает статическую «случайную» шестнадцатеричную строку, содержащую различимую последовательность символов. Это позволяет легко определять строки при отображении web страницы.

Рисунок 3: скриншот программы Havij

Рисунок 4: атаки за час с использованием Sqlmap и Havij, начиная с июля

Используемые для атаки хосты

Все SQLi-атаки, наблюдаемые с июля, были проведены с 3845 хостов. Тем не мене, распределение активности между ними неравномерно. Три самых активных хоста проводили 23% все атак, следующие семь – 18%. Однако, пять хостов из этих семи – Akamai прокси, то есть трафик лишь перенаправлялся через них с подконтрольных нарушителю хостов.

За время наблюдений каждый хост, в среднем, провел 12 атак. В то же время пять хостов провели 1000-2000 атак за 1-7 дней, а 30 дополнительных хостов провели свыше 100 атак за 1-2 дня. Эта динамика показывает, что использование черных список хостов, проводящих SQLi-атаки (например, с помощью сообщества для распространения информации, касающейся безопасности), может повысить шанс быстрого определения и блокирования подобных нарушителей. В среднем, каждый хост за время мониторинга был активен на протяжении половины дня, а срединное значение было гораздо ниже. По этой причине для поддержания черного списка в актуальном состоянии необходимо его частое дополнение.

Рисунок 5: Наиболее активные хосты (с июля)

Для подтверждения нашего предположения о частом применении автоматизации SQLi-атак, мы стали рассматривать только восемь хостов. С начала августа с этих хостов было проведено большое количество атак за десятиминутные промежутки времени. На протяжении этих промежутков рассматриваемые хосты выполняли по 10 или более попыток атаки за минуту. Очевидно, что за пределами возможности человека. Более того, мы заметили, что большинство из этих хостов на протяжении рассматриваемых периодов участвовали в совместных SQLi-атаках, и их деятельность ограничивалась только данным типом атак. Некоторыми из рассматриваемых хостов были взломанные сервера, использованные в качестве площадки для проведения атак.

Рисунок 6: случаи автоматизированных атак в августе

География источников SQLi-атак

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

За время мониторинга web приложений попытки SQLi-атак были предприняты с хостов со всего мира. Однако, большинство атак было проведено из США. Хосты, расположенные в Швеции, Китае, Великобритании и Вьетнаме, также принимали активное участие в атаках. Более подробная информация представлена в таблице 2.

Рисунок 7: география происхождения SQLi-атак (с июля)

Страна

Количество SQLi-атак

%

США

48176

58

Швеция

8850

11

Китай

6709

8

Великобритания

4970

6

Вьетнам

2412

3

Нидерланды

1963

2

Болгария

1359

2

Эквадор

1356

2

Европейский союз

1093

1

Германия

971

1

Прочие страны

4748

6

Таблица 2: страны, из которых проводились SQLi-атаки (с июля)

Векторы атак

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

Непосредственная манипуляция запросом

Простой способ для нарушителя изменить поведение приложения – передать любой фильтр на результат SQL-запроса, созданного с помощью пользовательских параметров. Нарушитель может заменить фильтр, сгенерированный приложением, на фильтр, всегда возвращающий true (или false, в зависимости от смысла запроса). Часто это можно сделать, добавив в запрос логическое выражение с известным значением параметра, например, ‘OR 1=1’ чтобы получить true или 1 или /**/and/**/’8’=’3, чтобы получить false. Данный тип векторов, как правило, используется, чтобы получить информацию об уязвимостях приложения, которые могут быть использованы SQL-инъекцией.

Определение структуры базы данных

Более сложные атаки на базу данных, используемую приложением, основываются на знании структуры таблиц. Предположим, что приложение выводит информацию об ошибках, тогда одним из способов определить количество столбцов таблицы может быть использование оператора Order By. База данных вернет ошибку, когда параметр упорядочения – не будет являться существующим столбцом. Анализ трафика показал, что некоторые нарушители начинают подбор со значения 10000: ‘order by 10000’. Так как 10000 – номер не существующего столбца, нарушитель надеется получить ошибку. После ошибки он уменьшает подставляемое значение (например, ‘Order by 50’) до тех пор, пока команда не выполнится без ошибки. Обычно для максимальной эффективности используется бинарный алгоритм поиска. В конце выполнения алгоритма нарушитель знает число столбцов в таблице, последний параметр запроса является им.

Процесс продолжается запросами к метаданным базы данных до тех пор, пока не будут найдены имена таблиц и столбцов, которые могут содержать ценную информацию. Пример данной атаки содержит следующий пользовательский параметр: ‘) and 1=convert(int,(select top 1 table_name from information_schema.tables))’—

SQL-инъекция с помощью UNION SELECT

За время мониторинга web приложений нами был обнаружен еще один вектор атак, насчитывающий 9% всех SQLi-атак с июля. В данном типе атак используется оператор UNION SELECT. Этот оператор позволяет получать общие результаты двух различных SQL запросов, не имеющих ничего общего. При успешном исходе нарушитель может получить информацию из определенной таблицы, даже если приложение не было разработано для работы с этой таблицей.

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

XXXX%’) UNION SELECT MEMBER_ID, M_STATUS, M_NAME + ‘/’ + M_EMAIL + ‘/’, M_LEVEL, M_EMAIL, M_COUNTRY, M_HOMEPAGE, M_ICQ, M_YAHOO, M_AIM. M_TITLE, M_POSTS, M_LASTPOSTDATE, M_LASTHEREDATE, M_DATE, M_STATE FROM FORUM_MEMBERS WHERE (M_NAME LIKE ‘

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

Основанная на времени слепая SQL-инъекция

Данный тип атак позволяет преодолевать некоторые виды защиты, используемой web администраторами. Он довольно популярен и занимает 13% всех попыток, начиная с июля. Иногда при выполнении SQLi-атаки в качестве ответа сервер передает ошибку базы данных, связанную с неверным синтаксисом запроса. Для предотвращения раскрытия информации о базе данных в приложении при возникновении ошибки отображается специальная страница. Это затрудняет проведение SQL‑инъекции, но не делает его невозможным. Слепая SQL-инъекция – техника для раскрытия данных из БД с помощью серии SQL запросов, возвращающих true или false. Нарушитель может проверить что вернул SQL запрос несколькими способами. Одним из этих способов является использование трудоемких операций, например, “ waitfor delay ”, которая отложит ответ сервера, если выражение возвращает true.

Например, нами была обнаружена инъекция в параметр web формы ‘ waitfor delay ‘0:0:20’--. Так нарушитель проверял, уязвимо ли приложение к SQL-инъекции. Если приложение и база данных примут внедряемое значение параметра, ответ будет задержан на 20 секунд. Довольно заметная задержка для утилиты, которая может пометить данный параметр как уязвимый к SQL-инъекции. В похожем, но более конкретном примере, нами была обнаружена инъекция в параметр «Новый пользователь» на странице входа в систему ‘);waitfor delay ‘0:0:05’;--. В данном случае нарушитель пытался обойти механизм авторизации. Он надеялся, что успешная инъекция позволит ему авторизоваться под существующим пользователем.

Стоит отметить, что инъекция ‘waitfor delay’ может быть использована для увеличения потребления ресурсов приложением и вызвать отказ в обслуживании.

Обход простой проверки параметров

Нарушители понимают, что, как правило, перед созданием запроса к базе данных в приложениях осуществляется проверка пользовательских параметров. Но если эта проверка носит лишь формальный характер, нарушитель может легко обойти ее, например, добавлением незначащих комментариев (обозначается /*and*/) в параметр (1’/**/aND/**/’8’=’3), постоянным переключением между верхним и нижним регистрами (x’ wAiTfOr dELay ‘0:0:20’--) или использованием функций вроде concat() и char(), которые позволяют выполнять внедряемую команду в обход сигнатурного анализатора. Еще одним часто используемым способом является кодирование внедряемой строки с помощью ASCII, например, 1 DeCLARe @x varchar(99) set @x=0c77616974666 0x77616974666f722064656c61792027303a303a323027 exec(@x)--. Данная команда транслируется базой данных в 1 waitfor delay ‘0:0:20’--.

Рекомендации

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

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

Код приложения может быть написан с учетом возможности SQL-инъекций. Тем не менее, проверка каждого куска кода, базы данных, модулей сторонних производителей в приложениях большого объема попросту невозможна. Нужно понимать, что с высокой долей вероятности используемое web приложение содержит подобные уязвимости, а благодаря средствам их автоматического поиска и использования приложение вскоре будет взломано, конечно, если не появится механизм определения SQL-инъекций.

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

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

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

Обзор Hacker Intelligence Initiative

Hacker Intelligence Initiative компании Imperva проводит исследования популярных хакерских приемов и интересных массовых атак, прошедших за последнее время. Hacker Intelligence Initiative является частью исследовательского подразделения Imperva Application Defense Center. Деятельность HII сводится к изучению последних тенденций в атаках, безопасности web приложений, а также моделей кибер-преступлений. Это позволяет улучшать процессы контроля защищенности и управления рисками.

Домашний Wi-Fi – ваша крепость или картонный домик?

Узнайте, как построить неприступную стену