Annexe : Injection SQL
Sécurité informatique
" Les injections SQL "
• L'injection SQL directe est une technique où un
pirate modifie une requête SQL existante pour
afficher des données cachées, ou pour écraser des
valeurs importantes, ou encore exécuter des
commandes dangereuses pour la base. Cela se fait
lorsque l'application prend les données envoyées
par l'internaute, et l'utilise directement pour
construire une requête SQL.
• S'il s'agit d'un formulaire de connexion alors vous
pouvez être sûr que la requête renverra l'id de
3 BI - IHEC
Page 1
Annexe : Injection SQL
l'utilisateur même si le mot de passe est incorrect.
Vous serez donc logué juste en connaissant le
nom de l'utilisateur.
C'est donc pour cela qu'il faut protéger ses
données avec une fonction adaptée.
Heureusement ça ne sera pas bien difficile.
• Si vous utilisez mysql_connect() pour vous
connecter à votre base de données, alors vous
devrez utiliser la
fonction mysql_real_escape_string()
• Si vous utilisez mysqli de façon procédurale, vous
utiliserez la fonction mysqli_real_escape_string()
• Si vous utilisez mysqli de façon orienté objet, vous
utiliserez la méthode mysqli::real_escape_string()
• Si vous utilisez PDO, vous utiliserez la
méthode PDO::quote()
3 BI - IHEC
Page 2
Annexe : Injection SQL
• Exemple
Considérons un site web dynamique (programmé
en PHP dans cet exemple) qui dispose d'un système
permettant aux utilisateurs possédant un nom
d'utilisateur et un mot de passe valides de se connecter.
Ce site utilise la requête SQL suivante pour identifier un
utilisateur :
SELECT uid FROM Users WHERE name = '(nom)' AND
password = '(mot de passe hashé)';
L'utilisateur Dupont souhaite se connecter avec son mot
de passe "truc" hashé en MD5(L'algorithme MD5,
pour Message Digest 5, est une fonction de hachage
cryptographique qui permet d'obtenir l'empreinte
numérique d'un fichier). La requête suivante est
exécutée :
SELECT uid FROM Users WHERE name = 'Dupont' AND
password = '45723a2af3788c4ff17f8d1114760e62';
-- Attaquer la requête
Imaginons à présent que le script PHP exécutant cette
requête ne vérifie pas les données entrantes pour
garantir sa sécurité. Un cracker pourrait alors fournir les
informations suivantes :
3 BI - IHEC
Page 3
Annexe : Injection SQL
Utilisateur : Dupont' --
Mot de passe : n'importe lequel
La requête devient :
SELECT uid FROM Users WHERE name = 'Dupont' -- '
AND password =
'4e383a1918b432a9bb7702f086c56596e';
Les caractères -- marquent le début
d'un commentaire en SQL. La requête est donc
équivalente à :
SELECT uid FROM Users WHERE name = 'Dupont';
L'attaquant peut alors se connecter sous l'utilisateur
Dupont avec n'importe quel mot de passe. Il s'agit d'une
injection de SQL réussie, car l'attaquant est parvenu à
injecter les caractères qu'il voulait pour modifier le
comportement de la requête
3 BI - IHEC
Page 4
Annexe : Injection SQL
• PHP et Injection SQL
Voici un extrait du document :
Voici comment désactiver les Magic Quotes :
• ''Via le fichier de configuration php.ini :''
magic_quotes_gpc = Off
• ''Via .htaccess :'' SetEnv MAGIC_QUOTES 0 ''Ou :''
php_flag magic_quotes_gpc 0
Si ces manipulations n'ont pas fonctionné et que vous n'avez
pas accès au fichier de configuration de PHP, rien n’est perdu.
Il va vous suffira de mettre le code ci-dessous au début de vos
scripts :
Création de la fonction :
function no_magic_quotes(&$array) {
/* Script réalisé par Besset Francis Vous pouvez utiliser et
distribuer librement ce code à condition de laisser le nom du
réalisateur du code. http://www.apercite.fr */
Détection si magic_quotes est activé
if(MAGIC_QUOTES) {
foreach($array as $key => $val) {
Si la variable est un tableau
if(is_array($val)) {
Alors on rappelle la fonction pour traiter ce tableau
no_magic_quotes($array$key);
}
Sinon si la variable n'est pas un numérique alors elle est
susceptible de contenir des antislahs ou quotes ajouté par
Magic Quotes (Sybase)
3 BI - IHEC
Page 5
Annexe : Injection SQL
elseif(!is_numeric($val)) {
Alors on lui enlève les antislashs ajoutés par Magic Quotes
$array$key = stripslashes($val);
}
}
}
}
Voici la liste des superglobales touchées par Magic Quotes :
no_magic_quotes($_GET);
no_magic_quotes($_POST);
no_magic_quotes($_COOKIE); ?>
A noter que le code ci-dessus, enlèvera les antislashes ajouter
par Magic Quotes uniquement si Magic Quotes est activé.
Nous voilà donc séparé des Magic Quotes et nous tendons les
bras grand ouvert vers mysql_real_escape_string().
Pour l'affichage d'une donnée sur une page venant de la base
de données ou des $_POST, $_COOKIE, $_GET, je vous conseille
grandement d'utiliser htmlspecialchars() avec l'option
ENT_QUOTES afin de transformer les caractères suivant en
entités :
• " & " devient " & "
• " " " devient " " "
• " ' " devient " #039; "
• " < " devient " < "
• " > " devient " > "
3 BI - IHEC
Page 6