SQL Injection: Защитите свою систему баз данных

В крупных и средних компаниях системы баз данных незаменимы: Практичные системы хранения данных структурированы для хранения и управления информацией о банковских и страховых счетах и бронированиях. Многие компании планируют свои ресурсы с помощью программного обеспечения для планирования ресурсов предприятия, которое не может функционировать без базы данных. Даже большинство систем, предлагаемых в Интернете, были бы невозможны без систем баз данных. Настройка и ведение электронных указателей очень сложны — но самая большая проблема заключается в обеспечении их сохранности. Методы резервного копирования и использование отказоустойчивого оборудования так же важны, как и комплексные меры защиты от внешнего доступа. Так называемые SQL-инъекции — одна из самых больших опасностей для традиционных реляционных моделей баз данных и внедренной в них информации.

Что такое SQL-инъекция?

SQL-инъекции — это эксплуатация недостатка безопасности в системах реляционных баз данных, которые при вводе данных полагаются на язык SQL. Злоумышленник использует пользовательский ввод в интерфейсах баз данных, который недостаточно замаскирован и содержит метасимволы, такие как двойное тире, кавычки или точка с запятой. Эти символы представляют собой специальные функции для интерпретатора SQL, позволяющие влиять на внешние команды изнутри. SQL-инъекция часто возникает при работе с программами PHP и ASP, которые полагаются на старые интерфейсы. Вводимые данные иногда не получают необходимой маскировки, что делает их идеальной мишенью для атаки.

С помощью целенаправленного использования символов функций неавторизованный пользователь может ввести дополнительные команды SQL и манипулировать записями таким образом, чтобы получить возможность изменять, удалять или читать данные. В крайних случаях возможно даже, что злоумышленник может получить доступ к командной строке системы и таким образом получить доступ ко всему серверу баз данных.

Пример SQL-инъекции: Как происходит атака на базу данных

Поскольку уязвимые базы данных быстро и легко отслеживаются, а атаки с использованием SQL-инъекций так же легко проводятся, этот метод является одним из самых популярных в мире. Преступники могут проводить различные схемы атак и использовать как существующие, так и хорошо знакомые бреши в безопасности процессов управления данными, используемых приложениями. Чтобы объяснить, как именно работает SQL-инъекция, мы собрали для вас примеры некоторых наиболее популярных методов.

Пример 1: Доступ через неадекватно замаскированный пользовательский ввод

Чтобы пользователь мог получить доступ к базе данных, ему обычно необходимо сначала пройти аутентификацию. Для этого существуют скрипты, которые, например, представляют форму входа в систему, состоящую из имени пользователя и пароля. Пользователь заполняет форму, а скрипт проверяет, существует ли соответствующая запись в базе данных. Обычно для этого в базе данных есть таблица с именем «users», а также строки «username» и «password». Для любого веб-приложения соответствующие строки сценария (псевдокод) для доступа к веб-серверу могут выглядеть следующим образом:

uname = request.POST['username']
passwd = request.POST['password']

sql = "SELECT id FROM users WHERE username='" + uname + "' AND password='" + passwd + "'"

database.execute(sql)

Теперь у злоумышленника есть возможность манипулировать полем пароля с помощью SQL-инъекции, например, набрав password’ OR 1=’1, что приведет к следующему SQL-запросу:

sql = "SELECT id FROM users WHERE username='' AND password='password' OR 1='1'

Таким образом, злоумышленник получает доступ ко всей таблице пользователей базы данных, поскольку пароль всегда истинный (1=’1′). Если он войдет в систему как администратор, то сможет внести любые изменения в записи, которые захочет. Таким же образом можно манипулировать и полем имени пользователя.

Пример 2: Шпионаж за данными с помощью манипуляции идентификатором

Запрос информации из базы данных по идентификатору — практичный и распространенный метод, но он также открывает возможные ворота для SQL-инъекций. Например, веб-сервер через передаваемый идентификатор в URL знает, какую информацию он должен вызвать из базы данных. Соответствующий PHP-скрипт выглядит следующим образом:

