SQL ін’єкції
Продажний вершник
Нам потрібно розібратися, що є сайт, як він працює загалом. Сайт – програма, в 90% випадків написана мовою програмування PHP. Для того, щоб веб-майстрам було зручніше керувати сайтом, спочатку двохтисячних почали використовувати бази даних (далі БД), де зберігається вся інформація про зареєстрованих користувача, про їх паролі, природно, не у відкритому вигляді, але про це нижче.
Що таке ін'єкції SQL?
Все дуже просто. SQL - це мова спілкування з БД, а слово Injection перекладається як "впровадження". Інакше висловлюючись, з допомогою SQL Injection можна впровадити довільний SQL-код, який сервер обробить і відповідь.
Як усе працює: приклади
БД складається з таблиць, кожна таблиця має рядки і стовпці, як у Еxel. Для наочності розглянемо зразкову структуру БД на всьому знайомому сайті VK.com Кожен користувач "ВКонтакте", природно, має ряд персональних параметрів: Ім'я, Прізвище, e-mail, дата реєстрації та інше. У результаті кожен стовпець відповідає за власний параметр. Приклад:ID First_name Last_name password email . 1 Pavel Durov 202cb962ac59075b964b07152d234b70 . 2 Vova Pupkin 827ccb0eea8a706c4c34a16891f84e7b .
Швидше за все, ви вирішите, що у Паші Дурова та Вови Пупкіна дуже складний пароль (аж аж 32 символи!), але, насправді, ви помиляєтеся. Що ж є 202cb962ac59075b964b07152d234b70? Це так зване хеш-значення, результат перетворення хеш-функції. Простою мовою – зашифрований пароль (хоч це не зовсім так). Для чого це потрібно? Для того, щоб хакер при зломі сайту не зміг легко отримати паролі користувачів. Але на це є свої методи. Якщо пароль зашифрований - це ще негарантія безпеки. Давайте уявимо, що ви (програма) вийшли в магазин (БД) і просите продавця (SQL запит): "Дайте, будь ласка, одну пачку Мальборо за 100 рублів"; Ось так це буде виглядати на мові SQL:SELECTім'я-товаруFROMуніверсамWHERE(тип='мальборо' AND ціна=' 100') LIMIT 1 SQL-сервер видасть відповідь на ваше запитання, а робити ви з ним можете все, що завгодно. Можете якось модифікувати цю інформацію, порахувати чи банально вивести на екран браузера. Тепер повернемося до SQL Injection, як ми вже знаємо, це впровадження довільного коду SQL-запит. Тобто вразливість існує тоді, коли зловмисник може впровадити свій код, що виконується. Продовжимо. Ось ви прочитали Аллена Карра і кинули палити. Тепер ви ходите до магазину за виключно корисними товарами На цей раз, ви підете. ну, скажімо, за молоком. Щоб не забути, ви записали на папірці: "Один пакет молока за 50 рублів", але у вас є друг (хакер), який палить. Він зробив SQL-атаку і тепер напис говорить: "Один пакет молока за 50 рублів. $АБО одну пачку Мальборо за 100 рублів$" Ви приходьте в магазин і читаєте папірець: "Дайте, будь ласка, один пакет молока за 50 рублів або пачку Мальборо за 100"SELECTім'я-товаруFROMуніверсамWHERE(тип='молоко' AND ціна='50') OR ( тип='мальборо' AND ціна='100') LIMIT 1 Продавець подумав, що йому нема чого йти до холодильника з молоком, коли сигарети лежать поряд, і віддав їх. Тепер ви йдете з магазину, а ваш друг тільки на це і чекає, коли ви принесете йому сигарети. Ось і приклад SQL атак. На сайтах це виглядає інакше, звичайно. Сайт запитує з БД одну інформацію, а за допомогою SQL-ін'єкції можна отримати, наприклад, логіни та паролі.
Як відбувається злом?
Щобчітко розуміти, що саме потрібно робити, програма бере SQL-запит у лапки. Наведу справжній приклад. Припустимо, ми хочемо з'ясувати, скільки років нашому другові, знаючи його ім'я та відправляючи в змінну $_GET['name'] Виконуємо запит: $result = mysql_query("SELECTageFROMmyfriendsWHEREname=$_GET['name']" ;
Наприклад, ми хочемо дізнатися скільки років Насті це хоч і непристойно, але БД все нам розповість У програмі виявиться код: mysql_query("SELECTageFROMmyfriendsWHEREname='Настя'" Розглянемо трохи детальніше ось цей шматочок.у нас є 2 пари лапок. Перша пара позначає сам запит цілком. "SELECTageFROMmyfriendsWHEREname='Настя'" Друга пара означає ім'я.
Так от, а що якщо зловмисник напише не Настя, а Настя, з лапкою наприкінці? Він порушить синтаксис функції mysql_quevery. І SQL-сервер видасть закономірну відповідь - помилку (бо не зможе обробити ' , яка не є функцією).
Ви маєте error в вашій SQL syntax; check the manual that corresponds to your MySQL server version for right syntax to use near Настя'
Приклад злому сайту

Ми з вами дійшли висновку, що маючи більш-менш значущий проект, не можна допускати вразливості. Інакше в невідповідний момент це може призвести до тяжких наслідків. Добре, з цим розібралися, а що робити? Для професійного аудиту варто звернутися до профільних компаній, але перевірити елементарні SQL-вразливості тепер ви можете самостійно. Найчастіше хакери перевіряють вразливості автоматично, і, закривши базові вразливості, ви зможете врятувати свій сайт від хакера.
Що робити, якщо мій сайтзламали?
Зламавши сайт та використовуючи інформацію у своїх цілях, хакери залишають backdoors (приховані точки входу хакера). Це можуть бути файли з будь-яким розширенням навіть jpg, але в них буде закодований php-код для проникнення в систему. В наш час існує безліч php-антивірусів, програм, які сканують вашу файлову систему сайту щодо підозрілих файлів. Можу порадити безкоштовне ПЗ AI-Bolit.
Для перевірки сайту на наявність шкідливого програмного забезпечення потрібно завантажити скрипт-антивірус на ваш хостинг і запустити його, решту він зробить за вас. Після чищення бекдорів необхідно закрити пролом, через який хакер до вас потрапив. Оновіть движок, плагіни, змініть паролі, можете звернутися до хостера, щоб він видав лог-файл, за яким можна зрозуміти через що саме було отримано доступ. Після закриття каналу проникнення та видалення бекдорів, все має бути добре, але кожен випадок індивідуальний і потребує персонального підходу.
Як захистити свій сайт від злому: базова перевірка на вразливості SQL типу
Для початку нам потрібно знайти посилання такого типу….. /index.php? > Тобто. будь-яка URL, яка містить вхідні параметри. Тут змінна $_GET['ID'] містить значення 140, яке можливо передається серверу БД. Тобто. для базової перевірки вам потрібно буде спробувати вставити лапку і подивитися, що видасть ваш сайт у відповідь.
Захист від SQL ін'єкцій
Найголовніше – фільтрація вхідних даних, наприклад, у параметрах пошуку, при виборі номера сторінки та інше. Виділимо основні пункти захисту вашого веб-сайту.
- Максимально можлива фільтрація даних: зловмисник не повинен мати права вставити свою лапку, затерти вашу.
- Використовувати при порівнянні лапки SELECT. WHERE name='$name'.
- Якщо ви користуєтеся SQL-функцією LIKE, обов'язково фільтруйте символи "%" та "_".
- Якщо вам потрібен дуже серйозний захист, можете створити білий список викликів*, і сайт буде відповідати тільки на них.