Сучасні
інформаційні технології/4. Інформаційна безпека
Мелешко О. О., доц.; Коваль Д. Р., студент
Національний авіаційний університет, Київ
SQL-ІН’ЄКЦІЇ
ТА ЗАХИСТ ВІД НИХ
Більшість атак на БД проводиться впровадженням шкідливого коду в запити
SQL, так звані SQL-ін'єкції. SQL-ін'єкція - це атака, при якій зловмисником
проводиться вставка шкідливого коду в рядки, що передаються на сервер БД для
виконання. Успішна реалізація даної атаки дозволяє обійти систему безпеки
додатків сервера БД і отримати доступ до конфіденційної інформації, яка
міститься в БД, а також до функціональних можливостей СУБД і в деяких випадках
- доступ до операційної системи сервера, на якому функціонує СУБД.
Принцип атаки - впровадження шкідливого коду в запити SQL в веб-додатках
ґрунтується на використанні веб-інтерфейсу. SQL-ін'єкції - метод злому, який
використовує введення SQL запитів / команд через веб-сторінки. Багата кількість
веб-сторінок використовуються для введення параметрів, призначених для SQL
запитів до баз даних, веб-користувачами. Це можуть бути сторінки подібно ASP,
JSP, CGI, або PHP Web, які використовують параметри. Зазвичай для цього методу
використовуються сторінки, які запитують у користувача дані (наприклад сторінка
пошуку, обговорень, тощо.)
Існує певна класифікація SQL-ін'єкцій. Вони діляться на:
- Впровадження в строкові параметри, які використовуються в SQL-командах,
коду, який змінює умови вибірки і дає зловмиснику несанкціонований доступ до
даних;
- Використання оператора UNION в параметрі для об'єднання і виконання
легального запиту з нелегальним запитом;
- Використання об'єднання рядків;
- Екранування «хвоста» запиту, який огороджує вибірку даних, шляхом
перетворення його в коментар;
- Розщеплення SQL-запиту за допомогою символу ";", що дає
можливість виконати кілька несанкціонованих команд в одному санкціонованому
запиті.
Організований захист від SQL-ін'єкцій повинен позбавити зловмисника
можливості виконувати зазначені вище дії. Для цього використовуються такі
методи:
Фільтрація строкових
параметрів: Для захисту від
даного типу атак необхідно ретельно фільтрувати вхідні параметри, значення яких
будуть використані для побудови SQL-запиту. Щоб впровадження коду було
неможливо, як приклад для СУБД MS SQL Server, потрібно брати в лапки всі
строкові параметри. Після отримання параметрів перед їх використанням необхідно
виконати їх перетворення. У самому параметрі замінюють лапки на «\ "»,
апостроф на «\ '», зворотну косу риску на «\\», кожну одиночну лапки на пару
одиночних лапок (це називається «екранувати спец. символи»), таким чином,
гарантуючи, що вони не будуть сплутані з роздільниками в SQL-операторі.
Заміна апострофів запобігає передчасному закриттю рядка зловмисником. Однак
при побудові динамічного оператора SQL, який включає числові значення, для
атаки впровадженням SQL знадобиться лише одиночний пробіл. Ця вразливість часто
(і небезпечно) ігнорується.
Усічення вхідних параметрів: Для внесення змін до логіки виконання SQL-запиту
потрібне впровадження досить довгих рядків. Якщо максимальна довжина коректного
значення параметра незначна, то одним з методів захисту може бути максимальне
усічення довжини вхідних параметрів, тобто використовувати обмеження на довжину
введеного параметра.
Це зменшить ймовірність того, що зловмисник зможе вставити небажаний великий
фрагмент сценарію в поле вводу.
Використання збережених
процедур: Процедура - набір SQL-інструкцій, які компілюються один
раз і зберігаються на сервері. У збережених процедур можуть бути вхідні і
вихідні параметри і локальні змінні, в них можуть проводитися числові
обчислення і операції над символьними даними, результати яких можуть
присвоюватися змінним і параметрам. Збережені процедури легко супроводжувати.
Наприклад, можна оптимізувати команди в збереженій процедурі без перекомпіляції.
Також вони стандартизують логіку доступу до даних в базі даних, полегшуючи її
багаторазове використання узгодженим чином різними додатками.
Вони дозволяють реалізувати більш безпечне поводження з базою даних.
наприклад, можна використовувати певні процедури, що зберігаються, але обмежити
доступ до лежачих в їх основі таблиць.
При використанні збережених процедур по мережі передаються тільки
параметри, а вся логіка використання цих параметрів недоступна зловмисникові,
що ускладнює йому підбір нелегальних параметрів.
Створення менш привілейованого
користувача БД: У більшості випадків відвідувачам веб-сайтів не потрібно
видаляти або оновлювати інформацію. Зазвичай користувачеві потрібно зробити
запит (SELECT) або залишити замовлення (INSERT).
Таким чином, краще створити кілька різних користувачів, обмежити права
облікового запису, від імені якого виконується доступ до бази даних, щоб він не
мав прав доступу до інших баз даних або запуску збережених системних процедур.
Тим не менш, це не вирішує проблему впровадження SQL-ін’єкцій, оскільки
процес, який використовується для підключення до бази даних, майже завжди
вимагає більш широких привілеїв, ніж ті, що виділяються окремому користувачеві.
Обмежуючи обліковий запис, можна запобігти атакам, пов'язаним, наприклад, з
видаленням таблиць, але не можна запобігти атакам, пов'язані з розкраданням
інформації.
Контроль повідомлень про
помилки: Коли додаток відображає повідомлення про помилки, вони не
повинні містити інформацію, яка могла б допомогти зловмисникам атакувати
систему. наприклад, якщо спроба додатку увійти в базу даних закінчилася
невдачею, він не повинен відображати повідомлення про помилку, що включає ім'я
користувача.
Існує кілька способів контролю над повідомленнями про помилки, включаючи
наступні.
Налаштувати додаток таким чином, щоб він не виводив докладних відомостей
про помилки для віддалених користувачів.
Включити обробку помилок і створити власні повідомлення про помилку. В
обробнику помилок можна перевірити, чи є користувач легальним, і діяти
відповідним чином.
Створити глобальний обробник помилок на рівні сторінки або програми, який
перехоплює всі необроблені виключення і передає їх на універсальну сторінку
помилок. Таким чином, навіть якщо дана проблема не була передбачена, користувачі
не будуть бачити сторінку винятків.
Додаткові заходи щодо
запобігання SQL атак: Ніколи не варто зберігати паролі в базі даних у
відкритому вигляді, обов'язково слід шифрувати їх (наприклад, функцією md5,
тощо). За допомогою SQL-ін'єкції можна отримати дані про паролі з бази даних, а
якщо вони будуть зашифровані, то ймовірність того, що зловмисник зможе ними
скористатися, набагато зменшується.
Для забезпечення конфіденційності логіна і пароля для доступу до бази
даних, функції підключення до бази даних краще зберігати в окремому файлі і
підключати його на кожній сторінці сайту.
Навіть якщо закриті всі відомі уразливості, рекомендується відключення
невикористовуваних функціональних можливостей SQL сервера.