<?php 
  #Datenbankabfrage anhand einer ID 
  $id = $_REQUEST['id'];
  $result = mysql_query("SELECT * from tabelle WHERE id=$id");
  
  # Anzeige des Ergebnisse ...
   ?>

Ожидаемый URL имеет вид …/script.php?id=22. В указанном случае будет вызвана запись таблицы с идентификатором 22.  Если внешний пользователь имеет возможность манипулировать этим запрашивающим URL, он может послать на веб-сервер запрос …/script.php?id=22+or+1=1, и в результате вызова msyql_query будет считана не только запись с ID 22, но и все данные:

SELECT * FROM tabelle WHERE id=22 or 1=1

Как злоумышленники находят уязвимые системы баз данных

В принципе, каждый веб-сайт и каждое веб-приложение подвержены SQL-инъекции, если в качестве языка базы данных используется SQL — потому что слишком часто производители программ, которые взаимодействуют с базой данных, не обеспечивают достаточную степень безопасности. Обнаруженные слабые места не остаются тайной в огромном мире Интернета, и, например, существуют страницы, на которых отображается информация о том, какие текущие бреши в безопасности раскрывают преступникам, как они могут найти подходящие веб-проекты с помощью поиска Google. Благодаря стандартным отчетам об ошибках не требуется много времени, чтобы проверить, действительно ли указанные хиты являются потенциальной целью атаки. Можно просто добавить апостроф к URL-адресу, содержащему параметр ID (как в следующем примере):

[Domainname].de/news.php?id=5‘

Уязвимый веб-сайт отправляет сообщение об ошибке в следующем виде:

«Запрос не удался: У вас ошибка в синтаксисе SQL…».

Подобные методы также могут быть использованы для вывода номеров столбцов, имен таблиц и столбцов, версии SQL или даже пользователей и паролей. Большинство бесплатных инструментов позволяют автоматизировать поиск и последующие SQL-инъекции. В любом случае, эксплуатация известных брешей в системе безопасности наказуема, поскольку система баз данных не принадлежит себе и может быть подвергнута проверке на безопасность.

Как защитить свою базу данных от SQL-инъекций

Существуют различные методы, которые вы можете использовать для предотвращения атак SQL-инъекций на вашу систему баз данных. Вы должны работать со всеми задействованными компонентами — сервером и отдельными приложениями, а также системой управления базой данных.

Шаг 1: Контролируйте автоматические записи приложения

Тестируйте и фильтруйте методы и параметры, которые подключенные приложения используют при входе в базу данных. Передаваемые данные всегда должны быть в ожидаемом типе данных. Если требуется числовой параметр, вы можете проверить его с помощью PHP-скрипта с функцией is_numeric(). При фильтрации необходимо игнорировать соответствующие специальные символы. Еще один важный момент — убедиться, что приложения не выводят никаких внешних сообщений об ошибках, раскрывающих информацию о системе или структурах базы данных.

Между тем, так называемые подготовленные операторы являются популярной практикой, поскольку их можно использовать со многими системами управления базами данных. Эти заранее подготовленные операторы изначально использовались для выполнения более частых запросов, но благодаря своей структуре они также снижают риск SQL-инъекций. Потому что операторы параметров передают фактическую команду SQL от параметров отдельно в базу данных. Только сама система управления базой данных связывает их вместе и автоматически маскирует важные специальные символы.

Шаг 2: Обеспечьте комплексную защиту сервера

Безопасность сервера, на котором работает ваша система управления базами данных, также играет большую роль в предотвращении SQL-инъекций. Первый шаг — это установка операционной системы в соответствии с установленным шаблоном:

  • Установите или включите только те приложения и службы, которые имеют отношение к работе базы данных.
  • Удалите все ненужные учетные записи пользователей.
  • Убедитесь, что установлены все необходимые обновления системы и программ.

