MS Access SQL Injection
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)
Online Playground
Ograniczenia DB
Konkatenacja ciągów
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 elementu zapytania za pomocą znaku NULL:
Jeśli to nie działa, zawsze możesz poprawić składnię zapytania:
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.
Just like TOP you can use LAST
which will get the wiersze z końca.
UNION Queries/Sub queries
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.
Chaining equals + Substring
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.
Brute-forcing Tables names
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
Brute-Forcing Nazwy kolumn
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ą:
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:
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
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:
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 katalogu głównego witryny
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.
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 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
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 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.
Łamacza haseł .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.
Odniesienia
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)
Last updated