Инструменты пользователя

Инструменты сайта


Боковая панель

Связь

sql_injection

Содержание

SQL Injection

  • SQL (Structured Query Language).

Внедрение операторов SQL (SQL Injection). Эти атаки направлены на Web- серверы, создающие SQL запросы к серверам СУБД на основе данных, вводимых пользователем.

Большинство серверов поддерживают язык SQL в вариантах, стандартизированных ISO и ANSI. В большинстве современных СУБД присутствуют расширения диалекта SQL, специфичные для данной реализации (PL/pgSQL в PostgreSQL, T-SQL в Microsoft SQL Server, PL SQL в Oracle и т.д.). Методы SQL Injection зависят от типа используемой СУБД. Например, SQL- инъекция на базе данных Oracle осуществляется в основном с помощью использования ключевого слово union, и она намного более трудна, чем на MS SQL- сервере, где можно выполнить множественные запросы, отделяя их символом точки с запятой. В заданной по умолчанию конфигурации MS SQL- сервер выполняется с привилегиями Local System и имеет расширенную процедуру «xp_shell», позволяющую выполнение команд операционной системы.

Многие Web- приложения используют данные, переданные пользователем, для создания динамических Web- страниц. Если информация, полученная от клиента, должным образом не верифицируется, атакующий получает возможность модифицировать запрос к SQL- серверу, отправляемый приложением. Запрос будет выполняться с тем же уровнем привилегий, с каким работает компонент приложения, выполняющий запрос (сервер СУБД, Web-сервер и т.д). В результате злоумышленник может получить полный контроль на сервером СУБД и даже его операционной системой. С точки зрения эксплуатации SQL Injection очень походит на LDAP Injection.

  • Пример: Предположим, аутентификация в Web- приложение осуществляется с помощью Web- формы, обрабатываемой следующим кодом:
SQLQuery = "SELECT Username FROM Users WHERE
Username = '" & strUsername & "' AND Password = '"
& strPassword & "'" strAuthCheck =
GetQueryResult(SQLQuery)

В этом случае разработчики непосредственно использует переданные пользователями значения strUsername и strPassword для создания SQL- запроса. Предположим, злоумышленник передаст следующие значения параметров:

Login: ' OR ''='
Password: ' OR ''='

В результате серверу будет передан следующий SQL-запрос:

SELECT Username FROM Users WHERE Username = '' OR ''='' AND Password = '' OR ''=''

Вместо сравнения имени пользователя и пароля с записями в таблице Users, данный запрос сравнивает пустую строку с пустой строкой. Естественно, результат подобного запроса всегда будет равен True, и злоумышленник войдет в систему от имени первого пользователя в таблице.

Обычно выделяют два метода эксплуатации внедрения операторов SQL: обычная атака, и атака вслепую (Blind SQL Injection). В первом случае злоумышленник подбирает параметры запроса, используя информацию об ошибках, генерируемую Web- приложением.

Сервер генерирует сообщение, аналогичное следующему:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All
queries in an SQL statement containing a UNION
operator must have an equal number of expressions
in their target lists.

Из этого следует, что оператор union был передан серверу, и теперь злоумышленнику необходимо подобрать используемое в исходном выражении select количество параметров. Внедрение SQL кода вслепую. В этом случае стандартные сообщения об ошибках модифицированы, и сервер возвращает понятную для пользователя информацию о неправильном вводе. Осуществление SQL Injection может быть осуществлено и в этой ситуации, однако обнаружение уязвимости затруднено. Наиболее распространенный метод проверки наличия проблемы – добавление выражений, возвращающих истинное и ложное значение. Выполнение подобного запроса к серверу: http://example/article.asp?ID=2+and+1=1 должно вернуть ту же страницу, что и запрос: http://example/article.asp?ID=2 поскольку выражение 'and 1=1' всегда истинно. Если в запрос добавляется выражение, возвращающее значение «ложь»: http://example/article.asp?ID=2+and+1=0 пользователю будет возвращено сообщение об ошибках или страница не будет сгенерирована. В случае если факт наличие уязвимости подтвержден, эксплуатация ничем не отличается от обычного варианта.

Ссылки




sql_injection.txt · Последние изменения: 2012/05/26 07:09 (внешнее изменение)