Source : Exploits of a Mom
Cette démonstration contient un système complet divisé en trois modules :
- Une application cliente web écrite en PHP. C'est elle qui exposera les failles de sécurité permettant l'injection SQL
- Une base de données relationnelle MySQL, hébergée sur un conteneur Docker
- Un client graphique Adminer, pour inspecter la base de données avec une interface graphique (optionnel)
Le système sera compromis via l'exploitation de faille de sécurité présente dans l'application cliente.
Les programmes suivants doivent être installés sur la machine hôte :
- git
- PHP8+
- Docker et (Docker)Compose
- Cloner le dépôt.
- Créer un fichier .env à partir du fichier .env.dist
cp .env.dist .env
- Lancer le conteneur qui héberge la base de données MySQL (et le conteneur Adminer)
docker-compose up -d
Applications that access MySQL should not trust any data entered by users, who can try to trick your code by entering special or escaped character sequences in Web forms, URLs, or whatever application you have built. Be sure that your application remains secure if a user tries to perform SQL injection by entering something like
; DROP DATABASE mysql;
into a form. This is an extreme example, but large security leaks and data loss might occur as a result of hackers using similar techniques, if you do not prepare for them.Source : Handle External Data Properly, de la documentation officielle de MySQL
Une injection SQL désigne un ensemble de méthodes d'exploitation de faille de sécurité d'une application interagissant avec une base de données relationnelle. Elle consiste à injecter des instructions SQL non prévues initialement par l'application cliente permettant de compromettre sa sécurité (cohérence, disponibilité, confidentialité, intégrité). Il existe tout un ensemble de méthodes pour y parvenir.
Comment fonctionne l'injection ? En insérant des caractères spéciaux permettant de briser la logique de la requête SQL initiale. En effet, une requête SQL est une séquence de caractères alphanumériques interprétée par le serveur de base de données. Il est donc possible de transformer une requête dynamiquement en y insérant les bons caractères au bon endroit.
Une injection SQL est donc une attaque qui vise les clients d'un serveur de base de données. C'est au niveau du client de la base de données, le plus souvent une application web, que la faille est exploitée s'il y'en a. Si l'application cliente ne prend pas des précautions pour se prémunir de telles attaques, elle met en péril le système tout entier, car la base de données est le coeur du système d'information attaqué.
- Exploits of a Mom, comic strip d'xkcd sur l'injection SQL
- Running an SQL Injection Attack - Computerphile , un bon exposé de ce qu'est une injection SQL accompagné d'une démonstration, dont la démo présente s'inspire fortement
- Client Programming Security Guidelines MySQL, documentation officielle, un ensemble de règles/conseils de sécurité à suivre pour les clients MySQL (vrai pour d'autres SBGDR)
- Don’t try to sanitize input. Escape output., très bon article de Ben Hoyt indiquant en quoi l'échappement est bien souvent une meilleure stratégie que la sanitization pour préserver la sécurité de son système.