Слепая инъекция SQL


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

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

Примеры

Злоумышленник может проверить, вернул ли отправленный запрос истину или ложь несколькими способами:

На основе контента

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

http://example.com/items.php?id=2
отправляет в базу данных следующий запрос:

SELECT title, description, body FROM items WHERE ID = 2
Затем злоумышленник может попытаться ввести запрос, который возвращает "false":

http://example.com/items.php?id=2 and 1=2
Теперь SQL-запрос должен выглядеть так:

SELECT title, description, body FROM items WHERE ID = 2 and 1=2
Если веб-приложение уязвимо для SQL-инъекции, то оно, вероятно, ничего не вернет. Чтобы убедиться в этом, злоумышленник введет запрос, который вернет "истину":

http://example.com/items.php?id=2 and 1=1
Если содержимое страницы, возвращающей "истину", отличается от содержимого страницы, возвращающей "ложь", то злоумышленник может отличить, когда выполненный запрос возвращает "истину" или "ложь".

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

На основе времени

Этот тип слепой инъекции SQL основан на том, что база данных приостанавливается на определенное время, а затем возвращает результаты, указывающие на успешное выполнение SQL - запроса. Используя этот метод, злоумышленник перечисляет каждую букву нужного фрагмента данных, используя следующую логику:
  • Если первая буква имени первой базы данных - "А", подождите 10 секунд.
  • Если первая буква имени первой базы данных - "B", подождите 10 секунд. и т.д.
Microsoft SQL Server

http://www.site.com/vulnerable.php?id=1' waitfor delay '00:00:10'--
MySQL

SELECT IF(expression, true, false)
Использование некоторой операции, требующей времени, например, BENCHMARK(), приведет к задержке ответов сервера, если выражение истинно.

BENCHMARK(5000000,ENCODE('MSG','by 5 seconds'))
выполнит функцию ENCODE 5000000 раз.

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

1 UNION SELECT IF(SUBSTRING(user_password,1,1) = CHAR(50),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM users WHERE user_id = 1;
 
Если ответ базы данных занял много времени, мы можем ожидать, что первый символ пароля пользователя с user_id = 1 будет символом "2".

(CHAR(50) == '2')
Используя этот метод для остальных символов, можно перечислить все пароли, хранящиеся в базе данных. Этот метод работает даже тогда, когда злоумышленник вводит SQL-запросы, а содержимое уязвимой страницы не меняется.

Очевидно, что в этом примере были указаны имена таблиц и количество столбцов. Однако их можно угадать или проверить методом проб и ошибок. Базы данных, отличные от MySQL, также имеют функции, основанные на времени, которые позволяют использовать их для атак, основанных на времени:
  • MS SQL: 'WAIT FOR DELAY '0:0:10''
  • PostgreSQL: pg_sleep()
Еще один популярный способ сделать это-вызвать функции, которые вернут текущую дату. MySQL, MSSQL и Oracle имеют для этого разные функции, соответственно now(), getdate() и sysdate().
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, информационная безопасность, sql




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




Async и Defer — стратегии загрузки JavaScript
Отображение капчи в Joomla
Вопросы и ответы на собеседовании PHP программиста