SQL уязвимость, виды и методы защиты

22 ноября 2020

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


Что такое SQL-уязвимость?

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




Причины допущения SQL уязвимости

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

  • недостаточное экранирование пользовательских данных;
  • старое программное обеспечение (необходимо постоянно следить за обновлениями);
  • неправильно настроены права и фильтрация ввода;
  • включен вывод ошибок на «рабочей» системе.

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




Виды SQL уязвимости

Существует три вида уязвимости SQL, один из которых делится на два подвида. Они отличаются друг от друга методом внедрения запроса к базе данных. Вот названия этих разновидностей SQL injection:

  • Union-based;
  • Error-based;
  • Blind (бывает двух видов: Boolean-based и Time-based).

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


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


Последний вариант SQL уязвимости подразумевает под собой, что результат мошенник получает по косвенным признакам. Как уже было сказано выше, эта разновидность SQL инъекции делится на два вида. Time-based отличается от Boolean-based только тем, что результат мошенник определяет по времени задержки ответа.




Примеры уязвимых PHP скриптов к SQL инъекции

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


Например, если злоумышленник в пароле выйдет из одинарной кавычки, подставив свою, то он может ввести свою логику в SQL запрос, например: "ANYPASSWORD' or 1=1 -- ".
Такая проверка всегда будет возвращать "истино", не зависимо от введеного пароля, если конечно пользователь существует и в итоге злоумышленник получит: 'Вы авторизировались под аккаунтом admin'.




Пример Blind SQL Injection (Time-based)

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

Техника Time-Based основана на работе со временем, к примеру если злоумышленник введет в качестве пароля следующий код: "demo'-BENCHMARK(55555555, rand()) -- ", то MySQL выполнит функцию BENCHMARK очень много раз.
Такой SQL запрос будет выполняться пару секунд, благодаря этому можно предположить, что SQL уязвимость присутствует.




Последствия от SQL уязвимости

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

Также мошенник может сделать DOS сайта (отказ в обслуживании клиентов сайта), либо Deface (на сайте размещается посторонняя реклама, вирусные ссылки или даже замена экрана какой-нибудь картинкой или даже угрозой).

Кроме того, посторонние пользователи могут постараться получить доступ к остальным серверам в этой локальной сети или использовать «захваченный» сервер для майнинга криптовалюты.

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




Защита от SQL уязвимости

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




Резюмируя

Чтобы защититься от SQL injection, необходимо еще на этапе написания кода позаботиться о безопасности.
Важно проанализировать наиболее часто встречающиеся причины получения доступа к базе данных и исключить их по возможности.

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