Sql-ін'єкції просте пояснення для початківців (частина 1)
Навчання тестування на проникнення - Навчанню тестування на проникнення від BlackDiver. базовий курс
Суть SQL-ін'єкцій
Напевно, вже чули жарт з Інтернету: «Чому у всіх уроках малювання одне і теж: Наприклад, урок з малювання сови. Спочатку півгодини довго в деталях малюємо око сови. А потім - раз - за п'ять хвилин - малюємо решту сови ».
Ось навіть картинка з цього приводу є:
Мета цієї замітки - натягнути очей на сову дати нормальне просто пояснення, що ж таке SQL-ін'єкції, в чому полягає їх суть, наскільки і чому вони небезпечні.
Для дослідів, у нас буде дуже простий і вразливий до SQL-ін'єкції скрипт:
Слово SELECT в SQL-запиті показує, які дані потрібно отримати. Наприклад, можна було б вказати SELECT name, або SELECT name, password. Тоді в першому би разі з таблиці було б отримано тільки ім'я, а в другому - тільки ім'я і пароль. Зірочка каже, що потрібно отримати всі значення. Тобто SELECT * - це означає отримати всі значення.
FROM каже звідки їх потрібно отримати. Після FROM слідує ім'я таблиці, т. Е. Запис FROM members каже, отримати з таблиці members.
Далі WHERE. якщо ви вивчали будь-які мови програмування, то це слово найбільше нагадує «Якщо». А далі йдуть умови, ці умови можуть бути істинними (1) або помилковими (0). У нашому випадку
(Name = '$ name') AND (password = '$ password')
означає, що умова буде істинним, якщо передана змінна $ name буде дорівнює значенню поля name в таблиці і передана змінна '$ password буде дорівнює значенню поля password в таблиці. Якщо хоча б одне умови не виконується (невірне ім'я користувача або пароль), то з таблиці нічого не буде взято. т. е. вираз SELECT * FROM members WHERE name = '$ name' AND password = '$ password' означає: в таблиці members взяти значення всіх полів, якщо для них виконується умова - збігаються передане ім'я користувача і пароль з тими, які зустрічаються в таблиці.
Це зрозуміло. Давайте тепер, наприклад, з ім'ям користувача підставимо одиночну лапки:
Ніякі дані не отримані, замість них ми бачимо помилку:
Результат відмінний! Ми отримали список всіх записів в таблиці.
ORDER BY і UNION - головні друзі SQL-ін'єкцій
Ми вже зараз отримали дані, які були недоступні тим, у кого немає валідних імені користувача та пароля. Чи можна щось ще отримати? Так, можна отримати повний дамп цієї таблиці (нагадаю, у нас як і раніше немає паролів. Більш того, ми можемо отримати всі дані з усіх баз на цьому сервері через одну крихітну дірочку!
UNION дозволяє об'єднувати SQL-запити. У реальному житті у мене завдання прості, тому і прості запити до баз даних і можливостями UNION я не користуюся. Але ось для SQL-ін'єкцій цінніше цього слова немає.
UNION дозволяє досить гнучко об'єднувати SQL-запити з SELECT, в тому числі і від різних баз даних. Але є важлива вимога до синтаксису: кількість стовпців в першому SELECT повинна дорівнювати кількості стовпців в другому SELECT.
ORDER BY задає сортування отриманих з таблиці даних. Можна задавати сортування по імені стовпця, а можна по його номеру. Причому, якщо стовпці з таким номером немає, то буде показана помилка:
Запит виглядає так:
Робіть так поки не зникне повідомлення про помилку.
Зверніть увагу, що вміст деяких полів UNION SELECT 1,2,3,4,5 виводиться на екран. Замість цифр можна налаштувати установки.
Що писати в SELECT
Є деякі функції, які можна писати безпосередньо в UNION:
- DATABASE () - показати ім'я поточної бази даних
- CURRENT_USER () - показує ім'я користувача та ім'я хоста
- @@ datadir - виводить абсолютний шлях до бази даних
- USER () - ім'я користувача
- VERSION () - версія бази даних
У нашому прикладі виводяться поля 2, 4 і 5. Тобто ми можемо використовувати будь-який з цих полів.
Використовуємо DATABASE () в UNION SELECT
Використовуємо CURRENT_USER () в UNION SELECT
Використовуємо @@ datadir в UNION SELECT
Отримання імен таблиці, полів і дамп бази даних
У базі даних information_schema є таблиця, яка називається tables. У цій таблиці міститься список всіх таблиць, які присутні у всіх базах даних цього сервера. Ми можемо відібрати наші таблиці, шукаючи в поле table_schema назва нашої бази даних - 'db_library' (ім'я ми дізналися за допомогою DATABASE ()).
Це називається повна техніка UNION. Матеріалу по ній більш ніж достатньо в Інтернеті. На моєму ж MySQL сервері повна техніка UNION не працює. У мене з'являється помилка
something went wrong with full UNION technique (could be because of limitation on retrieved number of entries). Falling back to partial UNION technique
В наступній частині статті ми вивчимо часткову техніку UNION, з її допомогою ми отримаємо всі дані на сервері: імена баз даних, імена їх таблиць і полів в цих таблицях, а також їх вміст. Поки чекаєте появи другої частини - тренуйтеся, почитайте про SQL-ін'єкції і техніці UNION, додатково рекомендуються до ознайомлення наступні статті:
п.с. ах да, забув про LIMIT. Теж в наступний раз розповім про роль LIMIT в SQL-ін'єкції.
Genesis HS - фізичне місце, де збираються захоплені технікою, IT, електронікою, роботами і фізикою люди.
Схожі теми
Locasploit - набір python3 і bash скриптів. Locasploit - являє собою набір python3 і bash скриптів для локального перерахування і подальшого застосування експлойтів, зібраних під одне.
Airgeddon - захоплення і злом хендшейков. Вітання всім! Вирішив, для таких же як я новачків, статтю написати. Шукав, і не знайшов згадку про цю утиліту. Може пропустив по невнімате.
Виклик процедури, що на клієнті. Виклик процедури, що MySQL на клієнті У цій статті додамо можливість виклику процедури, що з нашого клієнтського додатку. Для початку.
Як просто отримати дані з DataTable. Як отримати дані з DataTable в c # В одній з попередніх статей був показаний приклад роботи з базою даних Mysql і c #. Після цього багато хто став обра.