У даній статті розберемося з основними поняттями SQL-ін'єкцій, розглянемо деякі поширені приклади, пояснимо як знаходити і використовувати різні види вразливостей, а також в декількох словах викладемо, як запобігти введення SQL коду.
Тестування безпеки: SQL-ін’єкції
- 02.04.2020
- Опубліковано: Admin
Основні поняття
Ін'єкції коду (Code injections), (SQL, PHP, ASP і т.д.) – це вид вразливості, з якою з'являється ймовірність запустити на виконання код з метою отримання доступу до ресурсів системи, злому особистих даних або пошкодження програмного забезпечення.
SQL-ін'єкція (Structured Query Language Injection) – це один з найбільш часто використовуваних способів взлому продуктів, що взаємодіють з базами даних. Суть таких ін'єкцій – впровадити в дані (передані через GET, POST запити) будь-який випадковий SQL код. Якщо ресурс приймає і виконує такі ін'єкції, значить він вразливий, і, по суті, з базою даних можна поводитися, як завгодно.
Причини впровадження
Вразливості впровадження SQL виникають після того, як контрольовані користувачем дані небезпечним способом включаються в запити до бази даних. Зловмисник може надати спеціально створене введення, щоб вирватися з контексту даних, в якому вони відображаються і втрутитися в структуру навколишнього запиту.
Впровадження SQL часто може бути виконано за допомогою цілого ряду шкідливих атак, включаючи читання або зміна критично важливих даних програми, втручання в логіку додатка, підвищення привілеїв в базі даних і отримання контролю над сервером бази даних.
Який вплив успішної атаки SQL-ін'єкцією?
Успішна атака з використанням SQL-ін'єкцій може призвести до несанкціонованого доступу до конфіденційних даних (наприклад, паролі, дані кредитної картки або інші особисті дані користувача). В останні роки багато гучних витоків даних стали результатом атак з використанням саме SQL-ін'єкцій, що призвело до збитків для репутації та штрафів з боку регулюючих органів. У деяких випадках зловмисник може отримати постійний канал в системи організації, що призведе до довгострокової уразливості, яка може залишатися непоміченою протягом тривалого періоду.
Деякі популярні приклади впровадження SQL:
- отримання прихованих даних, де запит SQL змінюється з метою отримання додаткових результатів;
- підрив логіки додатка, де змінюється запит, щоб заважати логіці додатка;
- UNION атаки, де можна отримати дані з різних таблиць бази даних;
- вивчення бази даних, де витягується інформація про версії і структурі бази даних;
- сліпе впровадження SQL, коли результати запиту не повертаються у відповідях додатка.
На основі UNION атаки розберемо конкретний приклад.
Даний тип атаки можливий в тих випадках, коли результати SQL запиту повертаються у відповідях додатка. Зловмисник, використовуючи впровадження SQL, може отримати додаткові дані з інших таблиць в базі даних. Оператор UNION дозволяє виконати додатковий запит SELECT і додати результати в вихідний запит.
Наприклад, додаток виконує запит на отримання інформації про доступність подарункових карток в розділі «Gifts»:
SELECT name, description FROM products WHERE category = 'Gifts'
Зловмисник додає додатковий запит для отримання даних користувача:
'UNION SELECT username, password FROM users--
Сервер додатка обробляє запит і відправляє в базу даних вже ось такий запит:
SELECT name, description FROM products WHERE category = 'Gifts' UNION SELECT username, password FROM users--
В результаті чого зловмисник отримає не тільки назву та опис продуктів, але і разом з цим інформацію про імена і паролі користувачів сайту або програми.
Як виявити вразливості SQL-ін'єкцій?
Більшість вразливостей SQL-ін'єкцій можна швидко і надійно виявити за допомогою різних сканерів веб-вразливостей (наприклад: Burp Suite, OWASP ZAP).
Впровадження SQL також можна виявити вручну, використовуючи систематичний набір тестів для кожної точки входу в додаток. Як правило, це включає в себе:
- відправка символу одинарної лапки ' та пошук помилок або інших аномалій;
- відправка деяких специфічних для SQL синтаксисів, які оцінюють базові значення точки входу і пошук систематичних відмінностей в отриманих відповідях додатка;
- відправка логічних умов, таких як OR 1 = 1 і OR 1 = 2, і пошук відмінностей у відповідях додатка;
- відправка корисних даних, призначених для запуску тимчасових затримок при виконанні в запиті SQL, і пошук відмінностей в часі, необхідних для відповіді.
Способи захисту від SQL-ін'єкцій
Уникнути можливості подібних проблем досить просто. Досить просто перевіряти дані розміщені в запитах нескладним оброблювачем. Слід відокремлювати дані від команд і запитів, для цього існує кілька способів:
- Використання безпечного API, який виключає застосування інтерпретатора або надає параметризований інтерфейс. Можна використовувати інструменти об'єктно-реляційного відображення (ORM).
- Реалізація білих списків на сервері з метою перевірки вхідних даних. Звичайно, даний метод не забезпечить повний захист, оскільки багато програм використовують спецсимволи (наприклад, в текстових областях або API для мобільних додатків).
- Слід також запровадити екранування спецсимволов для інших динамічних запитів, використовуючи відповідний інтерпретатору синтаксис. Примітка: елементи SQL структури, такі як назви таблиць або стовпців, не можна екранувати, тому надавані користувачами назви становлять небезпеку. Це часта проблема платформ для створення звітів.
- Використовуйте в запитах елементи управління SQL для запобігання витоків даних.
Абсолютно безпечних систем не існує, можна лише знизити ймовірність взлому. Для запобігання ін'єкцій, необхідно ретельно перевіряти отримані параметри від користувача будь-якими доступними способами. Можна навіть спробувати зламати власний сайт, щоб дізнатися, які у нього є вразливості: ввести ін'єкції, змінити тип даних, додати в поля знаки екранування, завантажити на сайт файл .php зі шкідливим кодом тощо. Краще зробити це самостійно і запобігти взлому, поки хтось не спрацював на випередження.