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

SQLi — это своего рода атака в веб-приложении, когда злоумышленник может выполнять вредоносные запросы в базе данных веб-сайта. SQL — это метод внедрения кода, используемый для выполнения вредоносных операторов SQL.

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

Как работает внедрение SQL?

SQL-инъекция содержит вставку или внедрение SQL-запроса через входные данные от клиента в приложении. Они вводятся в плоскость данных, которые влияют на предопределенные команды SQL.

Атаки с внедрением SQL нацелены на уязвимости в динамических операторах SQL. Думайте о динамическом операторе SQL как о многомерной математической функции, параметры которой фиксированы, а результат определяется значениями, помещенными в независимые переменные.

Точно так же динамический оператор SQL также состоит из предопределенного набора параметров (например, веб-формы), и полный оператор генерируется только тогда, когда пользователь вводит данные.

См. следующий пример оператора SQL формы входа:

SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')

Оператор завершается, когда пользователь вводит имя пользователя и пароль. Затем на сервер отправляется запрос для извлечения информации о пользователе из базы данных.

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

Типы SQL-инъекций:

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

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

Внедрение SQL на основе объединения — оператор, созданный базой данных для получения одного HTTP-ответа. Вы можете создать запрос в URL-адресе или объединить несколько операторов в поле ввода, чтобы попытаться сгенерировать ответ.

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

На основе логических значений —Злоумышленник отправляет SQL-запрос в базу данных и просит приложение вернуть разные результаты в зависимости от того, возвращает ли запрос значение True или False.

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

Внеполосный SQLi: внеполосная инъекция SQL (OOB SQLi) — это тип внедрения SQL, при котором злоумышленник не получает ответа от атакуемого приложения по тому же каналу связи. , но может быть обманом отправлен на удаленную конечную точку, контролируемую злоумышленником. Внеполосная инъекция SQL возможна только в том случае, если на используемом вами сервере есть команды, запускающие DNS- или HTTP-запросы. Впрочем, это касается всех популярных SQL-серверов.

Пример на SQLi

Первый пример очень простой. Он показывает, как злоумышленник может использовать уязвимость SQL Injection, чтобы обойти безопасность приложения и аутентифицироваться как администратор.

Следующий сценарий представляет собой псевдокод, выполняемый на веб-сервере. Это простой пример аутентификации с помощью имени пользователя и пароля. В примере базы данных есть таблица с именем users со следующими столбцами: username и password.

# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']

# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”

# Execute the SQL statement
database.execute(sql)

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

password' OR 1=1

В результате сервер базы данных выполняет следующий SQL-запрос:

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

Из-за оператора OR 1=1 предложение WHERE возвращает первое id из таблицы users независимо от того, что такое username и password. Первый пользователь id в базе данных очень часто является администратором. Таким образом злоумышленник не только обходит аутентификацию, но и получает права администратора. Они также могут закомментировать остальную часть оператора SQL, чтобы дополнительно контролировать выполнение запроса SQL:

-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16

Как предотвратить SQL-инъекцию?

Организации могут применять следующие политики для защиты от атак путем внедрения кода SQL.

  1. Никогда не доверяйте пользовательскому вводу. Их всегда следует дезинфицировать перед использованием в динамических операторах SQL.
    Хранимые процедуры — позволяют инкапсулировать операторы SQL и обрабатывать все входные данные как параметры.
  2. Подготовленные операторы –подготовленные операторы, которые сначала создают оператор SQL, а затем обрабатывают отправленные пользовательские данные в качестве параметров. Это не влияет на синтаксис операторов SQL.
    Регулярные выражения — могут использоваться для обнаружения потенциально вредоносного кода и его удаления перед выполнением оператора SQL.
  3. Разрешения пользователя для подключения к базе данных. Учетной записи, используемой для подключения к базе данных, должны быть предоставлены только необходимые разрешения. Это помогает снизить производительность операторов SQL на сервере.
  4. Сообщения об ошибках. Они не раскрывают конфиденциальную информацию или точное местонахождение ошибки. «Извините, произошла техническая ошибка. Я связался с технической командой. Повторите попытку позже» вместо отображения оператора SQL, вызвавшего ошибку.

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

Это именно то, что делает брандмауэр веб-приложений (WAF). Проанализируйте все вводимые пользователем данные в ваше веб-приложение, на предмет совпадений с подозрительным кодом.

Использованная литература:

https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16

https://systemweakness.com/sql-injection-attacks-53e942aae1f8

https://qawerk.com/blog/what-is-sql-injection/

https://brightsec.com/blog/sql-injection-attack/

Также проверьте мои блоги: