15 сент. 2009 г.

Продвинутая SQL-инъекция в клиент-серверных приложениях. Часть 1

Попался мне очень интересный документ, в котором, как мне показалось подробно описывается SQL-инъекции. Он на английском языке, я решил его перевести и людям помочь и английский сколыхнуть. Оригинал вы сможете найти тут. Итак 1 часть.
Реферат
В этом документе обсуждаются детали техники входящей «SQL-инъекции» , как она применяется к распространненым платформам, таким как Microsoft Internet Information Server/Active Server Pages/SQL Server. Тут обсуждаются различные пути в которых применяется SQL-инъекция в приложениях и в адресах валидации данных и вопросов блокирования БД которые связаны с этим классом атак.
Данный документ предназначен для двух типов разработчиков веб-приложений, которые взаимодействуют с БД и профессионалов по безопасности в чьи обязанности входят аудит этих веб-приложений.
Введение
Структурированный Язык Запросов(‘SQL’) – текстовый язык запросов, используемый для взаимодействия реляционной базы данных. Существует много разновидностей 'SQL', большинство диалектов используемые сейчас принадлежат стандарту SQL-92, новейшему стандарту ANSI. Типичная единица выполнения ‘SQL’ – это запрос(query), которая является сбором данных, возвращающая единичный набор результатов(result set). SQL выражение может изменить структуру базы данных и манипулировать содержимым базы данных. В этом документе мы будем обсуждать транзактный SQL, диалект SQL применим для Microsoft SQL Server.
SQL инъекция происходит, когда у атакующего имеется возможность вставить серию SQL-выражений в запрос при вводе данных в приложении.
Типичный SQL запрос выглядит следующим образом:
Select id, forename, surname from authors
Это выражение вернет значение всех столбцов id, forename, surname из таблицы 'authors'. Запрос может содержать некоторое условие для более точной выборки, например:
Select id, forename, surname from authors where forename = 'john' and surname = ‘smiht’
Важной особенностью в данном запросе является то, что строчные значения 'john' и ‘smith’ определены в одинарных кавычках. Предполагая, что поля 'forename' и ‘surname’ будут содержать значения введенные пользователем, атакующий может инъектировать SQL в запрос, вводя значения такие как эти:
Forename: jo'hn
Surname: smith
Строка запроса будет выглядеть следующим образом:

Select id, forename, surname from authors where forename = 'jo’hn' and surname = ‘smiht’

Когда СУБД попытается выполнить этот запрос, то она вернет ошибку:
Server: Msg 170, level 15, State 1, Line 1
Line 1: Incorrect syntax near ‘hn’
Причина этому одиночная кавычка, которая заканчивает запрос. Далее СУБД попытается выполнить 'hn' и ей это не удается, в следствии чего образуется ошибка. Если атакующий введет следующее:
Forename: jo’; drop table authors—
Surname:
… таблица ‘authors’ будет удалена, по причинам, которые мы обсудим позднее.
Это означает, что методы убирающие одиночные кавычки или убирание их другим способом есть решение данной проблемы. Это правда, но существует несколько сложностей с этим методом как решением Первое, не все формы для ввода предназначены для ввода строк. Если наша выборка осуществляется по id, например, наш запрос может выглядеть следующим образом:
Select id, forename, surname from authors where id=1234
В этой ситуации атакующий может просто добавить SQL выражение в конец численного поля для ввода. В других диалектах SQL, используются разные ограничители; в Microsoft Jet DBMS, например, дата может быть ограничена при помощи символа «#». Второе, удаление одиночных кавычек не необходимо, простым решением на начальном этапе, мы это обсудим позднее.
Мы проиллюстрируем эти примеры в деталях используя простую страничку авторизации с доступом к БД, написанную на ASP.
Это код для странички вывода формы, в которую пользователь вводит логин и пароль:

--- код смотрите в оф. документе.

Критическая точка здесь, это строка формирования запроса:
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";

Если пользователь введет следующие значения:
Username: '; drop table users--
Password:

…. то таблица 'users' будет удалена, при этом доступ всем пользователям будет запрещен. Символы '--' обозначают «комментарий строки» и символ «;» - конец запроса и начало другого. Наличие «;» в поле «username» необходимо чтобы создать запрос без ошибок.
Атакующий может зарегистрироваться как обычный пользователь, зная имя пользователя, например вводя следующее:
Username: admin'—
Атакующий может войти в систему как администратор, введя следующее:
Username: ' or 1=1—
… и, странно, атакующий может войти в систему как выдуманный пользователь, введя следующее:
Username: ' union select 1, 'fictional_user', 'some_password', 1—
Причина по которой все это работает заключается в том, что система «доверяет» введенным от пользователя данным и что эти данные достоверны.

Комментариев нет:

Отправить комментарий