УДК 004

Метод предотвращения SQL-инъекций и межсайтовых сценариев с использованием алгоритма сопоставления строк Кнута-Морриса-Пратта

Тетерин Николай Николаевич – магистрант МИРЭА – Российского технологического университета.

Семенов Тимур Павлович – магистрант МИРЭА – Российского технологического университета.

Аннотация: В статье рассматривается метод предотвращения SQL-инъекций и межсайтовых сценариев с использованием алгоритма сопоставления строк Кнута-Морриса-Пратта.

Внедрение SQL-кода и межсайтовые сценарии остаются серьезной угрозой для веб-приложений, управляемых данными. Участились случаи, когда хакеры получают неограниченный доступ к внутренней базе данных веб-приложений с целью кражи, редактирования и уничтожения конфиденциальных данных. Поэтому необходимо принять меры для ограничения растущих угроз SQL-инъекций и XSS-атак. В этом исследовании представлена методика обнаружения и предотвращения этих угроз с использованием алгоритма сопоставления строк Кнута-Морриса-Пратта. Алгоритм использовался для сопоставления входной строки пользователя с сохраненным шаблоном строки инъекции для обнаружения любого вредоносного кода. Реализация осуществлялась с использованием языка сценариев PHP и сервера Apache XAMPP. Уровень безопасности метода был измерен с использованием различных тестовых примеров SQL-инъекций, межсайтового скриптинга (XSS) и атак с использованием закодированных инъекций. Полученные результаты показали, что предложенная методика способна успешно обнаруживать и предотвращать атаки, регистрировать запись об атаке в базе данных, блокировать систему по ее mac-адресу, а также генерировать предупреждающее сообщение. Таким образом, предложенная методика оказалась более эффективной при обнаружении и предотвращении SQL-инъекций и XSS-атак.

Ключевые слова: SQL-инъекции, XSS-атаки, сервер, скриптинг, алгоритм.

Интернет быстро становится бытовой технологией с 4,39 млрд пользователей в январе 2019 года по сравнению с 3,48 млрд пользователей в январе 2018 года. Это показало, что ежедневно подключалось более миллиона новых пользователей. Этому росту способствуют управляемые данными веб-приложения и сервисы, которые позволяют пользователям с легкостью выполнять свои действия в Интернете. Большинство современных организаций и частных лиц в значительной степени полагаются на эти веб-приложения для связи со своими многочисленными клиентами. Входные данные пользователей через веб-приложения используются для запросов к внутренним базам данных, чтобы предоставить необходимую информацию. Таким образом, эта тенденция открыла веб-приложения и службы для атак хакеров. Более того, популярность веб-приложений в социальных сетях, финансовых транзакциях и проблемах со здоровьем растет очень быстро; в результате уязвимости программного обеспечения становятся очень важными проблемами, и поэтому веб-безопасность стала серьезной проблемой. Уязвимости в основном представляют собой уязвимости прикладного уровня, такие как атаки серверов доменных имен, недостатки встроенных фреймов, удаленное включение файлов, недостатки веб-аутентификации, удаленное выполнение кода, XSS и внедрение SQL. Опрос, проведенный Open Web Application Security Project (OWASP), выявил 10 основных уязвимостей по состоянию на июнь 2019 года: недостатки внедрения, нарушение аутентификации и управления сеансами, раскрытие конфиденциальных данных, внешний объект XML, нарушенный контроль доступа, неправильная настройка безопасности, XSS, небезопасность. десериализация, использование компонентов с известными уязвимостями, недостаточное ведение журнала и мониторинг. Однако среди этих форм атак XSS и SQL-инъекция были определены как наиболее опасные [5]. Учебный центр по безопасности WordPress также утверждает, что если SQL-инъекция и XSS-уязвимости могут быть обработаны в коде, то 65% уязвимостей будут устранены. Поскольку веб-приложения используют данные, предоставленные пользователями в запросах SQL, хакеры могут манипулировать этими данными и вставлять метасимволы SQL в поля ввода, чтобы получить доступ, изменить или удалить содержимое базы данных. Например, предложение WHERE в SQL-запросе SELECT*FROM users WHERE password = 1234 может быть изменено, когда хакеры вводят такие данные, как «anything» OR «1» = «1». Предложение WHERE теперь содержит два условия, разделенных логическим оператором OR. Первое условие может быть не TRUE, но второе условие должно быть TRUE, потому что 1 всегда равно 1, а логический оператор «OR» возвращает TRUE, если одно или оба условия TRUE. Следовательно, хакер получает доступ без необходимости знать пароль. Иногда неправильные входные значения также могут быть предоставлены намеренно, чтобы были обнаружены сообщения об ошибках, которые помогут злоумышленникам понять схему базы данных. Таким образом, SQL-инъекция представляет собой серьезную угрозу для пользователей веб-приложений.

