Навчальний посібник із впровадження SQL: навчання на прикладі

⚡ Розумний підсумок

SQL-ін'єкція — це атака, яка порушує динамічні SQL-запитувачі, щоб обійти автентифікацію або розкрити дані, використовуючи веб-застосунки, що створюють запити з неперевіреного введеного користувачем вводу. На цій сторінці показано, як працює атака та як їй запобігти.

  • ???? Визначення: SQL-ін'єкція вставляє шкідливий SQL у запит через невалідоване поле введення.
  • 🔓 Вплив: Успішна атака може обійти логіни та читати, змінювати або видаляти записи.
  • 🧪 приклад: Умова «завжди істинна» плюс коментар перетворюють перевірку входу на обхід.
  • 🛠️ Інструменти: SQLMap та jSQL автоматизують виявлення та використання ін'єкційних параметрів.
  • 🛡️ профілактика: Параметризовані запити, перевірка вхідних даних та облікові записи з найменшими привілеями заповнюють прогалину.
  • 🤖 Сучасний край: Сканери та брандмауери на базі штучного інтелекту виявляють шаблони впровадження, які пропускають виправлені сигнатури.

Підручник з SQL-ін'єкцій

Що таке ін'єкція SQL?

SQL-ін'єкція — це атака, яка отруює динамічні SQL-інструкції, коментуючи певні частини інструкції або додаючи умову, яка завжди буде істинною. Вона використовує недоліки проектування погано розроблених веб-застосунків, щоб експлуатувати SQL-інструкції для виконання шкідливого SQL-коду.

Дані є одним із найважливіших компонентів інформаційних систем. Веб-додатки на базі даних використовуються організаціями для отримання даних від клієнтів. SQL – це абревіатура від Мова Структурованих ЗапитівВін використовується для отримання та маніпулювання даними в базі даних.

Діаграма того, як SQL-ін'єкція маніпулює динамічним запитом до бази даних

Як працює атака SQL-ін'єкцією?

Типи атак, які можна виконати за допомогою SQL-ін'єкції, залежать від типу механізму баз даних. Атака працює з динамічними SQL-інструкціями. Динамічна інструкція – це інструкція, яка генерується під час виконання за допомогою параметрів, переданих з веб-форми або рядка запиту URI.

Приклад впровадження SQL

Розглянемо простий вебзастосунок із формою входу. Код HTML-форми показано нижче.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

ТУТ,

  • У наведеній вище формі приймається адреса електронної пошти та пароль, а потім надсилаються вони до PHP файл з назвою index.php.
  • Він має опцію збереження сеансу входу в cookie. Ми зробили це з прапорця remember_me. Він використовує метод post для надсилання даних. Це означає, що значення не відображаються в URL.

Припустимо, що оператор на серверній частині для перевірки ідентифікатора користувача виглядає наступним чином.

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

ТУТ,

  • У наведеному вище операторі значення масиву $_POST[] використовуються безпосередньо, без їх очищення.
  • Пароль хешується за допомогою алгоритму MD5.

Ми проілюструємо атаку SQL-ін'єкцією за допомогою SQL Fiddle. Відкрийте URL http://sqlfiddle.com/ у вашому веб-браузері. Ви отримаєте таке вікно.

Примітка: вам доведеться написати SQL-запитувачі.

порожній SQL Fiddle вікно, готове до схеми та запиту

Крок 1) Введіть цей код у лівій панелі.

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Крок 2) Натисніть кнопку «Створити схему».

Крок 3) Введіть цей код у правій панелі.

select * from users;

Крок 4) Натисніть кнопку «Виконати SQL». Ви побачите наступний результат.

SQL Fiddle результат, що показує повернутий запис одного користувача

Припустимо, що користувач вказує admin@admin.sys та пароль 1234. Інструкція, що виконується для бази даних, буде такою:

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

Наведений вище код можна використати, закоментувавши частину пароля та додавши умову, яка завжди буде істинною. Припустимо, що зловмисник вводить наступні дані в поле адреси електронної пошти.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx для пароля.

Згенерований динамічний оператор буде таким.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

ТУТ,

  • xxx@xxx.xxx закінчується одинарною лапкою, яка завершує рядок цитати.
  • OR 1 = 1 LIMIT 1 – це умова, яка завжди буде істинною та обмежує отримані результати лише одним записом.
  • — ' AND … — це коментар SQL, який усуває частину пароля.

Скопіюйте наведений вище SQL-запит та вставте його в SQL Fiddle Запустіть текстове поле SQL, як показано нижче.

SQL Fiddle повернення запису після виконання введеної умови

Хакерська діяльність: SQL Inject a Web Application

У нас є простий веб-додаток на http://www.techpanda.org/ що вразливе до атак SQL-ін'єкцій лише для демонстрації. Наведений вище код HTML-форми взято зі сторінки входу. Додаток забезпечує базову безпеку, таку як очищення поля електронної пошти. Це означає, що наш код вище не можна використовувати для обходу входу.

Щоб обійти це, ми використовуємо поле пароля. На діаграмі нижче показано кроки, які потрібно виконати.

Блок-схема кроків для введення поля пароля форми входу

Припустимо, що зловмисник надає наступні вхідні дані.

  • Крок 1: Введіть xxx@xxx.xxx як адресу електронної пошти
  • Крок 2: Введіть xxx') АБО 1 = 1 — ]

Форма входу з рядком ін'єкції, введеним у поле пароля

  • Натисніть кнопку Надіслати.
  • Вас буде перенаправлено на панель керування.

Згенерований SQL-запит буде виглядати наступним чином.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

На діаграмі нижче показано, як генерується твердження.

Розбивка процесу генерації введеного SQL-запиту

