Защита от SQL инъекций PHP

Digital

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

Особенности SQL инъекцииЗащита от SQL инъекций PHP

Атака SQL-кода  – это распространенный метод взлома сайтов и программ, которые взаимодействуют с базами данных. Данный метод базируется на введении в запрос специального SQL-кода.

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

Атака с внедрением SQL становится доступной, благодаря измененному вводу данных, руководствующихся в SQL-запросах.

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

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

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

Пример инъекции SQL

Мама испекла пирожки, которые надо было отнести бабушке. Мама ушла на работу, а Машеньке оставила записку: «Отнеси эти пирожки бабушке». Брат Машеньки решил подшутить над сестрой, и дописал «но отдай их дедушке». В итоге получилась такие записка: «Отнеси эти пирожки бабушке, но отдай их дедушке».

Так как Машенька была послушной девочкой, она строго выполнила то, что указано в записке. В итоге пирожки получила не бабушка, а дедушка.

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

Какие инъекции существуют?Защита от SQL инъекций PHP

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

Числовой входящий параметр

Он проявляет себя при подставлении кавычек в ID новости. Например, при выставлении кавычек в запрос index1.php., скрипт выдаст ошибку.

В случае, когда ошибки нет, то здесь:

  1. SQL инъекции здесь нет. Фильтрации подлежат кавычки. Или установлено преобразование в (int).
  2. Выведение ошибок не работает.

Строковой входящий параметр

Например, надо отправить запрос index2.php по имени пользователя, без фильтрации. Снова используем кавычки: sqlinj/index2.php?user=VladimirPHP’. Если программа выдает ошибку, это означает, что уязвимость имеется.

Так, знак «—» является комментарием в SQL, где с обеих сторон от него необходимы пробелы. В адресной строке они отмечаются как « %20». И все, что стоит после комментария, удалится автоматически, и запрос выполнится.

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

Итак, при использовании числового параметра в запросе уже не нужно ставить кавычку на конце строки.

К примеру, возвращаясь к скрипту sqlinj/index1.php?id=1 UNION SELECT1, запрос будет таким: SELECT * FROM news WHERE id=1 UNION SELECT1.

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

Нужно лишь отправлять несколько раз такие запросы:

sqlinj/index1.php?id=1 UNION SELECT 1,2…5

После каждого будет выдавать ошибку. Когда числостолбцов будет равно 5, ошибку не выдаст.

Иногда взломщику, осуществляющему нападение, видно лишь одну колонку. В случае MySQL нарушитель имеет возможность использовать функцию: group_concat (col, symbol, col), которая умеет объединять колонки.

Бывают случаи, когда SQL-запрос, подверженный такой уязвимости, обладает структурой, которая не допускает применение «union».

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

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

После изменения данных в строке: SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE (‘a%’.)

Здесь фрагмент запроса AND author LIKE (‘a%’) вписана в строку как комментарий и не имеет воздействия на итог.

Расщепление запросаЗащита от SQL инъекций PHP

Помимо объединения, в SQL-языке существует и команды расщепления. Для того, чтобы произвести подобные действия, применяют символ «;» (точка с запятой). При его введении в запрос, взломщик имеет доступ к выполнению команд в одном запросе. Но не везде.

Пример: $id = $_REQUEST[‘id’];

Если $res = mysqli_query(«SELECT * FROM news WHERE id_news = $id»); то атакующие получают строку, которая содержит точку с запятой. Поэтому в одном запросе будет больше двух команд:

SELECT * FROM news WHERE id_news = 12; а также INSERT INTO admin (username, password) VALUES (‘HaCkEr’, ‘foo’). А в таблицу admin будет незаконно вставлена запись HaCkEr.

Часто случается, что полей бывает от двадцати до шестидесяти. Избегая лишних действий по манипуляциям с полями, подлежит использованию инструмент GROUP BY:

  1. В случае, когда sqlinj/index1.php?id=1 GROUP BY 2 не выбивает ошибки, значит, числовой показатель полей больше двух.
  2. В случае, когда …GROUP BY 8 выбивает ошибку, то количество полей меньше, чем 8.
  3. В ситуации, кода при …GROUP BY 4 ошибка отсутствует, а при … GROUP BY 6 появляется, значит, число полей будет пять.

Как же определить количество выводимых столбцов? В начале надо подставить фиктивный ID.

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

К примеру, известно, что существует таблица users, где присутствуют поля id, name, а также pass. Требуется отыскать информацию о личности с ID=1.

Алгоритм действий:

  1. Выполняется запрос: sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE id=1.
  2. Затем необходимо дописать название полей, вместо цифр 1 и 3. Выходит следующее: sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE id=1.

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