Атаки с внедрением SQL можно разделить на шесть категорий:

а) Логическая инъекция SQL или атака тавтологией:

Логические значения (True или False) используются для выполнения этого типа внедрения SQL. Вредоносный SQL-запрос заставляет веб-приложение возвращать разные результаты в зависимости от того, возвращает ли запрос результат TRUE или FALSE. Например, «aaa OR 2 = 2» было вставлено в SQL-запрос «SELECT ∗ FROM users WHERE password = aaa OR 2 = 2» в качестве пароля, чтобы изменить структуру предложения WHERE исходного запроса. Это дает SQL-запрос с двумя разными условиями, разделенными логическим оператором ИЛИ. Первое условие «password = aaa» может быть неверным, но второе условие «2 = 2» должно быть истинным. Следовательно, логический оператор OR возвращает значение true, если хотя бы один из операндов имеет значение true, тем самым вынуждая веб-приложение возвращать другой результат.

б) SQL-инъекция на основе объединения: это самая популярная из всех SQL-инъекций. Он использует оператор UNION для интеграции двух или более операторов select в SQL-запрос, тем самым незаконно получая данные из базы данных. Например, в SQL-запросе «SELECT ∗ FROM customers WHERE password = 123 UNION SELECT creditCardNo, pin FROM customers» злоумышленник вводит SQL-оператор «123 UNION SELECT creditCardNo, pin FROM customers» вместо необходимого пароля. Таким образом, запрос предоставляет все номера кредитных карт с их PIN-кодами из таблицы клиентов.

в) SQL-инъекция на основе ошибок: это самая простая из всех уязвимостей SQL-инъекций; однако это влияет только на веб-приложения, использующие MS-SQL Server. Наиболее распространенная форма этой уязвимости требует, чтобы злоумышленник предоставил инструкцию SQL с неправильным вводом, что привело бы к синтаксической ошибке, такой как предоставление строки, когда запрос SQL ожидает целое число. Например, запрос SQL: SELECT * FROM customer WHERE pin = convert (int, (SELECT firstName FROM customer LIMIT 1)) пытается преобразовать имя первого клиента в таблице клиентов в целочисленный тип, что невозможно. В результате сервер базы данных выдает ошибку, содержащую информацию о структуре таблицы.

г) Пакетный запрос SQL-инъекций/атаки с резервным копированием: эта форма внедрения опасна, поскольку она пытается получить полный контроль над базой данных. Злоумышленник завершает исходный запрос приложения и вводит свой собственный запрос на сервер базы данных. Например, при рассмотрении SQL-запроса: aaa; INSERT INTO пользователей ('Abubakar', '1234');#, первая точка с запятой (;) завершает исходный запрос, и запрос добавляет имя пользователя «Abubakar» и пароль «1234» в таблицу пользователей и хэш (# ) закомментирует оставшийся запрос, чтобы он не выполнялся сервером. Однако эта форма атаки работает только на SQL-Server 2005, потому что это единственный сервер, который принимает несколько запросов одновременно.

