MS Access SQL Injection
Online-Spielplatz
DB-Einschränkungen
Zeichenkettenverkettung
Die Zeichenkettenverkettung ist möglich mit den Zeichen & (%26)
und + (%2b)
.
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:
Wenn dies nicht funktioniert, könnten Sie immer die Syntax der Abfrage korrigieren:
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.
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.
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.
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:
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.
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:
Sie können auch einen traditionelleren Weg verwenden:
Fühlen Sie sich frei, dies im Online-Playground zu überprüfen.
Sqlmap häufige Tabellennamen: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
Es gibt eine weitere Liste unter http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Brute-Forcing von Spaltennamen
Sie können aktuelle Spaltennamen mit dem Chaining-Equals-Trick brute-forcen, indem Sie Folgendes verwenden:
Oder mit einer group by-Anweisung:
Oder Sie können die Spaltennamen einer anderen Tabelle mit Brute-Force ermitteln:
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:
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ückASC('A')
gibt den ASCII-Wert des Zeichens zurückCHR(65)
gibt den String vom ASCII-Wert zurückIIF(1=1,'a','b')
if thenCOUNT(*)
zählt die Anzahl der Elemente
Tabellen auflisten
Von hier aus können Sie eine Abfrage sehen, um Tabellennamen zu erhalten:
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
Last updated