SQL-ін’єкція заснована на одному із найстаріших класів вразливостей у веб-додатках. Вони відомі ІБ-експертам з кінця 90-х, але все ще залишаються актуальними. У цій статті ми розповімо, що ці атаки являють собою, як вони працюють і як їх можна запобігти.
SQL-ін’єкція – визначення та опис
SQL-ін’єкція або SQLi – вразливість, яка дозволяє атакуючому використовувати фрагмент шкідливого коду мовою структурованих запитів (SQL) для маніпулювання базою даних та отримання доступу до потенційно цінної інформації. Атаки на основі таких вразливостей – одні з найпоширеніших і найнебезпечніших: вони можуть бути націлені на будь-який веб-додаток або веб-сайт, які взаємодіють з базою даних SQL (а переважна більшість баз даних реалізована саме на SQL).
Як відбуваються атаки на основі ін’єкції SQL?
Щоб зрозуміти принцип дії SQL-ін’єкції, спочатку варто розібратися, що таке мова SQL. SQL – це мова побудови запитів, яка застосовується в програмуванні для читання, зміни та видалення інформації, що зберігається в реляційних базах даних. Оскільки більшість веб-сайтів та веб-додатків взаємодіють з базами даних SQL, атака на основі SQL-ін’єкції може завдати серйозної шкоди організації.
SQL-запит – це запит, направлений у базу даних для виконання певної операції або функції, такий як вилучення даних або виконання SQL-коду. Наприклад, запит може надсилати облікові дані користувача через веб-форму для доступу до сайту. Зазвичай такі веб-форми налаштовані таким чином, щоб приймати лише певні типи даних, такі як ім’я користувача та пароль. Введена інформація звіряється з базою даних. Якщо все збігається, користувач зможе увійти на сайт. А якщо ні – у доступі буде відмовлено.
Ситуація небезпечна тим, що більшість веб-форм не мають механізмів, які б унеможливлювали введення додаткової інформації в поле. Це дає зловмисникам можливість передати до бази даних власні запити через поля введення форми. Вони можуть використовувати цю вразливість у різних злочинних цілях, починаючи з крадіжки конфіденційних даних та закінчуючи маніпулюванням відомостями в базі.
Оскільки більшість веб-сайтів і серверів покладаються на бази даних, SQL-ін’єкції є одними з найдавніших і найпоширеніших видів кібератак. У спільноті кіберзлочинців з’явилося кілька розробок, що підвищують ймовірність таких атак: перш за все йдеться про інструменти, які дозволяють виявити вразливе місце для SQL-ін’єкції. Відповідні утиліти представлені у вільному доступі як проекти з відкритим кодом. Достатньо натиснути потрібну кнопку, і за лічені хвилини буде реалізована атака, що дозволяє отримати доступ до будь-якої таблиці або стовпця бази даних.

Симптоми SQLi-атаки
Успішно проведена атака з SQL-ін’єкцією може взагалі себе не проявляти. Проте іноді можна помітити такі симптоми:
- отримання надлишкового числа запитів за короткий проміжок часу. Наприклад, масовий потік електронних листів від форми зворотного зв’язку веб-сайту.
- рекламні блоки, які перенаправляють користувача на підозрілі веб-сайти.
- дивні спливаючі вікна та повідомлення про помилки.
Типи SQL-ін’єкцій
Залежно від способу отримання доступу до даних бекенд-сервера та потенційних масштабів шкоди SQL-ін’єкції можна розділити на три категорії:
Внутрішньосмугова атака (In-band SQLi)
Це найпростіший вид атаки для зловмисників, тому що для реалізації атаки та збору результатів використовується той самий канал зв’язку. Цей тип SQLi-атак поділяють на два підвиди:
- атака на основі помилок (Error-based SQLi). За такої атаки дії зловмисника призводять до того, що база даних генерує повідомлення про помилку. На основі отриманих повідомлень про помилки зловмисник намагається сформувати уявлення про інфраструктуру бази даних.
- атака з урахуванням об’єднання (Union-based SQLi). Атакуючий отримує необхідні дані шляхом об’єднання кількох інструкцій SELECT в єдину відповідь HTTP за допомогою SQL-оператора UNION.
Інференційна атака (Inferential SQLi, також відома як «сліпа SQL-ін’єкція»)
При таких атаках зловмисники вивчають відповіді та поведінку сервера після надсилання наборів даних, щоб дізнатися більше про структуру бази даних. При цьому жодні записи з бази даних веб-сайту не передаються зловмиснику, і він не бачить їх у тому ж каналі зв’язку, як у випадку внутрішньосмугової атаки (це і пояснюється назва «сліпа SQL-ін’єкція»). Такі атаки поділяють на два підвиди:
- сліпа атака, заснована на часі (Time-based SQLi). Атакуючі направляють SQL-запит до бази даних, змушуючи її зробити затримку кілька секунд, як підтвердить чи спростує отриманий запит.
- бульова сліпа атака (Boolean SQLi). Атакуючі роблять SQL-запит до бази даних, очікуючи отримати результат у вигляді ствердної чи негативної відповіді.
Позасмугова атака (Out-of-band SQLi)
Така атака відбувається у двох випадках:
- коли атакуючі не можуть провести атаку та зібрати дані через один і той же канал зв’язку; або
- коли сервер працює надто повільно чи нестабільно, щоб досягти потрібного результату.
Наслідки атак на основі SQL-ін’єкції
Успішна SQLi-атака може завдати серйозної шкоди бізнесу. SQL-ін’єкція може призвести до таких наслідків:
- розкриття конфіденційних даних. Атакуючі можуть отримати конфіденційну інформацію, що зберігається на SQL-сервері.
- компрометація цілісності даних. Зловмисники можуть редагувати або видалити інформацію у вашій системі.
- порушення приватності користувачів. Залежно від того, які дані зберігаються на SQL-сервері, атака може призвести до розкриття конфіденційних даних користувача – адрес, номерів телефонів і відомостей банківських карт.
- отримання зловмисниками адміністративного доступу до вашої системи. Якщо у користувача бази даних є привілеї адміністратора, за допомогою шкідливого коду атакуючий може отримати доступ до системи.
- отримання зловмисниками загальних прав доступу до вашої системи. Якщо для перевірки імен користувачів та паролів застосовуються занадто прості SQL-команди, атакуючий зможе отримати доступ до вашої системи, навіть не маючи облікових даних користувача. Після цього зловмисник зможе дістатися конфіденційної інформації та змінити її, створивши великі проблеми для вашого бізнесу.

