Базовое внедрение SQL и смягчение его последствий с примером

Опубликовано: 19 Августа, 2021

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

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

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

 фигура 1

Код для рисунка 1




< form action = "/login.php" method = "POST" >
< p >Username: < input type = "text" name = "username" /></ p >
< p >Password: < input type = "text" name = "password" /></ p >
< p >< input type = "submit" value = "Log In" /></ p >
</ form >

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

 $ _POST ['имя пользователя'] и $ _POST ['пароль'].

Исходя из всего этого, вы можете предсказать следующее:

Если предположить, что это предположение верно, что вы можете сделать, чтобы управлять этим запросом? Представьте, что вы отправляете следующее имя пользователя:

 akash '/ * 




SELECT count (*) FROM users WHERE username = 'akash' /* 'AND password = ' ...'";
 В этом примере / * используется для начала многострочного комментария,
эффективное завершение запроса в этой точке. Это
успешно протестирован с MySQL. Стандартный комментарий 
в SQL начинается с -, и попробовать оба варианта тривиально.

Этот запрос предполагает успешную попытку аутентификации, пока существует учетная запись akash, независимо от пароля. Эта конкретная атака часто используется для кражи учетных записей. Конечно, можно использовать любое имя пользователя (популярной целью является администратор). Таким образом, отправив неверное имя пользователя, вы можете войти в систему, не имея действующей учетной записи.

Смягчение с помощью подготовленных операторов (параметризованные запросы)

Есть много способов защитить SQL-инъекцию. Один из основных методов защиты - «Подготовленные утверждения (параметризованные запросы)». Этот метод заставляет разработчика определять весь код SQL, а затем передавать каждый параметр в запрос позже. Этот стиль позволяет базе данных различать код и данные, независимо от того, какой вводится пользователем.
Подготовленные операторы гарантируют, что злоумышленник не сможет изменить намерение запроса, даже если злоумышленник вставляет команды SQL. Например, если злоумышленник вводит идентификатор пользователя ABC или '1' = '1, параметризованный запрос не будет уязвим и вместо этого будет искать имя пользователя, которое буквально соответствует всей строке ABC или' 1 '=' 1.
За работой:

  1. Подготовка: шаблон оператора SQL создается и отправляется в базу данных. Некоторые значения остаются неопределенными, они называются параметрами (помечены «?»).
    Пример:
     ВЫБРАТЬ количество (*) ОТ пользователей ГДЕ имя пользователя =? И пароль =?;
  2. Анализ: база данных анализирует, компилирует и выполняет оптимизацию запросов в шаблоне оператора SQL и сохраняет результат, не выполняя его.
  3. Выполнить: позже приложение связывает значения с параметрами, и база данных выполняет инструкцию. Приложение может выполнять оператор сколько угодно раз с разными значениями.

Выполнение:




<?php
$stmt = $dbConnection ->prepare( 'SELECT count(*)FROM users WHERE username = ? AND password = ?' );
$stmt ->bind_param( 'ss' , $username , $password );
$stmt ->execute();
$result = $stmt ->get_result();
echo $result ;
?>

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

Рекомендации:

  • Википедия
  • OWASP

Связанная статья:
Смягчение атак с использованием SQL-инъекций с помощью подготовленных операторов (параметризованных запросов)

Эта статья предоставлена Акашем Шараном . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

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