SQL Injection
RootedCON є найбільш важливою подією з кібербезпеки в Іспанії та однією з найважливіших в Європі. З метою просування технічних знань, цей конгрес є важливою точкою зустрічі для професіоналів у галузі технологій та кібербезпеки у будь-якій дисципліні.
Що таке SQL ін'єкція?
SQL ін'єкція - це ураза безпеки, яка дозволяє зловмисникам втручатися в запити до бази даних додатка. Ця вразливість може дозволити зловмисникам переглядати, змінювати або видаляти дані, до яких вони не повинні мати доступ, включаючи інформацію інших користувачів або будь-які дані, до яких може отримати доступ додаток. Такі дії можуть призвести до постійних змін у функціональності або вмісті додатка або навіть до компрометації сервера або відмови в обслуговуванні.
Виявлення точки входу
Коли сайт здається вразливим на SQL ін'єкцію (SQLi) через незвичайні відповіді сервера на введення, пов'язані з SQLi, першим кроком є розуміння того, як впровадити дані в запит без його порушення. Це вимагає ідентифікації методу виходу з поточного контексту ефективно. Ось деякі корисні приклади:
Потім вам потрібно знати, як виправити запит, щоб не було помилок. Щоб виправити запит, ви можете ввести дані, щоб попередній запит прийняв нові дані, або просто ввести свої дані та додати символ коментаря в кінці.
Зверніть увагу, що якщо ви можете бачити повідомлення про помилку або ви можете помітити різницю, коли запит працює і коли ні, ця фаза буде простішою.
Коментарі
Підтвердження за допомогою логічних операцій
Надійний метод підтвердження вразливості SQL-ін'єкції включає виконання логічної операції та спостереження за очікуваними результатами. Наприклад, параметр GET, такий як ?username=Peter
, який повертає ідентичний вміст при зміні на ?username=Peter' або '1'='1
, свідчить про наявність вразливості SQL-ін'єкції.
Так само, застосування математичних операцій слугує ефективним методом підтвердження. Наприклад, якщо доступ до ?id=1
та ?id=2-1
видає однаковий результат, це свідчить про наявність SQL-ін'єкції.
Приклади, що демонструють підтвердження за допомогою логічних операцій:
Цей словник був створений для спроби підтвердити SQL-ін'єкції запропонованим способом:
Підтвердження за допомогою часу
У деяких випадках ви не помітите жодних змін на сторінці, яку ви тестуєте. Тому хорошим способом виявлення сліпих SQL-ін'єкцій є змушення БД виконувати дії, які впливають на час завантаження сторінки. Отже, ми будемо конкатенувати в SQL-запит операцію, яка займе багато часу для завершення:
У деяких випадках функції затримки можуть бути заборонені. Тоді, замість використання цих функцій, ви можете зробити запит, що виконує складні операції, які займуть кілька секунд. Приклади цих технік будуть окремо прокоментовані для кожної технології (якщо є такі).
Визначення Back-end
Найкращий спосіб визначити back-end - спробувати виконати функції різних back-end. Ви можете використовувати функції затримки з попереднього розділу або ці (таблиця з payloadsallthethings:
Також, якщо у вас є доступ до результатів запиту, ви можете зробити його вивести версію бази даних.
Продовженням буде обговорення різних методів використання різних видів SQL Injection. Ми будемо використовувати MySQL як приклад.
Ідентифікація з PortSwigger
Використання Union Based
Виявлення кількості стовпців
Якщо ви можете побачити результат запиту, це найкращий спосіб використання. По-перше, нам потрібно з'ясувати кількість стовпців, яку початковий запит повертає. Це тому, що обидва запити повинні повертати однакову кількість стовпців. Для цього зазвичай використовуються два методи:
Order/Group by
Щоб визначити кількість стовпців у запиті, поступово збільшуйте число, використовуване в клозі ORDER BY або GROUP BY, поки не отримаєте неправильну відповідь. Незважаючи на відмінні функціональні можливості GROUP BY та ORDER BY в межах SQL, обидва можуть бути використані однаково для визначення кількості стовпців у запиті.
UNION SELECT
Виберіть більше та більше нульових значень, поки запит не буде вірним:
Ви повинні використовувати значення null
, оскільки в деяких випадках типи стовпців з обох сторін запиту повинні бути однаковими, і null
є допустимим у кожному випадку.
Видобуток назв баз даних, назв таблиць та назв стовпців
На наступних прикладах ми збираємося отримати назву всіх баз даних, назву таблиці бази даних, назви стовпців таблиці:
Існує різний спосіб виявлення цих даних в кожній різній базі даних, але методика завжди однакова.
Використання Прихованої Ін'єкції на Основі Об'єднання
Коли вивід запиту видимий, але ін'єкція на основі об'єднання здається недосяжною, це свідчить про наявність прихованої ін'єкції на основі об'єднання. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на ін'єкцію на основі об'єднання, потрібно розрозуміти виконавчий запит на бекенді.
Це можна зробити за допомогою технік сліпої ін'єкції разом із таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (СУБД). Для розуміння цих таблиць за замовчуванням рекомендується консультувати документацію цільової СУБД.
Після того, як запит було видобуто, необхідно налаштувати ваше навантаження так, щоб безпечно закрити початковий запит. Подальше, до вашого навантаження додається об'єднаний запит, що сприяє використанню нової доступної ін'єкції на основі об'єднання.
Для отримання більш детальної інформації дивіться повну статтю, доступну за посиланням Healing Blind Injections.
Використання Помилкової Ін'єкції
Якщо з якоїсь причини ви не можете побачити вивід запиту, але ви можете побачити повідомлення про помилку, ви можете використовувати ці повідомлення про помилку для ексфільтрації даних з бази даних. Слідуючи аналогічному потоку, як у використанні на основі об'єднання, ви можете вдало витягти БД.
Використання сліпого SQLi
У цьому випадку ви не можете бачити результати запиту або помилки, але ви можете відрізнити, коли запит повертає відповідь true або false, оскільки на сторінці є різні вміст. У цьому випадку ви можете зловживати цією поведінкою, щоб витягти дані з бази даних посимвольно:
Використання Error Blind SQLi
Це той самий випадок, що й раніше, але замість розрізнення між правильною/неправильною відповіддю від запиту ви можете розрізнити між помилкою в SQL-запиті або ні (можливо, через збій HTTP-сервера). Тому в цьому випадку ви можете викликати помилку SQL кожного разу, коли правильно вгадуєте символ:
Використання Time Based SQLi
У цьому випадку немає способу відрізнити відповідь запиту на основі контексту сторінки. Проте, ви можете зробити сторінку завантажуватися довше, якщо вгаданий символ є правильним. Ми вже бачили цю техніку у дії раніше для підтвердження наявності SQLi уразливості.
Стекові запити
Ви можете використовувати стекові запити для виконання кількох запитів поспіль. Зверніть увагу, що під час виконання наступних запитів результати не повертаються до додатку. Тому ця техніка в основному корисна відносно сліпих вразливостей, де ви можете використовувати другий запит для спровокування DNS-запиту, умовної помилки або затримки часу.
Oracle не підтримує стекові запити. MySQL, Microsoft та PostgreSQL підтримують їх: ЗАПИТ-1-ТУТ; ЗАПИТ-2-ТУТ
Експлуатація поза межами зв'язку
Якщо жоден інший метод експлуатації не працює, ви можете спробувати зробити так, щоб база даних витікала інформацію на зовнішній хост, котрим ви керуєте. Наприклад, через DNS-запити:
Виведення даних поза межі за допомогою XXE
Автоматизована експлуатація
Перевірте SQLMap Cheetsheat, щоб експлуатувати уразливість SQLi за допомогою sqlmap.
Інформація щодо конкретної технології
Ми вже обговорили всі способи експлуатації уразливості SQL Injection. Знайдіть деякі додаткові хитрощі, залежні від технології бази даних у цій книзі:
Або ви знайдете багато хитрощів щодо: MySQL, PostgreSQL, Oracle, MSSQL, SQLite та HQL в https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
RootedCON - найбільш важлива подія з кібербезпеки в Іспанії та одна з найважливіших в Європі. З місією просування технічних знань, цей конгрес є кипучою точкою зустрічі для професіоналів технологій та кібербезпеки у кожній дисципліні.
Обхід аутентифікації
Список спроб обійти функціональність входу:
pageLogin bypass ListОбхід аутентифікації за допомогою сировинного хешу
Цей запит демонструє вразливість при використанні MD5 з параметром true для обробки вхідних даних у перевірці автентифікації, що робить систему вразливою до SQL ін'єкцій. Зловмисники можуть використовувати це, створюючи вхідні дані, які, після хешування, виробляють неочікувані частини SQL команд, що призводить до несанкціонованого доступу.
Обхід аутентифікації за допомогою внесеного хешу
Рекомендований список:
Ви повинні використовувати кожен рядок списку як ім'я користувача і завжди як пароль: Pass1234. (Ці навантаження також включені в великий список, згаданий в початку цього розділу)
GBK Аутентифікація Bypass
ЯКЩО ' екранується, ви можете використовувати %A8%27, і коли ' екранується, буде створено: 0xA80x5c0x27 (╘')
Скрипт Python:
Поліглотний ін'єкцій (багатоконтекстний)
Оператор вставки
Зміна пароля існуючого об'єкту/користувача
Для цього вам слід спробувати створити новий об'єкт з іменем "головного об'єкту" (імовірно адміністратор у випадку користувачів), змінивши щось:
Створіть користувача з іменем: AdMIn (з великими та малими літерами)
Створіть користувача з іменем: admin=
Атака на обрізання SQL (коли є певний обмеження довжини для імені користувача або електронної пошти) --> Створіть користувача з іменем: admin [багато пробілів] a
Атака на обрізання SQL
Якщо база даних вразлива і максимальна кількість символів для імені користувача, наприклад, 30, і ви хочете видаїть себе за користувача адміністратор, спробуйте створити ім'я користувача "admin [30 пробілів] a" та будь-який пароль.
База даних перевірить, чи введене ім'я користувача існує в базі даних. Якщо ні, вона обріже ім'я користувача до максимально допустимої кількості символів (у цьому випадку до: "admin [25 пробілів]"), а потім автоматично видалить всі пробіли в кінці, оновивши в базі даних користувача "адмін" з новим паролем (може з'явитися деяка помилка, але це не означає, що це не працює).
Додаткова інформація: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
Примітка: Ця атака більше не працюватиме, як описано вище в останніх встановленнях MySQL. Хоча порівняння все ще ігнорують пробіли в кінці за замовчуванням, спроба вставити рядок, який довший за довжину поля, призведе до помилки, і вставка буде невдалою. Для отримання додаткової інформації про це перевірте: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
Перевірка часу вставки MySQL
Додайте стільки ','',''
, скільки вважаєте за потрібне, щоб вийти з оператора VALUES. Якщо затримка виконується, у вас є SQLInjection.
НА ОНОВЛЕННЯ ПОВТОРНОГО КЛЮЧА
Клауза ON DUPLICATE KEY UPDATE
в MySQL використовується для вказівки дій, які база даних повинна виконати, коли спробує вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наведений нижче приклад демонструє, як цю функцію можна використовувати для зміни пароля облікового запису адміністратора:
Приклад Внедення Підказки:
Підказка для внедення може бути створена наступним чином, де спробується вставити два рядки в таблицю users
. Перший рядок - це підстава, а другий рядок націлено на існуючий електронний лист адміністратора з метою оновлення пароля:
Ось як це працює:
Запит намагається вставити два рядки: один для
generic_user@example.com
і інший дляadmin_generic@example.com
.Якщо рядок для
admin_generic@example.com
вже існує, спрацьовує умоваON DUPLICATE KEY UPDATE
, яка вказує MySQL оновити полеpassword
існуючого рядка на "bcrypt_hash_of_newpassword".В результаті аутентифікацію можна спробувати виконати, використовуючи
admin_generic@example.com
з паролем, що відповідає хешу bcrypt ("bcrypt_hash_of_newpassword" представляє хеш bcrypt нового пароля, який слід замінити на фактичний хеш бажаного пароля).
Витягнення інформації
Створення 2 облікових записів одночасно
При спробі створити нового користувача та ім'я користувача, потрібні пароль та електронна пошта:
Використання десяткового або шістнадцяткового формату
За допомогою цієї техніки ви можете витягнути інформацію, створивши лише 1 обліковий запис. Важливо зауважити, що вам не потрібно коментувати нічого.
Використання hex2dec та substr:
Щоб отримати текст, ви можете використовувати:
Використовуючи hex та replace (і substr):
RootedCON - це найбільш важлива подія з кібербезпеки в Іспанії та одна з найважливіших в Європі. З місією просування технічних знань, цей конгрес є важливою зустріччю для професіоналів у галузі технологій та кібербезпеки у будь-якій дисципліні.
Routed SQL injection
Routed SQL injection - це ситуація, коли запит, який можна впровадити, не є тим, що надає вихідні дані, але вихідні дані запиту, який можна впровадити, йдуть до запиту, який надає вихідні дані. (З паперу)
Приклад:
Обхід WAF
Обхід без пробілів
Без пробілів (%20) - обхід за допомогою альтернатив пропускання пробілів
No Whitespace - обхід за допомогою коментарів
Якщо ви знаєте, що в SQL-запиті не можна використовувати пробіли, ви можете використовувати коментарі для обходу цього обмеження. Наприклад, замість пробілів ви можете використовувати коментарі типу /* */
або --
. Наприклад:
Цей запит буде виконуватися правильно, оскільки всі пробіли замінені коментарями.
Без пропусків - обхід за допомогою дужок
Якщо ви знаєте, що вразливий параметр знаходиться всередині дужок, ви можете використовувати цей метод для обходу фільтрації пробілів. Використовуйте дужки для обгортання вашого SQL-коду, щоб уникнути блокування через пробіли.
Без ком
Без ком - обхід за допомогою OFFSET, FROM та JOIN
Загальні обхідні методи
Чорний список за ключовими словами - обхід за допомогою верхнього/нижнього регістру
Чорний список за допомогою ключових слів без урахування регістру - обхід за допомогою еквівалентного оператора
Наукова нотація WAF обхід
Ви можете знайти більш детальне пояснення цього трюку в блозі gosecure. По суті, ви можете використовувати наукову нотацію у неочікуваних способах для обходу WAF:
Обхід обмежень назв стовпців
По-перше, зверніть увагу, що якщо початковий запит та таблиця, з якої ви хочете витягнути прапорець, мають однакову кількість стовпців, ви можете просто виконати: 0 UNION SELECT * FROM flag
Можливо отримати доступ до третього стовпця таблиці без використання його назви за допомогою запиту на кшталт наступного: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, отже, у вразливості sqlinjection це буде виглядати наступним чином:
Або використовуючи обхід коми:
Цей трюк був взятий з https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/
Інструменти для обхіду WAF
Інші посібники
Список виявлення перебору
RootedCON є найбільш важливою подією з кібербезпеки в Іспанії та однією з найважливіших в Європі. З місією просування технічних знань, цей конгрес є кипучою точкою зустрічі для професіоналів технологій та кібербезпеки у будь-якій галузі.
Last updated