MS Access SQL Injection
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Онлайн майданчик
Обмеження БД
Конкатенація рядків
Конкатенація рядків можлива з використанням символів & (%26)
та + (%2b)
.
Коментарі
У MS Access немає коментарів, але, очевидно, можливо видалити останній символ запиту за допомогою NULL символу:
Якщо це не працює, ви завжди можете виправити синтаксис запиту:
Stacked Queries
Вони не підтримуються.
LIMIT
Оператор LIMIT
не реалізований. Однак, можливо обмежити результати запиту SELECT до перших N рядків таблиці, використовуючи оператор TOP
. TOP
приймає як аргумент ціле число, що представляє кількість рядків, які потрібно повернути.
Так само, як і TOP, ви можете використовувати LAST
, який отримає рядки з кінця.
UNION Запити/Підзапити
У SQLi ви зазвичай хочете якимось чином виконати новий запит, щоб витягти інформацію з інших таблиць. MS Access завжди вимагає, щоб у підзапитах або додаткових запитах було вказано FROM
.
Отже, якщо ви хочете виконати UNION SELECT
або UNION ALL SELECT
, або SELECT
в дужках у умові, вам завжди необхідно вказати FROM
з дійсною назвою таблиці.
Тому вам потрібно знати дійсну назву таблиці.
Chaining equals + Substring
Це дозволить вам ексфільтрувати значення поточної таблиці, не знаючи назви таблиці.
MS Access дозволяє незвичний синтаксис такий як '1'=2='3'='asd'=false
. Як зазвичай, SQL-ін'єкція буде всередині WHERE
клаузи, і ми можемо це зловживати.
Уявіть, що у вас є SQLi в базі даних MS Access, і ви знаєте (або здогадалися), що одна назва стовпця - username, і це поле, яке ви хочете ексфільтрувати. Ви могли б перевірити різні відповіді веб-додатку, коли використовується техніка зчеплення рівних, і потенційно ексфільтрувати вміст за допомогою булевої ін'єкції, використовуючи функцію Mid
для отримання підрядків.
Якщо ви знаєте назву таблиці та стовпця, який потрібно вивантажити, ви можете використовувати комбінацію між Mid
, LAST
та TOP
, щоб вивести всю інформацію через булевий SQLi:
Feel free to check this in the online playground.
Брутфорсинг імен таблиць
Using the chaining equals technique you can also bruteforce table names with something like:
Ви також можете використовувати більш традиційний спосіб:
Feel free to check this in the online playground.
Sqlmap загальні назви таблиць: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
Є ще один список на http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Брутфорсинг назв стовпців
Ви можете брутфорсити поточні назви стовпців за допомогою трюку з рівністю:
Або з group by:
Або ви можете методом грубої сили отримати імена стовпців іншої таблиці за допомогою:
Вивантаження даних
Ми вже обговорювали техніку з'єднання рівно для вивантаження даних з поточної та інших таблиць. Але є й інші способи:
В короткому викладі, запит використовує оператор "if-then" для активації "200 OK" у випадку успіху або "500 Internal Error" в іншому випадку. Використовуючи оператор TOP 10, можна вибрати перші десять результатів. Подальше використання LAST дозволяє розглянути лише 10-ту кортеж. На такому значенні, використовуючи оператор MID, можна виконати просте порівняння символів. Правильно змінюючи індекс MID і TOP, ми можемо вивантажити вміст поля "username" для всіх рядків.
Time Based
Інші цікаві функції
Mid('admin',1,1)
отримати підрядок з позиції 1 довжиною 1 (початкова позиція - 1)LEN('1234')
отримати довжину рядкаASC('A')
отримати ASCII значення символуCHR(65)
отримати рядок з ASCII значенняIIF(1=1,'a','b')
якщо тоCOUNT(*)
Підрахувати кількість елементів
Перерахування таблиць
З тут ви можете побачити запит для отримання назв таблиць:
Однак зверніть увагу, що дуже типово знаходити SQL-ін'єкції, коли у вас немає доступу для читання таблиці MSysObjects
.
Доступ до файлової системи
Повний шлях до кореневої директорії веб-сайту
Знання абсолютного шляху до кореневої директорії веб-сайту може полегшити подальші атаки. Якщо помилки програми не повністю приховані, шлях до директорії може бути виявлений, намагаючись вибрати дані з неіснуючої бази даних.
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access відповідає повідомленням про помилку, що містить повний шлях до веб-директорії.
Перерахування файлів
Наступний вектор атаки може бути використаний для виведення існування файлу на віддаленій файловій системі. Якщо вказаний файл існує, MS Access викликає повідомлення про помилку, що інформує про те, що формат бази даних є недійсним:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
Інший спосіб перерахування файлів полягає у вказуванні елемента database.table. Якщо вказаний файл існує, MS Access відображає повідомлення про помилку формату бази даних.
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
Вгадування імені файлу .mdb
Ім'я файлу бази даних (.mdb) можна вивести за допомогою наступного запиту:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
Де name[i] є іменем файлу .mdb і realTable є існуючою таблицею в базі даних. Хоча MS Access завжди викликатиме повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb.
Ломання пароля .mdb
Access PassView - це безкоштовна утиліта, яка може бути використана для відновлення основного пароля бази даних Microsoft Access 95/97/2000/XP або Jet Database Engine 3.0/4.0.
Посилання
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated