2 семестр / БСБД6
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ
Отчет по лабораторной работе №6
по дисциплине «Безопасность систем баз данных»
Вариант № 5
Студент гр. 739-1
Климанов М. Д.
24.12.2021
Руководитель
Преподаватель кафедры
КИБЭВС
__________ Слезкин А.О.
__.__.2021
Томск 2021
1 Введение
Целью работы является изучение принципов работы реализации атак вида "SQL-инъекция" и методов защиты от атак такого вида.
Задание для данной лабораторной работы:
Реализовать SQL-инъекций для 5 варианта.
Используя механизм SQL-инъекций получить следующую информацию о базе данных: наименование БД; версию СУБД; наименование всех таблиц в БД; наименование каждого поля таблицы БД.
А также с помощью SQL- инъекций извлечь следующую информацию из базы данных: список всех морских сражений, произошедших в период с 1941 года по 1950 включительно; список всех американских кораблей, спущенных на воду в период с 1915 по 1945 годы; список кораблей всех американских классов, которые были повреждены, либо потоплены.
Независимо от типа передаваемого параметра необходимо реализовать экранирование хвоста запроса (с помощью оператора --) в коде запроса. В коде приложения своей предметной области реализуйте метод защиты – типизация данных (приведение к строковому типу) и экранирование.
Ход работы
Проведение SQL-инъекций
В рамках данной лабораторной работы будут рассмотрены четыре наиболее распространенных вида SQL-инъекций: внедрение в строковые параметры, инъекция, основанная на выводе текста ошибки, инъекция, модифицирующая данные и слепая инъекция.
Перед выполнением задания необходимо убедиться, что служба SQL Server работает (рисунок 2.1).
Рисунок 2.1 – Запуск службы SQL Server
Далее нужно открыть браузер, и ввести в адресной строке адрес
«localhost» или 127.0.0.1. После этого откроется визор локального сервера (рисунок 2.2).
Рисунок 2.2 – Пример визора локального сервера
Далее необходимо выбрать файл «ships_injections.php», а затем откроется главное окно веб-приложения, как на рисунке 2.3 и 2.4.
Рисунок 2.3 – Дочерний каталог
Рисунок 2.4 – Веб-приложение
Первая SQL-инъекция была направлена на то, чтобы узнать название базы данных. SQL-инъекция имеет вид: ‘AND DB_Name()=1’, как на рисунке 2.5.
Рисунок 2.5 – Название базы данных «ships»
Вторая SQL-инъекция была направлена на то, чтобы узнать версию СУБД. SQL-инъекция имеет вид: ‘AND @@version =1’, как на рисунке 2.6.
Рисунок 2.6 – Версия СУБД
Далее были использованы инъекции с оператором UNION ALL. Данный оператор служит для объединения двух SELECT (как правило из разных таблиц) и требует того, чтобы типы данных в выбираемых полях таблиц и количество этих полей совпадало.
Первая SQL-инъекция имеет вид: UNION ALL SELECT TABLE_NAME,0, TABLE_SCHEMA,0, FROMNFORMATION_SCHEMA.TABLES. С помощью этой инъекции можно узнать название всех таблиц в базе данных (рисунок 2.7).
Рисунок 2.7 – Названия всех таблиц
Вторая SQL-инъекция имеет вид: UNION ALL SELECT TABLE_NAME, 0, COLUMN_NAME, 0, FROM INFORMATION_SCHEMA.COLUMNS. С
помощью этой инъекции можно узнать название каждого поля таблицы в базе данных (рисунок 2.8).
Рисунок 2.8 – Названия всех полей
Третья SQL-инъекция имеет вид: ‘UNION ALL SELECT name, date, winner, sink FROM Battles WHERE date >= ‘1941-01-01’ AND date <= ‘1950-01- 01’. С ее помощью можно получить список всех морских сражений, произошедших в период с 1941 года по 1950 (рисунок 2.9).
Рисунок 2.9 – Морские сражения
Четвертая SQL-инъекция имеет вид: ‘ UNION ALL SELECT class, 0, country, 0 FROM Classes. С ее помощью была выведена таблица с классами и
странами информация, из которой понадобится для выполнения следующей инъекции (рисунок 2.10).
Рисунок 2.10 – Классы и страны
Пятая SQL-инъекция имеет вид: ‘ UNION ALL SELECT name, 0, class, launched FROM Ships WHERE (launched >= ‘1915’ AND launched <= ‘1945’) AND (class = ‘lowa’ OR …). С ее помощью был выведен список всех американских кораблей, спущенных на воду в период с 1915 по 1945 годы (рисунок 2.11).
Рисунок 2.11 – Корабли
Шестая SQL-инъекция имеет вид: ‘ UNION ALL SELECT ship, 0, result, 0 FROM Outcomes WHERE (result >= ‘sunk’ AND result <= ‘damaged’) AND (ship = ‘California’ OR …). С ее помощью был выведен список кораблей всех американских классов, которые были повреждены, либо потоплены (рисунок 2.12).
Рисунок 2.12 – Поврежденные корабли
Проведение SQL-инъекций
Далее была выполнена защита веб-приложения. С помощью редактора
«Sublime Tex» нужно было открыть файл с необходимой предметной областью ship.
Открытие файла представлено на рисунках 2.13 и 2.14.
Рисунок 2.13 – Выбор файла с расширением «.php»
Рисунок 2.14 – Открытый файл
Далее необходимо было реализовать экранирование хвоста запроса (с помощью оператора --), как на рисунке 2.15.
Рисунок 2.15 – Экранирование хвоста запроса
Типизация к строковому типу происходит посредством применения string к $value. Для экранирования можно обозначить регулярными выражениями символы, которые будут удалены (возврат калитки, переход на новую строку и другие), а после заменить их на пустоту при помощи preg_replace, а также заменить кавычки на обычные символы при помощи str_replace(рисунок 2.16).
Рисунок 2.16 – Меры защиты от SQL-инъекций
Далее необходимо проверить функционирование простого запроса по нажатию кнопки (рисунок 2.17), а после продемонстрировать защиту на SQL-инъекции (рисунок 2.18).
Рисунок 2.17 – Проверка работоспособности системы
Рисунок 2.18 – Проверка защиты от строковой инъекции
Заключение
В результате выполнения данной лабораторной работы были изучены принципы реализации атак вида "SQL-инъекция" и методов защиты от атак такого вида.