Збитки від SQLi-атак не тільки фінансові. Успішна атака може призвести до репутаційних втрат та втрати довіри клієнтів, якщо відбудеться крадіжка персональної інформації – імен, адрес, телефонних номерів та даних кредитних карток. Повернути довіру клієнтів набагато складніше, ніж її втратити.
Приклади SQL-ін’єкцій
За роки існування цього класу вразливостей від SQLi-атак постраждала безліч організацій. Наведемо деякі гучні випадки:
Fortnite, 2019 р.
Fortnite – це онлайн-гра з аудиторією, що налічує понад 350 млн. гравців. У 2019 році була виявлена вразливість для SQL-ін’єкції, яка дозволила зловмисникам отримати доступ до облікових записів користувача. Вразливість згодом закрили.
Cisco, 2018
У 2018 році було знайдено вразливість для SQL-ін’єкції у Cisco Prime License Manager. Пролом дозволила атакуючим отримати доступ до командної оболонки систем, на яких був розгорнутий диспетчер ліцензій Cisco. Компанія Cisco згодом закрила цю вразливість.
Tesla, 2014
У 2014 році фахівці з кібербезпеки заявили про успішний злам веб-сайту Tesla методом SQL-ін’єкції – їм вдалося отримати адміністративні привілеї і вкрасти дані користувачів.
Запитання та відповіді про SQLi-атаки
Часті питання про SQLi-атаки:
Що таке атака на основі SQL-ін’єкції?
Атака на основі SQL-ін’єкції передбачає використання шкідливого SQL-коду з метою маніпулювання серверною базою даних та доступу до закритої інформації. Сюди можуть належати конфіденційні дані компанії, списки користувачів або відомості про клієнтів. SQL – це абревіатура від Structured Query Language (мова структурованих запитів). Іноді поняття “атака із застосуванням SQL-ін’єкції” скорочують до SQLi.
Що відбувається в процесі ін’єкції SQL?
За допомогою SQLi-атаки зловмисники можуть підміняти цифрову особу, змінювати наявні дані, вилучати конфіденційні дані, видаляти дані або робити їх недоступними, а також отримувати права адміністратора сервера бази даних. SQL-ін’єкція здатна завдати серйозних збитків бізнесу, включаючи втрату довіри клієнтів у разі витоку конфіденційних даних.
Наскільки поширеними є атаки на основі SQL-ін’єкції?
Зловмисники досить часто вдаються до SQLi-атак, адже їх відносно просто реалізувати, а успішна атака може принести більший прибуток. Однозначної статистики щодо цього немає, але за усередненими оцінками, SQL-ін’єкції становлять основну частину атак на програмні системи. За даними спільноти Open Web Application Security Project, атаки на основі впровадження коду, до яких також відноситься SQL-ін’єкція, були третім за значимістю ризиком безпеки для веб-додатків у 2021 році.
Як запобігти атакі на основі SQL-ін’єкції?
Ось ключові принципи, які допоможуть компаніям захистити свої веб-сайти та веб-застосунки від потенційної SQL-ін’єкції:
Проводьте тренінги для персоналу. Підвищуйте проінформованість про ризик SQLi-атак серед членів команди, що відповідає за ваш веб-додаток, та проводьте рольові тренінги для всіх користувачів.
Пам’ятайте про контроль введення користувача. Будь-які дані користувача, вказані в SQL-запиті, несуть потенційні ризики. До закінчення перевірки будь-які адреси, що вводяться автентифікованими та (або) внутрішніми користувачами, варто обробляти так само, як і дані, що надходять ззовні. Облікові записи, які підключаються до бази даних SQL, повинні мати лише мінімально необхідний набір привілеїв. По можливості використовуйте списки дозволених, а не заборонених слів під час перевірки та фільтрації введення користувача.
Не забувайте про оновлення. Для максимального захисту важливо користуватися найостаннішою версією вашого середовища розробки, оскільки в старих версіях можуть бути відсутні сучасні функції безпеки. Встановлюйте актуальні версії програмного забезпечення та виправлення безпеки відразу після їх випуску.
Проводьте регулярні перевірки веб-застосунків. Використовуйте комплексні інструменти керування продуктивністю додатків. Регулярні перевірки веб-застосунків дозволяють виявити та усунути потенційні вразливості до того, як вони обернуться серйозними проблемами.
Використовуйте екран мережі. Нерідко для відсіювання SQLi-атак та інших онлайн-загроз застосовується мережевий екран веб-застосунків (WAF). WAF фільтрує шкідливі SQL-запити, порівнюючи їх з об’ємними та регулярно оновлюваними списками сигнатур. Зазвичай сигнатури у цьому списку описують специфічні вектори атак. Такий список регулярно оновлюється після виявлення нових вразливостей.
