Exercice 1
Un service Web (Backend) implémenté en PhP communique avec un serveur de base de
données MySQL qui gère les tables suivantes (et d’autres tables aussi) :
Le code suivant appartient au service Web et il est utilisé pour générer une requête SQL suite à
la réception d’un formulaire de la part d’un utilisateur :
A. Donnez un exemple d’une requête normale qui peut être générée à partir de ce code:
B. Proposez une entrée (valeur des champs column, table et id) qui permet à un attaquant de
chercher le mot de passe (colonne password) de l’administrateur "admin" (colonne user_id)
dans la table users.
Entrée :
• Column :
• Table :
• Id :
Requête SQL générée :
Exercice 2 :
Une page web offre un champ de saisie pour entrer un numéro d’identification ID. en cliquant
sur le bouton ‘chercher’, la page web répond avec l'une ou l'autre des réponses suivantes:
• Réponse A : « le produit recherché existe dans la base de données ! » si l'exécution
d'une requête SQL (utilisant la valeur ID) retourne des résultats,
• Réponse B : « le produit recherché n’existe pas dans la base de données ! » si
l'exécution de la requête SQL (utilisant la valeur ID) retourne 0 résultats ou si une erreur
est détectée par le SGBD.
Sachant que le nom de la base de données utilisée est « Amazon », qu’il existe un produit ayant
un ID =1 et qu’il n’existe pas de produit ayant un ID=7. Les observations suivantes ont été
constatées par l’attaquant en essayant les entrées suivantes :
I. avec l'entrée 1 ' and 1=2 union select 3,5,7 # le message affiché est « le produit
recherché n’existe pas dans la base de données ! »
II. avec l'entrée 1' order by 4 # le message affiché est « le produit recherché n’existe pas
dans la base de données ! »
III. avec l'entrée 1' order by 2 # le message affiché est « le produit recherché existe dans la
base de données ! »
1) Quel est le nombre de colonnes de la table des résultats de la requête SQL? Justifiez votre
réponse!
2) Pour chacune des entrées suivantes, identifiez la réponse (Réponse A ou Réponse B) que la
page doit afficher et justifiez votre choix :
a. 7' union select if (database() = 'Amazone',sleep(3), null),3 #
b. 1' union select if (database() = 'Amazon',sleep(3), null),3,7 #
c. 7' union select if (database() = 'Amazon',sleep(7), null),3 #
d. 1' union select if (database() = 'Amazone',sleep(3), null),8 #