Навчальний посібник із впровадження SQL: навчання на прикладі
⚡ Розумний підсумок
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-запитувачі.
Крок 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». Ви побачите наступний результат.
Припустимо, що користувач вказує 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 = 1LIMIT 1 – це умова, яка завжди буде істинною та обмежує отримані результати лише одним записом.- — ' AND … — це коментар SQL, який усуває частину пароля.
Скопіюйте наведений вище SQL-запит та вставте його в SQL Fiddle Запустіть текстове поле SQL, як показано нижче.
Хакерська діяльність: 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 -- ]');
На діаграмі нижче показано, як генерується твердження.
ТУТ,
- У цьому операторі розумно припускається використання шифрування md5.
- Завершує одинарну лапку та закриваючу дужку.
- Додає до твердження умову, яка завжди буде істинною.
Загалом, успішна атака поєднує кілька методів, подібних до показаних вище.
Інші типи атак SQL Injection
SQL-ін'єкції можуть завдати більше шкоди, ніж просто обхід алгоритмів входу. Деякі з атак включають:
- Видалення даних
- Оновлення даних
- Вставлення даних
- Виконання команд на сервері, які можуть завантажувати та встановлювати шкідливі програми, такі як трояни
- Експорт цінних даних, таких як дані кредитної картки, електронна пошта та паролі, на віддалений сервер зловмисника
- Отримання даних для входу користувача тощо.
- Впровадження SQL на основі файлів cookie
- Ін'єкція SQL на основі помилок
- Сліпе впровадження SQL
Наведений вище список не є вичерпним; він лише дає вам уявлення про те, що може робити SQL-ін'єкція.
Інструменти автоматизації для впровадження SQL
У наведеному вище прикладі ми використовували методи ручної атаки, засновані на наших глибоких знаннях SQL. Існують автоматизовані інструменти, які можуть допомогти вам виконувати атаки ефективніше та в найкоротші терміни. Ці інструменти включають:
- SQLMap – http://sqlmap.org/
- jSQL-ін'єкція – https://www.kali.org/tools/jsql/
Як запобігти атакам SQL-ін'єкцій
Організація може прийняти наведену нижче політику, щоб захистити себе від атак SQL Injection.
- Введеним користувачем даним ніколи не слід довіряти – Його завжди потрібно «санітарно» очищувати перед використанням у динамічних SQL-інструкціях.
- Збережені процедури – вони можуть інкапсулювати SQL-запитувачі та обробляти всі вхідні дані як параметри.
- Підготовлені заяви – підготовлені оператори працюють таким чином, що спочатку створюється SQL-оператор, а потім усі надіслані дані користувача обробляються як параметри. Це не впливає на синтаксис SQL-оператора.
- Регулярні вирази – їх можна використовувати для виявлення потенційно шкідливого коду та його видалення перед виконанням SQL-запитів.
- Права доступу користувачів до бази даних – обліковим записам, що використовуються для, слід надавати лише необхідні права доступу підключитися до бази даних. Це може допомогти зменшити те, що оператори SQL можуть виконувати на сервері.
- Повідомлення про помилки – вони не повинні розкривати конфіденційну інформацію або місце, де саме сталася помилка. Замість відображення SQL-запитів, які спричинили помилку, можна використовувати прості повідомлення про помилки, такі як «Вибачте, у нас виникли технічні помилки. З технічною командою зв’язалися. Будь ласка, спробуйте ще раз пізніше».
Хакерська діяльність: використовуйте Havij для впровадження SQL
У цьому практичному сценарії ми використовуємо програму Havij Advanced SQL Injection для сканування веб-сайту на наявність вразливостей.
Примітка: Хавідж — це застарілий, недоглянутий Windows інструмент — SQLMap вище є поточним стандартом з відкритим кодом.
Примітка: ваша антивірусна програма може позначити його через його природу. Вам слід додати його до списку виключень або призупинити антивірусна програма.
На зображенні нижче показано головне вікно Havij.
Вищезазначений інструмент можна використовувати для оцінки вразливості веб-сайту або програми.