Запись файловЗащита от SQL инъекций PHP

Для осуществления записи файла применяют функцию OUTFILE.  Пример: sqlinj/index2.php?user=-1′ UNION SELECT 1,2,3,4,5 INTO OUTFILE ‘1.php’ —%20.

Здесь вместо нужного поля применяется функция LOAD_FILE.

И теперь стало возможным прочитать файл.

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

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

Аномальным поведением стоит считать, как сообщение о различных ошибках, так и отсутствие страниц вообще при запросе данных

Как предотвратить мошенничество?Защита от SQL инъекций PHP

Как и говорилось ранее, лучший способ защиты – это фильтрация. Она может применяться и для строковых, и для целочисленных параметров. Также поможет усечение входных параметров. С целью существенных изменений SQL-запроса необходимо наличие довольно длинных строк (не менее 8 символов). Если максимальная длина параметра небольшая, то его усечение до 3-4 символов вполне может стать методом защиты.

Также возможно использование подготовленных выражений Многие серверы допускают отправку так называемых параметризованных запросов отдельно от главного. Либо они экранируются самой клиентской библиотекой.

Все SQL инъекции можно разделить на несколько типов:

  1. Самая опасная – это классическая, позволяющая присвоить базу данных без особых трудностей. Применение здесь однострочных комментариев поможет избежать части запроса, следующую за инъекцией. Многострочные комментарии проверяют или определяют тип базы данных. Другие комментарии в состоянии определить вид базы данных, что позволит в дальнейшем использовать уязвимости в своих целях.
  2. Error-based передает информацию по ошибке СУБД. Избежать этот тип атак можно запретом вывода ошибок на проде.
  3. Boolean-based дает возможность детального копирования информации. Когда хакер имеет возможность получить информацию о наличии ошибки либо ее отсутствии, в сервисе должна присутствовать уязвимость к обычной слепой атаке.
  4. Time-based может манипулировать временем отклика базы. Используется при полной слепой атаке.
  5. Out-of-Band играет на индивидуальных качествах формирования данных.

Считается, что уязвимые точки для атаки локализованы в самом запросе, поэтому и защита строится с учетом этого факта.

Защита от SQLЗащита от SQL инъекций PHP

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

Манипуляции со строками

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

Обход аутентификации

Самым действенной классической инъекцией в этом случае является использование команды UNION. Она позволяет вертикально комбинировать показатели из различных таблиц в одну. Через UNION можно выставить любые данные и найти таблицы пользователей.

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

Слепые инъекции

Когда приложение сделано качественно, бывает трудно выстроить защиту. И тогда приходит очередь действовать вслепую. И основой слепого метода часто становятся атаки с использованием IF и WHERE. В этом случае операторы должны быть закодированы

Стоит применять Boolean-based в случае возможности для хакера получить информацию о наличии ошибки из HTTP-статуса. При полной слепой атаке используют Time-Based.

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

Часто пользователи уверены в достоверности SQL-запросов и не подозревают, что последние могут быть подделаны. А ведь поддельные запросы в состоянии обойти ограничения доступа, классическую проверку авторизации и предоставить операционной системе полномочия.

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

Если пользователь по каким-то причинам избежал проверки пользовательского ввода, то взломщик без труда может создать еще одного пользователя БД с правами суперпользователя.

Есть еще способ непосредственного приобретения пароля учетных записей в БД. Это атака самих страниц, предоставляющих поиск по базе. Хакер доступными ему способами проверяет использование в запросе переменную, которая подлежит отправке на сервер. Такой переменной может стать фильтр, установленный на предыдущей странице. А в случае использования в базе конструкции UNION, атакующий присоединяет к оригинальному запросу дополнительный с целью извлечения пользовательских паролей. Поэтому пароли всегда необходимо шифровать.

Также для атаки часто используются команды UPDATE. Суть угрозы состоит в том, чтобы разделить запрос на несколько частей и присоединить новый.

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

Несколько простых советовЗащита от SQL инъекций PHP

Большинство удачных атак основывается на коде, который написен без учета соответствующих требований безопасности.

 Существует несколько советов, как избежать атаки взломщиков:

  1. Не соединяться с базой данных, используя имя владельца или имя суперпользователя. Лучше создать новое.
  2. Всегда использовать подготовленные выражения.
  3. Обязательно проверять введенные данные по всем известным параметрам.
  4. Если приложение требует цифровой ввод, стоит использовать числовое представление при помощи известных функций.

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

Паук - Cтудия интернет-маркетинга
Добавить комментарий