Що таке сліпа SQL-ін’єкція?

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

Запит на безкоштовне тестування Invicti

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