Чем выше требования к безопасности вашего веб-проекта, тем больше вероятность того, что вам придется рассмотреть возможность использования систем обнаружения вторжений (IDS) или систем предотвращения вторжений (IPS). Они работают с различными системами обнаружения, чтобы обнаруживать атаки на сервер на ранней стадии, выдавать предупреждения и, в случае IPS, автоматически инициировать соответствующие контрмеры.  Шлюз прикладного уровня, который отслеживает трафик между приложениями и веб-браузером непосредственно на уровне приложений, также может быть эффективной защитой.

Шаг 3: Укрепление базы данных и использование безопасных кодов

Как и операционная система, база данных должна быть очищена от всех неактуальных факторов и регулярно обновляться. Для этого удалите все ненужные хранимые процедуры и отключите все ненужные службы и учетные записи пользователей. Создайте специальную учетную запись базы данных, предназначенную для доступа из Интернета, которая имеет минимальные права доступа. Храните все конфиденциальные данные, такие как пароли, в базе данных в зашифрованном виде.

Когда речь идет о подготовленных операторах, настоятельно рекомендуется не использовать PHP-модуль mysql, а вместо него выбрать mysqli или PDO. Таким образом, вы также сможете защитить себя с помощью безопасных кодов. Например, функция mysqli_real_escape_string() в PHP-скриптах предотвращает передачу специальных символов в базу данных SQL в исходном виде и вместо этого маскирует их. Если вы, например, расширите следующие строки кода

$query = "SELECT * FROM users 
WHERE username= '" . $_POST['username'] . "' 
AND password= '" . $_POST['password'] . "'";

следующей функцией

$query = "SELECT * FROM users 
WHERE username= '" . mysqli_real_escape_string($_POST['username']) . "' 
AND password= '" . mysql_real_escape_string($_POST['password']) . "'";

то проблемные символы пользовательского ввода будут заменены на безопасный вариант SQL (‘).

Какое отношение имеют Bobby Tables к SQL-инъекциям

На домашней странице сайта bobby-tables.com размещен веб-комикс xkcd, посвященный теме приглашения к вводу данных пользователем. В комиксе показана мать, которой позвонили из школы, где учится ее сын, ласково называемый Маленьким Бобби Таблиц. Она подтверждает школе, что ее сына на самом деле зовут Роберт’); DROP TABLE Students;- — и затем узнает причину звонка — при попытке создать запись для Роберта в базе данных учеников школа случайно удалила весь набор данных. Мать Роберта просто отвечает, что надеется, что школа усвоила урок и в будущем будет лучше структурировать свои базы данных.

Комикс призван разъяснить фатальные последствия непреднамеренного или непроверенного ввода данных пользователем в базу данных. В случае со школьной базой данных ситуация, вероятно, следующая:

Имена учеников сохраняются в таблице с именем «Ученики». Как только в школу приходит новый ученик, он вводится в таблицу с помощью соответствующего кода, который выглядит примерно следующим образом:

$sql = "INSERT INTO Students (Name) VALUES ('" . $studentName . "');";
execute_sql($sql);

Это обычная команда SQL-INSERT, которая вставляет содержимое переменной $studentName в таблицу Students. Вторая часть кода используется для передачи задания в базу данных (execute_sql). Для студента по имени Paul задание SQL будет работать так, как нужно. Соответствующий код

INSERT INTO Students (Name) VALUES ('Paul');

вставляет Paul в таблицу Students. Теперь тот же оператор должен сделать запись для таблицы Bobby Tables, что приводит к следующей строке кода:

INSERT INTO Students (Name) VALUES ('Robert'); DROP TABLE Students;––');

Запись Роберта была добавлена в таблицу таким образом, но содержащийся в имени оператор DROP TABLE привел к тому, что впоследствии вся таблица была удалена. Из-за немаскируемого входа в базу данных SQL-инъекция матери (скрывающейся за именем маленького Бобби Table) была успешной.

Но решение, представленное в комиксе — очистить код вручную — на самом деле не рекомендуется. Поскольку ручное маскирование символов очень чревато ошибками, для защиты базы данных от вредоносных атак и предотвращения SQL-инъекций следует отдавать предпочтение таким решениям, как параметризованные операторы или маскирующие функции типа mysqli_real_escape_string().

Оцените статью
cdelat.ru
Добавить комментарий