Une grande majorité des sites Web a recours à une base de données pour y stocker la structure du site, le contenu des pages et les informations confidentielles des utilisateurs. Les codes des pages Web se contentent d’interroger les bases de données et de mettre en forme les informations retournées pour les présenter aux internautes. Les bases contiennent à l’évidence des informations sensibles que personne ne laisserait consciemment en libre accès sur Internet. Le fait que les accès se fassent par l’intermédiaire de fichiers donne un faux sentiment de cloisonnement et de sécurité. Or, il est en fait relativement facile d’interagir plus ou moins directement à distance avec les bases de données, en exploitant des faiblesses de développement des pages servant d’interfaces avec Internet.
Revenons dans un premier temps sur le fonctionnement global de serveurs Web reposant sur une base de données.
Mode de fonctionnement normal
Dans le cas d’un fonctionnement courant, la visualisation d’une page Web, sur un site utilisant une base de données, se fait en quatre étapes :
- Les paramètres qualifiant la requête HTTP sont envoyés à une page du serveur. Ces paramètres peuvent être explicitement demandés à l’internaute par l’intermédiaire de formulaires ou être implicites dans des liens. Par exemple, un lien direct pour accéder à la section information d’un site pourrait être :
« Page d’informations » . Dans ce cas, le paramètre et sa valeur sont implicites (paramètre= « page », valeur= « info»). - Les paramètres reçus sont utilisés pour construire une requête SQL (Structured Query Language ou langage de requête structuré) interprétée par la base. Par exemple, la valeur du paramètre page est utilisée dans la requête SQL suivante [1] :
« SELECT titre_page,contenu_page FROM table_page WHERE nom=page ». Ici, la variable page vaut info ». - La base de données traite la requête SQL et retourne les données trouvées. A ce niveau là, dans la majorité des cas, aucun traitement ni vérification ne sont faits, si ce n’est ceux liés à la structure de la base et gérés automatiquement par le moteur interne. Exemple : l’utilisateur (le serveur Web) doit avoir le droit d’accéder aux données.
- Le code du site qui est à l’origine de la requête récupère les données pour la mise en page et les envoie en réponse (HTTP). Par exemple, la page index.php récupère les informations titre_page et contenu_page et retourne le tout.
Dans ces conditions, comment opère une attaque par injection SQL ?
Attaque par injection
Au cours d’une tentative d’intrusion par injection SQL, le déroulement suit les même quatre étapes. Mais l’attaquant va influer sur le comportement de la base en modifiant les paramètres envoyés au serveur. Dans l’exemple suivant, le contenu de la page d’information est modifié en insérant un cadre HTML (iframe) pointant vers www.google.fr.
- La première étape consiste à tester des valeurs du paramètre page, le but étant in fine de faire exécuter des commandes illégitimes à la base de données. Il peut s’agir de :
‘info; update table_page set contenu_page= »