ТУТ,

  • У цьому операторі розумно припускається використання шифрування md5.
  • Завершує одинарну лапку та закриваючу дужку.
  • Додає до твердження умову, яка завжди буде істинною.

Загалом, успішна атака поєднує кілька методів, подібних до показаних вище.

Інші типи атак SQL Injection

SQL-ін'єкції можуть завдати більше шкоди, ніж просто обхід алгоритмів входу. Деякі з атак включають:

  • Видалення даних
  • Оновлення даних
  • Вставлення даних
  • Виконання команд на сервері, які можуть завантажувати та встановлювати шкідливі програми, такі як трояни
  • Експорт цінних даних, таких як дані кредитної картки, електронна пошта та паролі, на віддалений сервер зловмисника
  • Отримання даних для входу користувача тощо.
  • Впровадження SQL на основі файлів cookie
  • Ін'єкція SQL на основі помилок
  • Сліпе впровадження SQL

Наведений вище список не є вичерпним; він лише дає вам уявлення про те, що може робити SQL-ін'єкція.

Інструменти автоматизації для впровадження SQL

У наведеному вище прикладі ми використовували методи ручної атаки, засновані на наших глибоких знаннях SQL. Існують автоматизовані інструменти, які можуть допомогти вам виконувати атаки ефективніше та в найкоротші терміни. Ці інструменти включають:

Як запобігти атакам SQL-ін'єкцій

Організація може прийняти наведену нижче політику, щоб захистити себе від атак SQL Injection.

  • Введеним користувачем даним ніколи не слід довіряти – Його завжди потрібно «санітарно» очищувати перед використанням у динамічних SQL-інструкціях.
  • Збережені процедури – вони можуть інкапсулювати SQL-запитувачі та обробляти всі вхідні дані як параметри.
  • Підготовлені заяви – підготовлені оператори працюють таким чином, що спочатку створюється SQL-оператор, а потім усі надіслані дані користувача обробляються як параметри. Це не впливає на синтаксис SQL-оператора.
  • Регулярні вирази – їх можна використовувати для виявлення потенційно шкідливого коду та його видалення перед виконанням SQL-запитів.
  • Права доступу користувачів до бази даних – обліковим записам, що використовуються для, слід надавати лише необхідні права доступу підключитися до бази даних. Це може допомогти зменшити те, що оператори SQL можуть виконувати на сервері.
  • Повідомлення про помилки – вони не повинні розкривати конфіденційну інформацію або місце, де саме сталася помилка. Замість відображення SQL-запитів, які спричинили помилку, можна використовувати прості повідомлення про помилки, такі як «Вибачте, у нас виникли технічні помилки. З технічною командою зв’язалися. Будь ласка, спробуйте ще раз пізніше».

Хакерська діяльність: використовуйте Havij для впровадження SQL

У цьому практичному сценарії ми використовуємо програму Havij Advanced SQL Injection для сканування веб-сайту на наявність вразливостей.

Примітка: Хавідж — це застарілий, недоглянутий Windows інструмент — SQLMap вище є поточним стандартом з відкритим кодом.

Примітка: ваша антивірусна програма може позначити його через його природу. Вам слід додати його до списку виключень або призупинити антивірусна програма.

На зображенні нижче показано головне вікно Havij.

Головне вікно інструменту SQL-ін'єкцій Havij

Вищезазначений інструмент можна використовувати для оцінки вразливості веб-сайту або програми.

Поширені запитання

Тільки з письмового дозволу власника сайту. Тестування програми, яка вам не належить, є незаконним згідно із такими законами, як Закон США про комп’ютерне шахрайство та зловживання. Дозволені умови визначають межі винагороди за виявлені помилки.

Так. У рейтингу OWASP Top 10:2025 ін'єкція займає 05-е місце, і тестування все ще виявляє ін'єкції майже в кожній програмі. З тисячами нових CVE SQL-ін'єкцій на рік, вона залишається провідним веб-ризиком.

MD5 — це швидкий хеш, а не шифрування, і зловмисники швидко його зламують за допомогою райдужних таблиць та графічних процесорів. Натомість використовуйте для паролів повільний, солоний алгоритм, такий як bcrypt або Argon2.

Будь-яка база даних, запит якої здійснюється за допомогою динамічно побудованого SQL — MySQL, PostgreSQL, Microsoft SQL Server, Oracle та SQLiteНедолік полягає в тому, як програма об'єднує введені користувачем дані в запити, а не в механізмі бази даних.

Брандмауери та сканери на базі штучного інтелекту вивчають звичайні моделі трафіку, а потім у режимі реального часу позначають аномальні вхідні дані, такі як введені умови або коментарі. Моделі машинного навчання виявляють завуальовані корисні навантаження, які пропускають фіксовані сигнатури.

Помічники зі штучним інтелектом, такі як Копілот GitHub можуть пропонувати параметризовані запити та перевірку вхідних даних, але вони також відтворюють небезпечні шаблони. Розглядайте кожну пропозицію як чернетку та поєднуйте її з лінтером безпеки, а потім перегляньте.

SQL-ін'єкція впливає на базу даних, впроваджуючи SQL у запити на стороні сервера. Міжсайтовий скриптинг впливає на інших користувачів, впроваджуючи скрипти, що виконуються в їхніх браузерах. Один вид доступу надає дані, інший перехоплює сеанси.

ORM (об'єктно-реляційний маппер) створює запити з об'єктів коду з параметризацією за замовчуванням, запобігаючи більшості SQL-ін'єкцій. Він не є надійним — сирі запити та небезпечні методи все ще просочуються, тому валідація все ще важлива.

Підсумуйте цей пост за допомогою: