Оглавление
Введение 3
Глава 1. Теоретическая часть 6
1.1. Особенности внедрения операторов SQL (SQL Injection) 6
1.1.1. Изменение входных параметров путем добавления в них конструкций языка SQL 7
1.1.2. Внедрение SQL-кода в строковые параметры 8
1.1.3. Использование UNION 10
1.1.4. Экранирование хвоста запроса 16
1.1.5. Расщепление SQL-запроса 17
1.2. Методы защиты от SQL инъекций 17
1.2.1. Фильтрация строковых параметров 19
1.2.2. Фильтрация целочисленных параметров 20
1.2.3. Усечение входных параметров 20
1.2.4. Использование параметризованных запросов 21
1.2.5. Использование принципа наименьших привилегий при предоставлении доступа к базам данных 22
1.3. Особенности операторов SQL в СУБД PostgreSQL, MySQL, MsSQL Server, MariaDB 22
1.4. Анализ существующих реализаций фаервола для баз данных 23
1.5. Основные требования к программе для защиты баз данных от SQL-инъекций 25
1.6. Выбор средств разработки 25
Глава 2. Практическая реализация и тестирование фаервола для защиты СУБД от SQL-инъекций 27
2.1. Построение структуры программы 27
2.2. Практическая реализация прокси-сервера 30
2.3. Разбор пакета клиента 31
2.4. Реализация анализа SQL-запросов 34
2.5. Тестирование фаервола для баз данных 39
2.5.1. Тестирование на качество фильтрации SQL-запросов 40
2.5.2. Тестирование на время выполнения SQL-запросов 44
Заключение 49
Список литературы 50
Приложение А. Время выполнения запросов 51
Введение
SQL-инъекция – это тип атаки, ориентированный на базы данных, при которой злоумышленник успешно формирует и вставляет вредоносный код в строки. В свою очередь данные строки транслируются на сервер системы управления базой данных (СУБД) для синтаксического анализа и выполнения. В случае успешного исполнения данной атаки злоумышленник может легко преодолеть систему безопасности приложения, получить доступ, копировать, удалять и изменять конфиденциальную информацию, которая содержится в базе данных (БД). Функциональные возможности СУБД также оказываются под угрозой. В некоторых случаях можно получить доступ к операционной системе (ОС) сервера, на котором функционирует система управления базой данных. В этой ситуации злоумышленник получает доступ как к конфиденциальной информации, хранящейся в базе данных, так и возможность исполнять команды операционной системы сервера СУБД. Таким образом, можно превратить сервер в площадку для последующих атак. Например, можно атаковать другие приложения или сервера, находящиеся в сети организации.
Обычно атаки типа SQL-инъекций рассматривают относительно web-приложений, однако данной уязвимости подвержены любые клиент-серверные и сервис-ориентированные приложения, работающие с системами управления базами данных.
Несмотря на то, что данная уязвимость существует очень давно, количество случаев, связанных с несанкционированным доступом к информационным системам и утечкой конфиденциальной информации вследствие SQL-инъекций, неуклонно растет с каждым годом. Многие разработчики и специалисты в области информационной безопасности недооценивают серьезность данной уязвимости, тем самым создавая серьезную угрозу для безопасности информационных систем. К сожалению, то, о чем обычно пишут в литературе по данной теме, касается лишь наиболее простых и тривиальных примеров реализации SQL-инъекций.
В настоящее время крупные организации все больше используют разнообразные приложения – системы банковского обслуживания, официальные сайты компаний, порталы государственных услуг, электронные торговые площадки, системы управления ресурсами предприятий и так далее. Всевозможные специализированные приложения на основе клиентского программного обеспечения (ПО) повсеместно заменяются web-версиями и облачными сервисами. Зачастую, чтобы сэкономить средства, компании обращаются к малоквалифицированным разработчикам. Поэтому неудивительно, что именно уязвимости web-приложений становятся одним из основных векторов атак на корпоративные информационные системы.
В 2016 году экспертами компании Positive Technologies были исследованы 1194 клиент-серверных систем и web-приложений из различных отраслей экономики. Атаки типа SQL-инъекции продолжили свой рост. Так подобная критически опасная уязвимость поднялась с шестого места на четвертое, то есть составила 48% против 43% в 2015 году. Лидером по количеству найденных уязвимостей оказалась банковская отрасль (89%), на втором месте – телекоммуникационная отрасль (80%). Далее следуют промышленность (71%) и информационные технологии (67%).
Задачами данной работы являются:
изучение особенностей внедрения операторов SQL (SQL-инъекции),исследование методы обнаружения аномалий в SQL-запросах к базам данных,изучение методов защиты от такого типа атак, а такжеисследование особенностей операторов в таких популярных СУБД как: MsSQL Server, MySQL, MariaDB, PostgreSQL.Целью данной работы является написание программного средства (фаервола), предназначенного для защиты СУБД от такой критической уязвимости, как SQL-инъекции. Фаервол должен быть универсальным, а именно работать с СУБД: MsSQL Server, MySQL, MariaDB, PostgreSQL, и должен иметь защиту от атак типа внедрения SQL-кода, такую как возможность анализа пакетов, выявление инъекций и блокировка опасных запросов.
Часть кода фаервола
* Принимаются небходимые параметры * Создается сокет для взаимодействия с клиентом * Создается поток для клиента */import java.net.*;import java.util.Scanner;public class Server extends Thread{ static String database;
public static void main(String args[]) { try { System.out.println("Choose database:"); System.out.println("1. MySQL / MariaDB;"); System.out.println("2. Postgres;"); System.out.println("3. MsSQL;");
int a = new Scanner(System.in).nextInt(); if (a == 1){ database = "MySQL"; }else if(a == 2){ database = "Postgres"; }else if (a == 3){ database = "MsSQL"; }
System.out.println("Enter DBhost:"); String dbhost = new Scanner(System.in).nextLine();
System.out.println("Enter DBport:"); int dbport = new Scanner(System.in).nextInt();
System.out.println("Enter clienthost:"); String clienthost = new Scanner(System.in).nextLine();
System.out.println("Enter clientport:"); int clientport = new Scanner(System.in).nextInt();
// Print a start-up message System.out.println("Choose mode:"); System.out.println("1. Query Sniffer:"); System.out.println("2. Firewall:");
int mode = new Scanner(System.in).nextInt(); ServerSocket server = new ServerSocket(clientport, 100, InetAddress.getByName(clienthost));...........................}
VadOS