Сліпа SQL-ін’єкція – це тип атаки, коли зловмисник не отримує очевидної відповіді від бази даних, а натомість крок за кроком реконструює її структуру на основі поведінки сервера бази даних та програми.
Існує два типи сліпих SQL-ін’єкцій: булеві та на основі часу (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), то залиште ваші контакти, і ми до вас звернемося:







