Injections SQL
Fiche regroupant toutes les informations sur les injections SQL.
DĂ©tecter les injections SQL
-
Envoyer le symbole
'
-
Envoyer des syntaxes SQL
-
Envoyer des conditions booléennes
OR 1=1, OR 1=2
et regarder les réponses.
Caractères spéciaux
Echappement
'
permet de fermer une string dans une requète SQL.
--
permet de commenter le reste de la ligne.
+
permet dans les URL de remplacer les espaces pour notre requĂŞte SQL finale.
#
permet de commenter les objets dans certain types de base de données.
Jockers
%
est le caractère joker, il permet de remplacer n'importe quel caractère. Par exemple :
_
permet d'être remplacé par n'importe quel caractère, mais un seul uniquement. Par exemple :
-- Tous les enregistrement commencençant par b, avec n'importe quel deuxième caractère puis avec le troisième caractère n
b_n
Exemples
Contourner une mire d'authentification
RequĂŞte SQL de l'application.
On injecte admin '--
dans le champ login.
Nous voila désormais connecté en tant qu'administrateur sans avoir eu besoin de mot de passe.
Récupération d'informations supplémentaires
Exemple avec une boutique en ligne qui demande de choisir une catégorie
On injecte une commande SQL avec une union gifts' UNION SELECT username, password FROM users--
-- Requête complète
SELECT name, desc FROM products WHERE category = 'gifts' UNION SELECT username, password FROM users--
Grâce à cette injection on peut également récupérer les identifiants et les mots de passe des utilisateurs.
Modification d'une logique booléenne
Il est possible de détourner la logique booléenne en injectant une règle toujours vrais ou toujours fausse. Par exemple :
Renseignement
Détection des bases de données
On peut détecter les types de base de données avec ces quelques commandes.
Microsoft et Mysql
Oracle
PostgreSQL
Ă€ utiliser avec une injection par UNION
.
Lister les tables
On peut détecter les tables d'une majorité des bases de données en sélectionnant la table information_schema.tables
.
Lister les colonnes
On peut détecter les colonnes en consultant la table information_schema.columns
.
Equivalents avec Oracle DB
Pour lister les tables
Pour lister les colonnes
Injection Ă l'aveugle
Une injection à l'aveugle ou blind est une injection qui ne renvoi pas ces erreurs SQL. Elle est plus compliqué à exploiter, mais reste vulnérable.
Ne renvoyant pas les résultats des injections SQL, nous utilisons les commandes SQL SLEEP
des différents SGBD pour vérifier si nos commandes sont correctements exécuté. L'exploitation est donc très très lente. Les injections étants très longues et complexes, il est recommandé d'être très précis dans leur exploitation et d'utiliser des outils tel que sqlMap
pour obtenir de bons résultats.
Injection stoquée
Une injection stoquée est une injection qui n'est pas exécuter tout de suite. Elle est stoqué avant d'être exploité plus tard par l'applicatif vulnérable.
SQLMap
SQLMap est un outil permettant d'exploiter facilement les injections SQL.
# Exemple sur la page SQL de la DVWA
sqlmap -u 'http://localhost/vulnerabilities/sqli/?id=1%3D1&Submit=Submit#' --cookie="PHPSESSID=6jdlslu49mlb58sd7t4nsr70i4; security=low" -p id --random-agent
Options
-u '<url>'
est l'url Ă tester--cookie="<nomCookie>=<valeur>; ="<nomCookie>=<valeur>"
permet d'insérer des cookies d'authentification-p <paramètre>
permet de définir explicitement quel champ l'outil doit tester--random-agent
permet d'utiliser un user agent parmis une liste prédéfini par l'outil
Contre-Mesures
Pour éviter les injections SQL, il faut échapper les caractères dangereux appartenant au langages SQL comme ',-,#,%
. On peut aussi contrôler la sortie en vérifiant le nombre d'arguments en retour à la requête et ainsi bloquer leur exploitation. La meilleur façon d'implémenter des requêtes SQL est d'utiliser des préparateurs de commandes fournis par des librairies spécialisés. Quand il est difficile de patcher directement les exécutifs, il est possible d'utiliser un WAF ou pare-feu applicatif qui filtrera directement les potentielles attaques dès les requêtes web.