MS Access SQL Injection
Last updated
Last updated
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)
Konkatenacja ciągów jest możliwa za pomocą znaków & (%26)
i + (%2b)
.
Nie ma komentarzy w MS Access, ale najwyraźniej możliwe jest usunięcie ostatniego elementu zapytania za pomocą znaku NULL:
Jeśli to nie działa, zawsze możesz poprawić składnię zapytania:
Nie są obsługiwane.
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.
Just like TOP you can use LAST
which will get the wiersze z końca.
In a SQLi you usually will want to somehow execute a new query to extract information from other tables. MS Access always requires that in podzapytaniach lub dodatkowych zapytaniach wskazany jest FROM
.
So, if you want to execute a UNION SELECT
or UNION ALL SELECT
or a SELECT
between parenthesis in a condition, you always musisz wskazać FROM
z ważną nazwą tabeli.
Therefore, you need to know a ważną nazwę tabeli.
To pozwoli Ci na wyeksfiltrowanie 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 chaining equals i potencjalnie wyeksfiltrować zawartość za pomocą boolean injection używając funkcji Mid
do uzyskania podciągów.
Jeśli znasz nazwę tabeli i kolumny, które chcesz zrzucić, możesz użyć kombinacji Mid
, LAST
i TOP
, aby wyciekło wszystkie informacje za pomocą boolean SQLi:
Feel free to check this in the online playground.
Używając techniki łańcuchowego równości, możesz również bruteforce'ować nazwy tabel za pomocą czegoś takiego:
Możesz również użyć bardziej tradycyjnego sposobu:
Feel free to check this in the online playground.
Nazwy wspólnych tabel Sqlmap: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
Istnieje inna lista w http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Możesz brute-forcować aktualne nazwy kolumn za pomocą sztuczki z łańcuchowymi równaniami:
Lub z group by:
Lub możesz przeprowadzić atak brute-force na nazwy kolumn innej tabeli za pomocą:
Już omówiliśmy technikę łączenia równań w celu zrzutu danych z bieżącej i innych tabel. Ale są też inne sposoby:
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.
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ągu
ASC('A')
pobiera wartość ascii znaku
CHR(65)
pobiera ciąg z wartości ascii
IIF(1=1,'a','b')
jeśli to wtedy
COUNT(*)
zlicza liczbę elementów
Z tutaj możesz zobaczyć zapytanie do uzyskania nazw tabel:
Jednak należy zauważyć, że bardzo typowe jest znalezienie SQL Injection, gdzie nie masz dostępu do odczytu tabeli MSysObjects
.
Znajomość absolutnej ścieżki 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, 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ę katalogu witryny.
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 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
Inny sposób enumeracji plików polega na określeniu 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
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 i realTable to istniejąca tabela w bazie danych. Chociaż MS Access zawsze wywoła komunikat o błędzie, możliwe jest odróżnienie nieprawidłowej nazwy pliku od prawidłowej nazwy pliku .mdb.
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.
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)