Injection de SQL
Aperçu
L'injection de SQL est un type d'attaque utilisant les failles dans la validation des entrées ou du type de données d'une application, dans les requêtes SQL.
Quand cela fonctionne, l'attaque permet à l'assaillant d'injecter des données dans une requête SQL existante. L'attaquant peut ensuite récupérer des données privées, provoquer un déni de service ou d'autres réponses non souhaitées. Dans le pire des cas, le code injecté peut lui permettre de prendre le contrôle total du système en exploitant les multiples failles du serveur de base de données, des utilisaires système ou du système d'exploitation.
Pour un aperçu général sur les attaques par injection de SQL, voir la page Injection de SQL de Wikipedia.
Exemple
L'extrait de code suivant permet à un attaquant d'exécuter ses propres commandes SQL (c'est une erreur de syntaxe dans Oracle).
$limit = $wgRequest->getVal( 'limit' );
$res = $db->query( "SELECT * from kitties LIMIT $limit" );
Avant MW 1.35, la manière préférée pour exécuter la requête ci-dessus était :
$limit = $wgRequest->getVal( 'limit' );
$limit = intval( $limit ); // OPTIONAL validation
$res = $db->select( 'kitties',
'*',
false,
__METHOD__,
array( 'LIMIT' => $limit ) // REQUIRED automatic escaping
);
See Manual:Database access for more recent approaches to building SQL queries using the SelectQueryBuilder class.
Pour exploiter la vulnérabilité et pour récupérer les adresses courriel des utilisateurs enregistrés du wiki, l'attaquant devrait utiliser une chaîne GET avec :
?limit=%201%20union%20select%20user_email%20from%20user;
Injection de SQL et MediaWiki
MediaWiki possède une interface personnalisée de génération du SQL qui a pprouvé son efficacité pour écarter les failles d'injection de SQL. L'interface de génération du SQL fournit également un niveau d'abstraction DBMS et des fonctions telles que le préfixage des tables.
Pour protéger MediaWiki contre l'injection de SQL :
- évitez à tout prix d'utiliser les requêtes SQL directement
- revoir Manuel: Accès à la base de données et utiliser les fonctions fournies dans Database.php
- lisez la page Le projet de sécurisation des applications du web ouvert concernant l'injection de SQL (http://www.owasp.org/index.php/SQL_Injection)
- Le Wiki d'injection SQL : http://www.sqlinjectionwiki.com/