MS Access SQL Injection
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
String samevoeging is moontlik met & (%26)
en + (%2b)
karakters.
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:
As dit nie werk nie, kan jy altyd die sintaksis van die navraag regmaak:
Hulle word nie ondersteun nie.
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.
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 ken.
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.
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:
Feel free to check this in the online playground.
Met die kettinggelykte tegniek kan jy ook bruteforce tabel name met iets soos:
U kan ook 'n meer tradisionele manier gebruik:
Feel vry om dit in die aanlyn speelgrond te kontroleer.
Sqlmap algemene tabel name: 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
Jy kan brute-force huidige kolom name met die ketting gelyk trick met:
Of met 'n group by:
Of jy kan die kolomname van 'n ander tabel brute-force met:
Ons het reeds die chaining equals technique bespreek om data uit die huidige en ander tabelle te dump. Maar daar is ander maniere:
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.
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
Van hier kan jy 'n navraag sien om tabelname te kry:
However, note that is very typical to find SQL Injections where you don't have access to read the table MSysObjects
.
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.
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
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.
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.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)