SQL Injection
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON є найважливішою подією в сфері кібербезпеки в Іспанії та однією з найважливіших в Європі. З метою просування технічних знань, цей конгрес є гарячою точкою зустрічі для професіоналів у сфері технологій та кібербезпеки в усіх дисциплінах.
Що таке SQL-ін'єкція?
SQL-ін'єкція — це вразливість безпеки, яка дозволяє зловмисникам втручатися в запити до бази даних додатку. Ця вразливість може дозволити зловмисникам переглядати, змінювати або видаляти дані, до яких їм не слід мати доступ, включаючи інформацію інших користувачів або будь-які дані, до яких може отримати доступ додаток. Такі дії можуть призвести до постійних змін у функціональності або змісті додатку, або навіть до компрометації сервера чи відмови в обслуговуванні.
Виявлення точок входу
Коли сайт виглядає вразливим до SQL-ін'єкції (SQLi) через незвичайні відповіді сервера на запити, пов'язані з SQLi, першим кроком є розуміння того, як впроваджувати дані в запит, не порушуючи його. Це вимагає визначення методу ефективного виходу з поточного контексту. Ось кілька корисних прикладів:
Тоді вам потрібно знати, як виправити запит, щоб не було помилок. Щоб виправити запит, ви можете ввести дані, щоб попередній запит прийняв нові дані, або ви можете просто ввести свої дані та додати символ коментаря в кінці.
Зверніть увагу, що якщо ви можете бачити повідомлення про помилки або помітити відмінності, коли запит працює, а коли ні, цей етап буде легшим.
Коментарі
Підтвердження за допомогою логічних операцій
Надійний метод підтвердження вразливості до SQL-ін'єкцій полягає в виконанні логічної операції та спостереженні за очікуваними результатами. Наприклад, GET-параметр, такий як ?username=Peter
, що дає ідентичний контент при зміні на ?username=Peter' or '1'='1
, вказує на вразливість до SQL-ін'єкцій.
Аналогічно, застосування математичних операцій слугує ефективною технікою підтвердження. Наприклад, якщо доступ до ?id=1
та ?id=2-1
дає той самий результат, це вказує на SQL-ін'єкцію.
Приклади, що демонструють підтвердження логічної операції:
Цей список слів був створений, щоб спробувати підтвердити SQL-ін'єкції запропонованим способом:
Підтвердження за допомогою часу
В деяких випадках ви не помітите жодних змін на сторінці, яку ви тестуєте. Тому хороший спосіб виявити сліпі SQL-ін'єкції - це змусити БД виконувати дії, які матимуть вплив на час, необхідний для завантаження сторінки. Отже, ми будемо конкатенувати в SQL-запиті операцію, яка займе багато часу для виконання:
В деяких випадках функції затримки не будуть дозволені. Тоді, замість використання цих функцій, ви можете зробити запит виконати складні операції, які займатимуть кілька секунд. Приклади цих технік будуть прокоментовані окремо для кожної технології (якщо такі є).
Визначення бекенду
Найкращий спосіб визначити бекенд - це спробувати виконати функції різних бекендів. Ви можете використовувати sleep функції з попереднього розділу або ці (таблиця з payloadsallthethings:
Також, якщо у вас є доступ до виходу запиту, ви можете вивести версію бази даних.
У продовженні ми обговоримо різні методи експлуатації різних видів SQL Injection. Ми будемо використовувати MySQL як приклад.
Визначення з PortSwigger
Експлуатація на основі Union
Визначення кількості стовпців
Якщо ви можете бачити вихід запиту, це найкращий спосіб його експлуатувати. По-перше, нам потрібно дізнатися кількість стовпців, які початковий запит повертає. Це тому, що обидва запити повинні повертати однакову кількість стовпців. Зазвичай для цієї мети використовуються два методи:
Order/Group by
Щоб визначити кількість стовпців у запиті, поступово коригуйте число, використане в ORDER BY або GROUP BY клаузах, поки не буде отримано хибну відповідь. Незважаючи на різні функціональні можливості GROUP BY та ORDER BY в SQL, обидва можуть бути використані однаково для визначення кількості стовпців запиту.
UNION SELECT
Виберіть все більше і більше значень null, поки запит не буде правильним:
Ви повинні використовувати null
значення, оскільки в деяких випадках типи стовпців з обох сторін запиту повинні бути однаковими, і null є дійсним у кожному випадку.
Витягти назви баз даних, назви таблиць та назви стовпців
У наступних прикладах ми будемо отримувати назву всіх баз даних, назву таблиці бази даних, назви стовпців таблиці:
Існує різний спосіб виявлення цих даних у кожній різній базі даних, але методологія завжди однакова.
Використання прихованого об'єднання
Коли вихід запиту видимий, але об'єднаний ін'єкцію здається неможливим, це вказує на наявність прихованої об'єднаної ін'єкції. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на об'єднану, потрібно розпізнати запит виконання на бекенді.
Це можна здійснити за допомогою технік сліпої ін'єкції разом з таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (DBMS). Для розуміння цих таблиць за замовчуванням рекомендується звернутися до документації цільової DBMS.
Після того, як запит буде витягнуто, необхідно налаштувати ваш payload, щоб безпечно закрити оригінальний запит. Після цього до вашого payload додається об'єднаний запит, що полегшує експлуатацію ново доступної об'єднаної ін'єкції.
Для більш детальних відомостей зверніться до повної статті, доступної за посиланням Healing Blind Injections.
Використання на основі помилок
Якщо з якоїсь причини ви не можете бачити вихід запиту, але можете бачити повідомлення про помилки, ви можете використовувати ці повідомлення про помилки для екстракції даних з бази даних. Слідуючи подібному потоку, як у випадку з експлуатацією на основі об'єднання, ви можете змогти скинути базу даних.
Використання сліпого SQLi
У цьому випадку ви не можете бачити результати запиту або помилки, але ви можете відрізнити, коли запит повертає істинне або хибне значення, оскільки на сторінці є різний вміст. У цьому випадку ви можете зловживати цією поведінкою, щоб вивантажити базу даних символ за символом:
Використання помилок Blind SQLi
Це та сама ситуація, що й раніше, але замість того, щоб розрізняти істинну/хибну відповідь на запит, ви можете розрізняти наявність помилки в SQL запиті чи ні (можливо, через те, що HTTP сервер зривається). Тому в цьому випадку ви можете викликати SQL помилку щоразу, коли правильно вгадуєте символ:
Використання SQLi на основі часу
У цьому випадку немає жодного способу відрізнити відповідь запиту на основі контексту сторінки. Але ви можете змусити сторінку завантажуватися довше, якщо вгаданий символ правильний. Ми вже бачили цю техніку раніше для підтвердження вразливості SQLi.
Stacked Queries
Ви можете використовувати стековані запити для виконання кількох запитів підряд. Зверніть увагу, що хоча наступні запити виконуються, результати не повертаються в додаток. Отже, ця техніка в основному корисна у зв'язку з сліпими вразливостями, де ви можете використовувати другий запит для виклику DNS-запиту, умовної помилки або затримки часу.
Oracle не підтримує стековані запити. MySQL, Microsoft та PostgreSQL їх підтримують: QUERY-1-HERE; QUERY-2-HERE
Out of band Exploitation
Якщо жоден інший метод експлуатації не спрацював, ви можете спробувати змусити базу даних ексфільтрувати інформацію на зовнішній хост, контрольований вами. Наприклад, через DNS-запити:
Витік даних поза каналом через XXE
Автоматизоване використання
Перевірте SQLMap Cheetsheat для експлуатації вразливості SQLi за допомогою sqlmap.
Технічна специфічна інформація
Ми вже обговорили всі способи експлуатації вразливості SQL Injection. Знайдіть ще кілька трюків, залежних від технології бази даних, у цій книзі:
Або ви знайдете багато трюків щодо: MySQL, PostgreSQL, Oracle, MSSQL, SQLite та HQL у https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON є найактуальнішою подією в сфері кібербезпеки в Іспанії та однією з найважливіших в Європі. З місією просування технічних знань, цей конгрес є гарячою точкою зустрічі для професіоналів у сфері технологій та кібербезпеки в кожній дисципліні.
Обхід аутентифікації
Список для спроби обійти функціональність входу:
Login bypass ListОбхід аутентифікації за допомогою сирого хешу
Цей запит демонструє вразливість, коли MD5 використовується з true для сирого виходу в перевірках автентифікації, що робить систему вразливою до SQL-ін'єкцій. Зловмисники можуть скористатися цим, створюючи введення, які, коли їх хешують, виробляють несподівані частини SQL-команд, що призводить до несанкціонованого доступу.
Обхід аутентифікації за допомогою інжектованого хешу
Рекомендований список:
Ви повинні використовувати як ім'я користувача кожен рядок списку, а як пароль завжди: Pass1234. (Ці payloads також включені у великий список, згаданий на початку цього розділу)
GBK Аутентифікація Байпас
IF ' екранізовано, ви можете використовувати %A8%27, а коли ' буде екранізовано, буде створено: 0xA80x5c0x27 (╘')
Python скрипт:
Поліглотна ін'єкція (мультиконтекст)
Insert Statement
Modify password of existing object/user
Щоб це зробити, ви повинні спробувати створити новий об'єкт з назвою "майстер-об'єкт" (ймовірно, admin у випадку користувачів), модифікуючи щось:
Створити користувача з ім'ям: AdMIn (великі та малі літери)
Створити користувача з ім'ям: admin=
SQL Truncation Attack (коли є якийсь обмеження по довжині в імені користувача або електронній пошті) --> Створити користувача з ім'ям: admin [багато пробілів] a
SQL Truncation Attack
Якщо база даних вразлива, а максимальна кількість символів для імені користувача, наприклад, 30, і ви хочете видати себе за користувача admin, спробуйте створити ім'я користувача: "admin [30 пробілів] a" і будь-який пароль.
База даних перевірить, чи введене ім'я користувача існує в базі даних. Якщо ні, вона обрізає ім'я користувача до максимально дозволеної кількості символів (в цьому випадку до: "admin [25 пробілів]") і потім автоматично видалить всі пробіли в кінці, оновлюючи в базі даних користувача "admin" з новим паролем (може з'явитися деяка помилка, але це не означає, що це не спрацювало).
Більше інформації: 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 Insert time based checking
Додайте стільки ','',''
, скільки вважаєте за потрібне, щоб вийти з оператору VALUES. Якщо затримка виконується, у вас є SQLInjection.
ON DUPLICATE KEY UPDATE
Клаузула ON DUPLICATE KEY UPDATE
в MySQL використовується для визначення дій, які база даних повинна виконати, коли намагаються вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наступний приклад демонструє, як цю функцію можна експлуатувати для зміни пароля облікового запису адміністратора:
Example Payload Injection:
Вантаж ін'єкції може бути створений наступним чином, де намагаються вставити два рядки в таблицю 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):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON є найактуальнішою подією в сфері кібербезпеки в Іспанії та однією з найважливіших в Європі. З метою популяризації технічних знань, цей конгрес є гарячою точкою зустрічі для професіоналів у сфері технологій та кібербезпеки в усіх дисциплінах.
Routed SQL injection
Routed SQL injection - це ситуація, коли ін'єкційний запит не є тим, який дає вихід, але вихід ін'єкційного запиту йде до запиту, який дає вихід. (З документа)
Приклад:
WAF Bypass
Обхід без пробілів
No Space (%20) - обхід за допомогою альтернатив пробілів
No Whitespace - обхід за допомогою коментарів
No Whitespace - обхід за допомогою дужок
No commas bypass
No Comma - обхід за допомогою OFFSET, FROM та JOIN
Generic Bypasses
Чорний список за допомогою ключових слів - обхід за допомогою великих/малих літер
Чорний список за допомогою ключових слів без урахування регістру - обхід за допомогою еквівалентного оператора
Обхід WAF за допомогою наукової нотації
Ви можете знайти більш детальне пояснення цього трюку в блозі gosecure. В основному, ви можете використовувати наукову нотацію несподіваними способами, щоб обійти WAF:
Bypass Column Names Restriction
По-перше, зверніть увагу, що якщо оригінальний запит і таблиця, з якої ви хочете витягти прапор, мають однакову кількість стовпців, ви можете просто зробити: 0 UNION SELECT * FROM flag
Можливо отримати доступ до третього стовпця таблиці без використання його назви за допомогою запиту, подібного до наступного: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, тому в sqlinjection це виглядатиме так:
Або використовуючи comma bypass:
Цей трюк був взятий з https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/
Інструменти для обходу WAF
Інші посібники
Список виявлення брутфорсу
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON є найважливішою подією в сфері кібербезпеки в Іспанії та однією з найважливіших в Європі. З метою просування технічних знань, цей конгрес є гарячою точкою зустрічі для професіоналів у сфері технологій та кібербезпеки в кожній дисципліні.
Вчіться та практикуйте Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated