Bonjour à tous. Durant cette deuxième semaine du MOOC Cybersécurité des sites Web, nous allons aborder l'un des types d'attaques les plus courantes sur ceci : l'injection de requêtes SQL. Commençons par regarder l'architecture générale d'un site Web. Le navigateur client demande l'affichage d'une page Web. Ensuite, le serveur Web transfère la demande au serveur applicatif, par exemple un serveur [INAUDIBLE]. Ensuite, le serveur applicatif génère une requête SQL afin de récupérer les informations nécessaires. Puis, le serveur base de données retourne le résultat de la requête au serveur applicatif. Ensuite, le serveur applicatif transmet au serveur Web les informations nécessaires de la création de la page à afficher. Pour finir, le serveur Web envoie les pages HTML au navigateur client. Un site internet utilise généralement une base de données, qui permet de stocker des informations telles que des données sur les utilisateurs, par exemple leur nom, leur prénom, leur login et leur mot de passe, ou encore des commentaires sur des sites de ventes en ligne ou des forums, et de les retrouver. Pour cela, un SGBD ou Système de Gestion de Bases de Données, est utilisé. Il s'agit d'un intermédiaire entre un client. Comprenez par clients des utilisateurs ou des applications et une base de données. Le SGBD permet au client d'interagir avec une base de données. Mais comment cela fonctionne-t-il? Un client soumet une demande nommée requête au SGBD, qui va effectuer les opérations demandées sur la base de données, et retournera le résultat de la requête. La réponse dépend de la demande. En cas de demande de modification de données, le SGBD retournera une réponse indiquant si la modification s'est bien déroulée ou non. En cas de demande de rapatriement de données, le SGBD retournera les données demandées. Alors, quelle est l'idée derrière l'injection de requête SQL? Tout d'abord, SQL signifie Structured Query Language. C'est un langage d'interrogation de bases de données, comme il existe des langages de programmation. L'interrogation d'une base de données nécessite par définition des données pour formuler les questions, données renseignées par l'utilisateur avec un formulaire Web. L'idée pour un attaquant est alors d'injecter des requêtes dans ces données, pour exploiter les droits d'interrogation du SGBD, qui est le programme qui gère la page Web sur laquelle interagit l'utilisateur. Je vais commencer par vous faire un petit rappel sur le langage SQL. Le langage SQL est un langage standard pour les SGBD. Il est composé de deux parties. La première est un LDD, ou Langage de Définition de Données, pour gérer le schéma de la base de données, notamment tout ce qui est création de tables, suppression de tables etc. La deuxième partie est le LMD, ou Langage de Modélisation de Données, pour gérer l'instance d'une base de données. Le LMD comprend notamment les commandes : select, update, delete et insert, ou select correspond au rapatriement de données, delete à la suppression, update à la modification, et insert à l'insertion. Considérons un exemple pour les types de requêtes qui nous intéressent plus particulièrement : select et insert. Prenons la base de données suivante. Le nom de la base de données est MOOC. La table numéro 1 se nomme Utilisateurs et possède les attributs : id, nom, prénom, login et password. La table numéro 2 s'appelle Fichier, et possède les attributs : id, nomFichier, lien et privée. La requête create table permet de créer une table. Sa syntaxe est la suivante : create table, le nom de la table, et entre parenthèses le nom de la colonne 1 type 1 virgule le nom de la colonne 2, type 2, etc. Create et table sont les instructions de création de la table. Nom_table est son nom, le nom de la colonne 1 est le nom du premier attribut de la table, et il est de type 1. Rappelons qu'un type indiquera ici le format des données, par exemple une chaîne de caractères, un nombre entier, un nombre à virgule flottante etc. Le second attribut est nommé nom_col2, et il est de type type2. Regardons maintenant un exemple plus concret. Create et table sont les instructions de création de la table ; Utilisateurs est son nom ; id est le nom du premier attribut de la table, et il est de type entier. Le second attribut est nommé nom, et il est de type varchar. Ce type de donnée permet de stocker des chaînes de caractères de longueurs variables. Ici, 40 est la longueur maximale. Le prénom et le login sont aussi de type varchar et de longueur maximale 40 caractères. Le mot de passe est nommé password, et de longueur variable avec un maximum de 50 caractères. Il est bien sûr possible d'ajouter des contraintes lors de la création telles que primary key ou not null. Regardons l'exemple en bas du slide. Not null signifie que la valeur de l'attribut ne peut pas être nulle ; auto_increment, que sa valeur est auto-incrémentée, et primary key indique que c'est une clé primaire. Une clé primaire permet d'identifier de manière unique un enregistrement de la table, c'est-à -dire une ligne. Les autres contraintes sont l'ajout d'une clé étrangère. Attention, pour ajouter une clé étrangère, l'attribut référencé doit exister en tant que clé primaire dans une autre table, car l'idée d'utiliser un SGBD est de regrouper dans des tables distinctes des informations variables. Sinon, il suffirait d'une seule énorme table avec tous les attributs au prix d'énormément de champs identiques répétés dans des enregistrements, et donc un gaspillage de mémoire. La contrainte unique pour indiquer qu'il ne doit pas y avoir de doublons, est une contrainte de valeur par défaut nommée default. Ces tables ne contiennent aucune donnée pour le moment, mais elles existent. Nous allons commencer par insérer des données dans ces tables. Une requête d'insertion est de la forme suivante : insert, le mot clé indiquant que l'on veut insérer, into le nom de la table indique que l'on veut insérer dans la table nom_table ; attribut 1, attribut 2 entre parenthèses ; et la liste des attributs de la table dans lesquels on veut insérer ces données ; values entre parenthèses valeur Attribut 1, valeur Attribut 2 ; et la liste des valeurs que l'on veut insérer dans les attributs précédemment indiqués. Cela donne, pour ajouter un utilisateur, insert into Utilisateurs, entre parenthèses nom, prénom, login, password, values ('Dupont', 'Jean', 'Jdupont', 'jeanpassword'). Pour ajouter un autre individu, il suffit d'utiliser la même requête avec des valeurs différentes. Ici, nous ne fournissons pas de valeur pour l'attribut id, car il est incrémenté automatiquement. Il suffit de faire de même pour insérer des données dans la table Fichier. Insert into Fichier (nomFichier, lien, privee) values ('confidentiel', './Jean/', 'True'). Regardons maintenant le rapatriement de données. À l'aide de la requête select, si je vous dis que je veux connaître le nom et le prénom de l'utilisateur ayant comme login Jdupont et comme mot de passe jeanpassword, comment faites-vous? Eh bien, c'est simple. Vous allez utiliser une requête select comme ceci : select nom, prénom, from Utilisateurs where login = 'Jdupont' and password = 'jeanpassword'. Select est le mot clé de projection. From suivi d'un nom de table indique dans quelle table de la base de données le SGBD doit aller chercher les informations. Et where est le mot clé qui indique les conditions de recherche. Ici, le login doit être égal à Jean, et password doit être égal à jeanpassword. Il existe des mots clés comme union, qui permet de combiner les résultats provenant de plusieurs requêtes de rapatriement de données dans le même ensemble de résultats. Pour cela, la ou les sous-requêtes doivent avoir le même nombre d'attributs. Il existe aussi le mot clé intersect, qui permet de rapatrier l'intersection de résultats de deux requêtes SQL, comme par exemple select nom_patient from hopital1 intersect select nom_patient from hopital2, qui retourne la liste des patients ayant fréquenté les deux hôpitaux. Nous venons de voir comment faire un rapatriement de données à l'aide d'une requête select dans sa forme la plus simple. À noter qu'il est possible de faire des requêtes plus complexes, à l'aide des mots clés : in, union etc. On peut aussi modifier le comportement d'une requête afin de voler les informations ou de contourner une authentification si un pirate a la main sur un champ de saisie dans un formulaire Web et que ce formulaire n'est pas sécurisé. Vous savez désormais mettre en place une base de données dans un SGBD SQL et l'interroger. Nous verrons dans la prochaine vidéo les bases de l'injection SQL.