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

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

Существует два типа слепых SQL-инъекций: булевые (boolean-based) и на основе времени (time-based).

Последствия слепой SQL-инъекции

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

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

Что такое булевые слепые SQL-инъекции?

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

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

Пример булевой слепой SQL-инъекции

В качестве примера следующий запрос предназначен для отображения деталей продукта из базы данных:

SELECT * FROM products WHERE id = product_id

Первоначально злоумышленник использует программу легитимным способом, чтобы выявить по крайней мере один имеющийся ID продукта – в этом примере это продукт 42. Затем он может предоставить следующие два значения для product_id:

42 AND 1=1
42 AND 1=0

Если этот запрос выполняется в приложении с помощью простого объединения строк, запрос соответственно принимает следующий вид:

SELECT * FROM products WHERE id = 42 and 1=1
SELECT * FROM products WHERE id = 42 and 1=0

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

И если сервер базы данных является Microsoft SQL Server, злоумышленник может предоставить такое значение для product_id:

42 AND (SELECT TOP 1 substring(name, 1, 1)

  FROM sysobjects

  WHERE id=(SELECT TOP 1 id

    FROM (SELECT TOP 1 id

      FROM sysobjects

      ORDER BY id)

    AS subq

    ORDER BY id DESC)) = 'a'

В результате подзапрос в скобках после 42 AND проверяет, начинается ли имя первой таблицы в базе данных с буквы “a”. Если значение true, программа будет вести себя так же, как и для полезной нагрузки 42 AND 1=1. Если значение false – как для 42 AND 1=0.

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

Что такое слепая SQL-инъекция на основе времени?

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

Пример слепой SQL-инъекции на основе времени

Можно принять тот же запрос, что и в приведенном выше примере:

SELECT * FROM products WHERE id = product_id

Злоумышленник может придать такое значение product_id:

42; WAITFOR DELAY '0:0:10'

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

SELECT * FROM products WHERE id = 1; WAITFOR DELAY '0:0:10'

Если сервером базы данных является Microsoft SQL Server, а программа уязвима к слепым SQL-инъекциям на основе времени, злоумышленник увидит 10-секундную задержку в программе.

Теперь, когда злоумышленник знает, что слепые SQL-инъекции на основе времени возможны, он может дать такое значение product_id:

42; IF(EXISTS(SELECT TOP 1 *

  FROM sysobjects

  WHERE id=(SELECT TOP 1 id

    FROM (SELECT TOP 1 id
 
      FROM sysobjects
 
      ORDER BY id)
 
    AS subq

    ORDER BY id DESC)

  AND ascii(lower(substring(name, 1, 1))) = 'a'))

  WAITFOR DELAY '0:0:10'

Если имя первой таблицы в структуре базы данных начинается с буквы “a”, вторая часть этого запроса будет true и программа отреагирует с 10-секундной задержкой.

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

О технике обхода кэша для SQL-инъекции на основе времени можно прочитать здесь.

Как предотвратить уязвимости слепой SQL-инъекции?

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

Если язык программирования не поддерживает параметризированные запросы, но механизм базы данных поддерживает сохраненные процедуры, можно использовать их с подготовленными операторами (prepared statements).

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

Обнаружение слепой SQL-инъекции

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

В частности, для этого можно использовать решение DAST (black-box тестирования), которое позволит вовремя найти эту уязвимость для дальнейшего исправления.

Если вы хотите бесплатно протестировать Invicti DAST (на основе Acunetix и Netsparker), оставьте ваши контакты, и мы к вам обратимся:

Запрос на бесплатное тестирование Invicti

Подписаться на новости