д) SQL-инъекция на основе Like. Этот тип внедрения используется хакерами для олицетворения конкретного пользователя с помощью ключевого слова SQL LIKE с подстановочным знаком (%). Например, злоумышленник может ввести ввод: «что угодно OR имя пользователя, LIKE ‘S%’ ;# вместо имени пользователя, чтобы получить SQL-запрос: SELECT * FROM users WHERE username =’ что угодно OR имя пользователя, LIKE ‘S%’; #”. Оператор LIKE реализует сравнение соответствия шаблону, то есть сопоставляет строковое значение со строкой шаблона, содержащей подстановочный знак. Запрос выполняет поиск в таблице пользователей и возвращает записи пользователей, чье имя пользователя начинается с буквы S. Подстановочный знак (%) означает ноль или более символов (S…), и его можно использовать до или после шаблона.

е) Шестнадцатеричная/десятичная/бинарная вариационная атака (закодированная инъекция): при этом типе внедрения хакер использует разнообразие языка SQL, используя шестнадцатеричные или десятичные представления ключевых слов вместо обычных строк и символов кода внедрения.

Функция filter() была разработана для предотвращения SQL-инъекций и XSS-атак. Эта функция содержит другие функции, каждая из которых была написана для обнаружения конкретной формы атаки. Если хотя бы одна функция возвращает True, то фильтр() заблокирует этого пользователя, сбросит HTTP-запрос и отобразит соответствующее предупреждающее сообщение. Первый оператор в приведенном ниже алгоритме представляет ввод пользователя, который собирается из веб-формы с использованием метода POST и передается I. Затем filter() собирает ввод пользователя и сначала преобразует любую найденную строку ASCII, чтобы предотвратить закодированную инъекцию. атака. Если нет какой-либо строки ASCII и она не пуста, то пользовательский ввод будет проанализирован для других функций, чтобы проверить, содержит ли он какой-либо код внедрения SQLI на основе логического, SQLI на основе объединения, SQLI на основе ошибок, Пакетный запрос SQLI, SQLI на основе Like и XSS, а результаты функций представлены как a, b, c, d, e и f соответственно. Если один из результатов возвращает true, то во входных данных пользователя обнаруживается строка инъекции, которая запускает некоторые функции: blockUser(), resetHTTP() и warningMessage(), чтобы заблокировать пользователя, сбросить HTTP-запрос. и выдать предупреждающее сообщение.

На основе выявленных паттернов была сформулирована функция filter() с использованием алгоритма сопоставления строк KMP. Сформулированная функция filter() обнаруживает и предотвращает любые формы SQL-инъекций и XSS-атак. Ожидается, что каждая входная строка будет проходить через эту функцию filter(). Если хотя бы одна функция возвращает True, функция filter() заблокирует этого пользователя, сбросит HTTP-запрос и отобразит соответствующее предупреждающее сообщение. Этот метод был протестирован с использованием плана тестирования, состоящего из различных форм атак на основе логических значений, на основе объединения, на основе ошибок, пакетных запросов, подобных атак, закодированных SQL-инъекций и атак с использованием межсайтовых сценариев. Результаты тестирования показывают, что этот метод может успешно обнаруживать и предотвращать атаки, регистрировать запись об атаке в базе данных, блокировать систему, используя ее Mac-адрес, для предотвращения дальнейших атак и выдавать заблокированное сообщение. Сравнение предложенного метода с существующими методами показало, что предложенный метод более эффективен, поскольку он не ограничен конкретной формой атаки и может обрабатывать различные формы SQL-инъекций и XSS-атак.

Список литературы

  1. Дунаев, В. В. Базы данных. Язык SQL для студента / В.В. Дунаев. – М.: БХВ-Петербург, 2017. – 288 c.
  2. Прайс, Джейсон Oracle Database 11g: SQL. Операторы SQL и программы PL/SQL / Джейсон Прайс. – М.: ЛОРИ, 
  3. О.К. Абикой, А.Д. Харуна, А. Абубакар, Н.О. Аканде, Э.О. Асани, Модифицированный расширенный стандартный алгоритм шифрования для обеспечения информационной безопасности, 2019.
  4. Рон, Хардман Oracle Database PL/SQL. Рекомендации эксперта / Хардман Рон, 2014.
  5. Пржиялковский, В. В. Введение в Oracle SQL / В.В. Пржиялковский. – М.: Бином. Лаборатория знаний, Интернет-университет информационных технологий, 2016.

Интересная статья? Поделись ей с другими: