
2015_лекции / SQL-инъекции
.pdf
Федеральное агентство по образованию
Санкт-Петербургский Государственный
Электротехнический Университет «ЛЭТИ»
Ошибка «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