Eviter les injections SQL Comment PHP vend la mèche

À première vue, ce type d'injection peut sembler difficile à identifier. Pourtant, il suffit de peu de temps à un pirate pour comprendre comment contourner le code. En procédant par expérimentations, on obtient facilement beaucoup d'informations. Par exemple, en plaçant simplement un guillemet dans la variable nom, on pourrait obtenir rapidement des informations de configuration de l'application web :

$_POST['Nom'] = " '" ;
$requete = "SELECT count(*) FROM utilisateurs
WHERE login = ''' AND
password='' or 1 ");


Les trois guillemets conduisent à une erreur de syntaxe SQL. Or, les erreurs SQL sont souvent affichées dans le script comme ceci :

 echo mysqli_error($mid) ;


On va donc obtenir un message d'alerte tel que celui-ci :

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''' and Password='passe'


Rien qu'avec ce test simple, on sait déjà qu'il y a une injection SQL possible, et on connaît aussi le nom de la deuxième colonne impliquée dans la requête. Il ne reste plus qu'à exploiter cette vulnérabilité. N'oubliez jamais qu'un pirate a tout son temps devant lui.

Exemples avancés

Voici quelques autres injections possibles :

 mysql> SELECT * FROM TABLE WHERE id = (SELECT BENCHMARK(10000000,ENCODE('abc','123')));


Cette injection réalise un déni de service, où le serveur va être fortement ralenti par des requêtes lentes et inutiles.

Sous Microsoft SQL, on trouve la fonction EXEC, qui est la cousine de la fonction eval() de PHP : elle permet d'exécuter du code SQL, stocké sur le serveur sous forme de chaîne. Les dangers inhérents sont les mêmes :

DECLARE @requete varchar(500) SET @requete = 'SELECT login FROM utilisateurs WHERE
?login = ''' + @login + ''''
EXEC(@requete)
END


Avec :

1' or '1'='1'; # maintenant, une autre injection!

Serveurs / Faille