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