MS Access SQL Injection
Terrain de jeu en ligne
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)
.
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 :
Si cela ne fonctionne pas, vous pouvez toujours corriger la syntaxe de la requête :
Requêtes imbriqué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 à renvoyer.
Tout comme TOP, vous pouvez utiliser LAST
qui obtiendra 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 que dans les sous-requêtes ou requêtes supplémentaires, un FROM
soit indiqué.
Ainsi, si vous souhaitez exécuter un UNION SELECT
ou UNION ALL SELECT
ou un SELECT
entre parenthèses dans une condition, vous devez toujours indiquer un FROM
avec un nom de table valide.
Par conséquent, vous devez connaître un nom de table valide.
Chainer equals + Substring
Cela vous permettra d'exfiltrer les valeurs de la table actuelle sans avoir besoin de connaître le nom de la table.
MS Access permet une syntaxe étrange telle que '1'=2='3'='asd'=false
. Comme l'injection SQL se trouvera généralement dans 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 connaissez (ou avez deviné) qu'un nom de colonne est username, et que c'est le champ que vous souhaitez exfiltrer. Vous pourriez vérifier les différentes réponses de l'application web lorsque la technique de chaînage d'égalités est utilisée et potentiellement exfiltrer du contenu avec une injection booléenne en utilisant la fonction Mid
pour obtenir des sous-chaînes.
Si vous connaissez le nom de la table et de la colonne à extraire, vous pouvez utiliser une combinaison de Mid
, LAST
et TOP
pour exposer toutes les informations via une injection SQL booléenne :
Feel free to check this in the online playground.
Forcer les noms de tables
En utilisant la technique de chaînage des égalités, vous pouvez également forcer les noms de tables avec quelque chose comme :
Le contenu suivant est extrait d'un livre sur les techniques de piratage. Le contenu suivant est issu du fichier pentesting-web/sql-injection/ms-access-sql-injection.md. Traduisez le texte anglais pertinent en français et renvoyez la traduction en conservant exactement la même syntaxe markdown et html. Ne traduisez pas les codes, les noms de techniques de piratage, les mots de piratage, les noms de plateformes cloud/SaaS (comme Workspace, aws, gcp...), le mot 'leak', pentesting et les balises markdown. N'ajoutez rien d'autre en dehors de la traduction et de la syntaxe markdown.
Feel free to check this in the online playground.
Sqlmap common table names: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
There is another list in http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Forcer les noms de colonnes par brute force
Vous pouvez forcer les noms de colonnes actuelles avec le truc de chaînage égal avec :
Ou avec un group by :
Ou vous pouvez effectuer une attaque par force brute sur les noms de colonnes d'une table différente avec :
Extraction de données
Nous avons déjà discuté de la technique de chaînage des égalités pour extraire des données des tables actuelles et d'autres tables. Mais il existe d'autres moyens :
En résumé, la requête utilise une instruction "si-alors" pour 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 considérer uniquement le 10e tuple. Sur cette valeur, en utilisant l'opérateur MID, il est possible d'effectuer une simple comparaison de caractères. En modifiant correctement l'index de MID et TOP, nous pouvons extraire le contenu du champ "username" pour toutes les lignes.
Basé sur le temps
Autres fonctions intéressantes
Mid('admin',1,1)
obtenir une sous-chaîne à partir de la position 1 d'une longueur de 1 (la position initiale est 1)LEN('1234')
obtenir la longueur de la chaîneASC('A')
obtenir la valeur ASCII du caractèreCHR(65)
obtenir la chaîne à partir de la valeur ASCIIIIF(1=1,'a','b')
si alorsCOUNT(*)
Compter le nombre d'éléments
Énumération des tables
À partir de ici, vous pouvez voir une requête pour obtenir les noms des tables :
Cependant, notez qu'il est très courant de trouver des injections SQL où vous n'avez pas accès pour lire la table MSysObjects
.
Accès au système de fichiers
Chemin complet du répertoire racine du site Web
La connaissance du chemin absolu du répertoire racine du site 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 du site 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 du fichier .mdb
Le nom du 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
Où 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.
Cracker de mot de passe .mdb
Access PassView 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
Last updated