Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2015_лекции / SQL-инъекции

.pdf
Скачиваний:
117
Добавлен:
22.03.2016
Размер:
1.49 Mб
Скачать

Федеральное агентство по образованию

Санкт-Петербургский Государственный

Электротехнический Университет «ЛЭТИ»

Ошибка «SQL-инъекция»

SQL-инъекции

Определение:

SQL-инъекции — встраивание вредоносного кода в запросы к базе данных

Условие реализации:

Отсутствие обработки пользовательского ввода при формировании запросов к базе данных

Цели атак:

Выявление уязвимых параметров

(цель – узнать уязвимые параметры и пользовательские поля ввода)

Определение типа/версии базы данных

Определение схемы данных

(цельузнать имена таблиц, полей, типов данных)

Извлечение данных

Добавление и изменение данных

(блокировка или удаление таблиц)

Уклонение от обнаружения

Обход аутентификации, поднятие привелегий

Выполнение удаленных команд

Механизмы инъекции

Инъекции через пользовательский ввод

SQL-инъекции через cookie

SQL-инъекции через переменные сервера

Слепые и инъекции второго порядка

Инъекции через пользовательский ввод:

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

операцию осуществляются на клиентской стороне, внутри программы и злоумышленник легко направит запрос к sqlсерверу и тот послушно выполнит его и предоставит доступ к любым переменным данной среды.

SQL-инъекции через cookie

Cookie – файл, который хранит информацию о

 

состоянии, сгенерированную Web-приложениями, и хранится на

 

клиентской машине и когда клиент возвращается в приложение,

 

эта информация может использоваться для восстановления

 

состояния клиента. Cookie хранятся на компьютере пользователя

 

и наиболее доступны для изменения. И если Web-приложение

 

использует cookie, злоумышленник может изменить содержимое

 

cookie, вставив в него свой sql-запрос.

Инъекции через переменные сервера:

Это набор переменных, который содержит HTTP, сетевые заголовки и переменные окружения. Webприложения используют их в различных формах, например, ведение журнала статистики использования и выявления тенденций просмотра. Если эти переменные записываются в БД без обработки, это может

создать уязвимости SQLинъекции, так как злоумышленник может подделывать значения, которые находятся

вHTTP заголовках и сети. Они могут воспользоваться этой уязвимостью путем размещения SQLIA непосредственно

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

Инъекции второго порядка:

Одним из примеров таких SQL-инъекций является введение задержки в составе SQLIA. Цель таких инъекций отличается от предыдущих. Эти инъекции не приводят к атаке при первом входе в БД, а вместо этого злоумышленник полагается на знания о том, где это вход будет использоваться и разработает нападение так, чтобы это произошло во время пользования. Инъекции второго порядка особенно трудно обнаружить, так как место инъекции и место, где она проявится различны.

Пример атаки второго порядка

1)Регистрация на сайте под логином “admin’ --”.

2)Изменение пароля

(1)проверка, что пользователь знает текущий пароль и

(2)изменение пароля, если проверка успешна.

queryString="UPDATE users SET password=’" + newPassword + "’ WHERE userName=’" + userName + "’ AND password=’" + oldPassword + "’" UPDATE users SET password=’newpwd’ WHERE userName= ’admin’--’ AND password=’oldpwd’

Пример уязвимого кода:

String login, password, pin, query login = getParameter("login"); password = getParameter("pass"); pin = getParameter("pin");

Connection conn.createConnection("MyDataBase");

query = "SELECT accounts FROM users WHERE login=’" + login + "’ AND pass=’" + password +

"’ AND pin=" + pin;

ResultSet result = conn.executeQuery(query); if (result!=NULL)

displayAccounts(result); else displayAuthFailed();

login = “doe” , password = “”secret, pin = “123” =>

SELECT accounts FROM users WHERE login=’doe’ AND pass=’secret’ AND pin=123