💉- Injections
Page d'introduction à l'injection SQL
L’injection SQL, ou SQLi, est un type d’attaque sur une application web qui permet à un attaquant d’insérer des instructions SQL malveillantes dans l’application web, pouvant potentiellement accéder à des données sensibles dans la base de données ou détruire ces données.l’injection SQL a été découverte pour la première fois par Jeff Forristal en 1998.
Techniques d'injection SQL
Les objectifs des injections SQL peuvent être multiples:
accéder à des données auxquelles on ne devrait pas avoir accès,
modifier des données,
effacer des données,
lire/écrire sur le système de fichier,
exécuter des commandes systèmes.
Par exemple, dans le cas d'une requête SELECT, l'objectif peut être de :
modifier les critères de recherche, par exemple contourner une authentification,
ajouter aux résultats des informations se trouvant dans d'autres tables pour accéder à des données auxquelles on ne devrait pas avoir accès.
Une injection SQL dans une requête UPDATE peut permettre de :
modifier des données avec des valeurs choisies
modifier de manière plus globale les informations (Modification des clauses WHERE)
Une requête DELETE peut être modifiée à des fins de dénis de service.
Exploitation des messages d'erreurs
L'exploitation d'une faille par injection SQL peut être facilitée par la présence de message d'erreur dans l'application. Cherchons à rendre la requête SQL invalide dans le cas d'un site Web demandant une authentification.
$sql="SELECT login FROM users WHERE login='".$login."' AND pass='".$pass."'";
$result = mysql_query ($sql) or die ("Invalid query".mysql_error());
if($row = mysql_fetch_array ($result))
{
print "Identified as ".htmlspecialchars($row['login']);
...
}
Suite à la saisie d'une simple quote dans ce formulaire, la requête devient invalide et provoque l'affichage d'un message d'erreur:
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 pass=''' at line 1
Ce script est donc vulnérable et nous apprenons que le serveur SQL est MySQL. Mais dans l'hypothèse où le paramètre se retrouve entre double-quote, il faut aussi tester l'utilisation de double-quote. Cependant le serveur où le script s'exécute peut être configuré pour ne pas afficher de message d'erreur (Mettre display_errors = Off dans php.ini par exemple) ou bien utiliser des try/catch (C#, Java, PHP5 ...) pour gérer les exceptions, les anomalies de fonctionnement et donner l'impression d'un fonctionnement normal de l'application.
Dans cette rubrique :
Injection SQLInjection UNIXSQLMAPMis à jour
Ce contenu vous a-t-il été utile ?