Injection de SQL

From mediawiki.org
This page is a translated version of the page SQL injection and the translation is 100% complete.

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" );

La manière recommandée d'exécuter la requête ci-dessus est :

$limit = $wgRequest->getVal( 'limit' );
$limit = intval( $limit ); // OPTIONAL validation
$res = $db->select( 'kitties',
                    '*',
                    false,
                    __METHOD__,
                    array( 'LIMIT' => $limit ) // REQUIRED automatic escaping
);

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 :