Слепая 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), оставьте ваши контакты, и мы к вам обратимся:







