TP3
SQL injection
Qu’est-ce qu’une injection SQL ?
L’injection SQL est une cyberattaque qui consiste à injecter dans une requête SQL des
morceaux de codes non filtrés. Le hacker peut modifier la requête afin d’accéder à la base de
données. (ORACLE).
Quelles sont les conséquences d'une injection SQL ?
La divulgation d'information confidentielle, étant donné que les bases de données contiennent
en règle générale des données à caractères sensibles (empreinte des mots de passe et vecteur
de salage, email, informations bancaires,etc).
La possibilité d'une authentification fallacieuse. Car si une mauvaise commande peut être
exécutée à la place de la commande attendue, rien n'empêche une élévation de privilège mal
attentionné.
La modification des niveaux d'autorisations à l'accès aux informations. Si les droits sur une
application sont stockés dans la base de données et qu'une commande d'altération est
exécutée, il est parfaitement envisageable de les remplacer en exploitant avec succès une
vulnérabilité.
Altération de l'intégrité des données. Il est parfaitement possible d'apporter des modifications
ou même de supprimer des informations avec une attaque par injection SQL.
Dans ce tp nous allons tester, quelques exemples.
Exercice 1 :
On considère le code php de l’annexe.
Faudra donc créer une base de données avec une table etudiant ( prenon, mail, age, mdp) ;
Et utiliser le code php ci- dessous après l’avoir adapté à votre situation.
On ne s’intéressera pas à la saisie des informations, pour le moment. Les valeurs seront saisies
directement dans la base par l’intermédiaire d’une requête insert.
Vous devez, normalement, obtenir quelque chose de ce genre :
Nous allons faire des recherches dans la base, en utilisant les prénoms.
Dans le champ prénom saisissez les codes suivants et notez les résultats.
1) Utiliser un prénom qui existe dans la base pour la mise au point.
2) ' (un guillemet simple)
3) ' OR 'x' = 'x '
4) ' OR 1=1 -- (attention à l’espace à la fn)
5)rob' -- (attention à l’espace à la fn)
6) ' OR 1=1 LIMIT 1 -- (attention à l’espace à la fn)
7) ' ; DROP TABLE etudiant ; -- (attention à l’espace à la fin)
Exercice 2 :
Corrigez le code pour éviter ce genre de situation.
Exercice3 :
Trouvez les différends type d’injection sql , connus.
Annexe :
<!DOCTYPE html>
<html>
<head>
<title>test injection </title>
<meta charset="utf-8">
</head>
<body>
<h1>Formulaire HTML</h1>
<form action="[Link]" method="post">
<div >
<label for="prenom">Prénom : </label>
<input type="text" id="prenom" name="prenom" style="width:30em">
</div>
<div >
<label for="mail">Email : </label>
<input type="email" id="mail" name="mail">
</div>
<div >
<label for="age">Age : </label>
<input type="number" id="age" name="age" min="12" max="99">
</div>
<div >
<label for="pwd">Paswword : </label>
<input type="text" id="pwd" name="pwd" min="12" max="99">
</div>
<div id="submit">
<input type="submit" value="Envoyer">
</div>
</form>
<?php
$serveur = "……..";
$dbname = "…….";
$user = "……..";
$pass = "……….";
$prenom = $_POST["prenom"];
$mail = $_POST["mail"];
$age = $_POST["age"];
$pwd = $_POST["pwd"]
try{
//On se connecte à la BDD
$dbco = new PDO("mysql:host=$serveur;dbname=$dbname",$user,$pass);
$dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//On insère les données reçues si les champs sont remplis
/* if(!empty($prenom) && !empty($mail) && !empty($age) && !empty($pwd)){
$sth = $dbco->prepare("
INSERT INTO etu(prenom, mail, age,,mdp)
VALUES(:prenom, :mail, :age)");
$sth->bindParam(':prenom',$prenom);
$sth->bindParam(':mail',$mail);
$sth->bindParam(':age',$age);
$sth->execute();
}*/
echo $prenom;
//On récupère les infos de la table
$query="SELECT * FROM form WHERE prenom='$prenom'";
$sth=$dbco->query($query);
//On affiche les infos de la table
$resultat = $sth->fetchAll(PDO::FETCH_ASSOC);
$keys = array_keys($resultat);
for($i = 0; $i < count($resultat); $i++){
$n = $i + 1;
echo 'Etudiant n°' .$n. ' :<br>';
foreach($resultat[$keys[$i]] as $key => $value){
echo $key. ' : ' .$value. '<br>';
}
echo '<br>';
}
}
catch(PDOException $e){
echo 'Impossible de traiter les données. Erreur : '.$e->getMessage();
}
?>
</body>
</html>