як погані хлопці зламують сайти, використовуючи SQL-ін’єкції

SQL-ін’єкція є одним з найбільш поширених вразливостей в Інтернеті. Тут я постараюся докладно пояснити такий уразливості з прикладами помилок в PHP і можливі рішення.

Якщо ви не настільки впевнені з мовами програмування і веб-технологій, ви можете бути здивовані, що SQL зупинитися. Ну, це акронім для мови структурованих запитів (вимовляється як “продовження”). Це «де факто» стандартною мовою для доступу й керування даними в базах даних.

В даний час більшість веб-сайтів покладаються на базу даних (зазвичай MySQL) для зберігання і доступу до даних.

Наш приклад буде поширеною формою логіна. Інтернет серферів побачити ці форми входу кожен день, ви покласти ваші ім’я користувача та пароль, а потім сервер перевіряє вами облікові дані. Добре, це просто, але точно, що відбувається на сервері, коли він перевіряє ваші повноваження?

Клієнт (або користувач) відправляє на сервер два рядки, ім’я користувача і пароль.

Зазвичай сервер буде мати базу даних з таблицею, де дані користувача зберігаються. Ця таблиця має принаймні два стовпці, по одному для зберігання імені користувача та один пароль. Коли сервер отримує ім’я користувача і пароль рядків він буде запит до бази даних, щоб побачити, якщо облікові дані є дійсними. Він буде використовувати SQL заяву за те що може виглядати наступним чином:

* Виберіть з користувачів, де ім’я користувача = ‘SUPPLIED_USER’ і пароль = ‘SUPPLIED_PASS’

Для тих з вас, хто не знайомий з мовою SQL, SQL в ‘символ використовується як роздільник рядків для змінних. Тут ми використовуємо його для розділення імені користувача і пароля Рядки, що надаються користувачем.

У цьому прикладі ми бачимо, що ім’я користувача та пароль, надані вставляються в запиті між «і весь запит потім виконується Database Engine. Якщо запит повертає жодного рядка, то надані облікові дані дійсні (цей користувач існує в базі даних і має пароль, який входить в комплект).

Тепер, що станеться, якщо користувач вводить ‘символ в ім’я користувача або пароль поля? Ну, поставивши тільки “в полі імені користувача і живучи поле пароля порожнім, запит стане:

* Виберіть з користувачів, де ім’я користувача =” ‘і пароль =”

Це призведе помилку, так як ядро ​​бази даних розглядатиме кінця рядка на другий “, а потім він викличе помилку синтаксичного аналізу на третьому” характер. Давайте тепер що буде, якщо ми хотіли б надіслати це вхідні дані:

Ім’я користувача: ‘АБО’ ‘=’
Пароль: ‘або’ ‘=’

Запит стане
* Виберіть з користувачів, де ім’я користувача =” OR” = ‘A’ і пароль =” OR” =”

Так завжди дорівнює, цей запит поверне всі рядки з таблиці користувачів і сервер буде “думати”, ми забезпечили його дійсні облікові дані і нехай, як у – ін’єкції SQL успішно :).

Тепер ми збираємося, щоб побачити деякі більш просунуті методи .. Мій приклад буде заснований на PHP і MySQL платформи. У моїй базі даних MySQL Я створив таку таблицю:

CREATE TABLE користувачів (
ім’я користувача VARCHAR (128),
пароль VARCHAR (128),
E-mail VARCHAR (128))

Там в одному рядку таблиці з даними:

Ім’я користувача: TestUser
Пароль: тестування
E-mail: testuser@testing.com

Перевірити повноваження я зробив наступний запит в коді PHP:

$ Запиту = “Виберіть ім’я користувача, пароль від користувачів, де ім’я користувача = ‘” “і пароль ='” $ прохід. “. ‘” $ Користувачем. ».;

Так само сервер налаштована друк на помилки викликані MySQL (це корисно для налагодження, але слід уникати на робочому сервері).

Так, минулого разу я показав вам, як SQL-ін’єкція в основному працює. Зараз я покажу вам, як ми можемо зробити більш складні запити і як використовувати повідомлення про помилки MySQL, щоб отримати більше інформації про структуру бази даних.

Давайте почнемо! Так що, якщо ми ставимо просто ‘в полі імені користувача ми отримуємо повідомлення про помилку типу
У вас помилка в запиті, перевірити документацію по використовуваної версії MySQL на предмет коректного синтаксису використовувати поблизу”” і пароль =” ‘у рядку 1

Це тому, що запит став

виберіть ім’я користувача, пароль від користувачів, де ім’я користувача =” ‘і пароль =”
Що відбувається зараз, якщо ми спробуємо ввести в поле ім’я користувача рядок виду ‘або користувача =’ ABC?
Запит стає

виберіть ім’я користувача, пароль від користувачів, де ім’я користувача =” або користувача = ‘ABC’ і пароль =”

І це дає нам повідомлення про помилку
Невідомий колонці “Користувач” в “, де становище ‘

Це прекрасно! Використання цих повідомлень про помилки ми можемо здогадатися стовпців в таблиці. Ми можемо спробувати поставити в полі Ім’я користувача “або електронною поштою = ‘і так як ми не отримали повідомлення про помилку, ми знаємо, що лист існує колонка в цій таблиці. Якщо ми знаємо, адресу електронної пошти користувача, ми можемо тепер то спробуйте testuser@testing.com “або електронною поштою = ‘як в імені користувача та пароля і наш запит стає

виберіть ім’я користувача, пароль від користувачів, де ім’я користувача =” або електронною поштою = ‘testuser@testing.com’ і пароль =” або електронною поштою = ‘testuser@testing.com’

який є допустимим запитом і якщо ця адреса електронної пошти існує в таблиці ми успішно увійти!

Ви також можете використовувати повідомлення про помилки, щоб вгадати ім’я таблиці. Оскільки в SQL ви можете використовувати table.column позначення, ви можете спробувати поставити в полі Ім’я користувача “або user.test = ‘, і ви побачите повідомлення про помилку, як
Невідома таблиця “користувач” у пункті, де

Відмінно! Давайте спробуємо з “або users.test = ‘і у нас є
‘Users.test’ Невідома колонка в “, де становище ‘

так логічно, що є таблиця з ім’ям користувача :).

В принципі, якщо сервер налаштований видавати повідомлення про помилки, ви можете використовувати їх для перерахування структуру бази даних, а потім ви можете бути в змозі використати ці інформації в атаку.