Sql-ін'єкції просте пояснення для початківців (частина 1)

Навчання тестування на проникнення - Навчанню тестування на проникнення від BlackDiver. базовий курс

Суть SQL-ін'єкцій

Напевно, вже чули жарт з Інтернету: «Чому у всіх уроках малювання одне і теж: Наприклад, урок з малювання сови. Спочатку півгодини довго в деталях малюємо око сови. А потім - раз - за п'ять хвилин - малюємо решту сови ».

Ось навіть картинка з цього приводу є:

Sql-ін'єкції просте пояснення для початківців (частина 1)

Мета цієї замітки - натягнути очей на сову дати нормальне просто пояснення, що ж таке 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 взяти значення всіх полів, якщо для них виконується умова - збігаються передане ім'я користувача і пароль з тими, які зустрічаються в таблиці.

Це зрозуміло. Давайте тепер, наприклад, з ім'ям користувача підставимо одиночну лапки:

Sql-ін'єкції просте пояснення для початківців (частина 1)

Ніякі дані не отримані, замість них ми бачимо помилку:

Sql-ін'єкції просте пояснення для початківців (частина 1)

Результат відмінний! Ми отримали список всіх записів в таблиці.

ORDER BY і UNION - головні друзі SQL-ін'єкцій

Ми вже зараз отримали дані, які були недоступні тим, у кого немає валідних імені користувача та пароля. Чи можна щось ще отримати? Так, можна отримати повний дамп цієї таблиці (нагадаю, у нас як і раніше немає паролів. Більш того, ми можемо отримати всі дані з усіх баз на цьому сервері через одну крихітну дірочку!

UNION дозволяє об'єднувати SQL-запити. У реальному житті у мене завдання прості, тому і прості запити до баз даних і можливостями UNION я не користуюся. Але ось для SQL-ін'єкцій цінніше цього слова немає.

UNION дозволяє досить гнучко об'єднувати SQL-запити з SELECT, в тому числі і від різних баз даних. Але є важлива вимога до синтаксису: кількість стовпців в першому SELECT повинна дорівнювати кількості стовпців в другому SELECT.

ORDER BY задає сортування отриманих з таблиці даних. Можна задавати сортування по імені стовпця, а можна по його номеру. Причому, якщо стовпці з таким номером немає, то буде показана помилка:

Запит виглядає так:

Sql-ін'єкції просте пояснення для початківців (частина 1)

Робіть так поки не зникне повідомлення про помилку.

Зверніть увагу, що вміст деяких полів UNION SELECT 1,2,3,4,5 виводиться на екран. Замість цифр можна налаштувати установки.

Що писати в SELECT

Є деякі функції, які можна писати безпосередньо в UNION:

  • DATABASE () - показати ім'я поточної бази даних
  • CURRENT_USER () - показує ім'я користувача та ім'я хоста
  • @@ datadir - виводить абсолютний шлях до бази даних
  • USER () - ім'я користувача
  • VERSION () - версія бази даних

У нашому прикладі виводяться поля 2, 4 і 5. Тобто ми можемо використовувати будь-який з цих полів.

Використовуємо DATABASE () в UNION SELECT

Sql-ін'єкції просте пояснення для початківців (частина 1)

Використовуємо CURRENT_USER () в UNION SELECT

Sql-ін'єкції просте пояснення для початківців (частина 1)

Використовуємо @@ datadir в UNION SELECT

Sql-ін'єкції просте пояснення для початківців (частина 1)

Отримання імен таблиці, полів і дамп бази даних

У базі даних 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, додатково рекомендуються до ознайомлення наступні статті:

Sql-ін'єкції просте пояснення для початківців (частина 1)

п.с. ах да, забув про LIMIT. Теж в наступний раз розповім про роль LIMIT в SQL-ін'єкції.

Genesis HS - фізичне місце, де збираються захоплені технікою, IT, електронікою, роботами і фізикою люди.

Схожі теми

Locasploit - набір python3 і bash скриптів. Locasploit - являє собою набір python3 і bash скриптів для локального перерахування і подальшого застосування експлойтів, зібраних під одне.

Airgeddon - захоплення і злом хендшейков. Вітання всім! Вирішив, для таких же як я новачків, статтю написати. Шукав, і не знайшов згадку про цю утиліту. Може пропустив по невнімате.

Виклик процедури, що на клієнті. Виклик процедури, що MySQL на клієнті У цій статті додамо можливість виклику процедури, що з нашого клієнтського додатку. Для початку.

Як просто отримати дані з DataTable. Як отримати дані з DataTable в c # В одній з попередніх статей був показаний приклад роботи з базою даних Mysql і c #. Після цього багато хто став обра.

Схожі статті