Lorsqu’une application affiche directement le résultat d’une requête (par exemple une liste de produits filtrée par un paramètre d’URL), l’injection UNION permet à un attaquant d’ajouter ses propres colonnes de résultat et d’extraire ainsi n’importe quelle donnée de la base, bien au-delà de la table initialement interrogée.
Le principe de l’opérateur UNION
En SQL standard, l’opérateur UNION combine les résultats de deux requêtes SELECT en une seule liste, à condition que les deux requêtes retournent exactement le même nombre de colonnes, avec des types compatibles. Une injection UNION consiste à ajouter une seconde requête SELECT, entièrement contrôlée par l’attaquant, à la requête légitime de l’application.
Déterminer le nombre de colonnes
Avant de pouvoir utiliser UNION, l’attaquant doit connaître le nombre exact de colonnes retournées par la requête d’origine. La technique la plus courante consiste à injecter des clauses ORDER BY successives jusqu’à provoquer une erreur :
produit.php?id=1 ORDER BY 1--
produit.php?id=1 ORDER BY 2--
produit.php?id=1 ORDER BY 3--
Lorsque le numéro de colonne dépasse le nombre réel de colonnes de la requête, la base de données renvoie une erreur, ce qui indique précisément combien de colonnes il faut utiliser dans la requête UNION.
Construire la charge utile UNION
Une fois le nombre de colonnes connu (supposons trois), l’attaquant injecte :
produit.php?id=-1 UNION SELECT 1,2,3--
L’identifiant -1 garantit que la requête d’origine ne retourne aucune ligne, ce qui permet d’afficher clairement les valeurs 1, 2 et 3 à la place des colonnes normalement occupées par les données du produit, révélant ainsi quelle colonne est effectivement affichée à l’écran.
Extraire des données sensibles
Une fois la position d’affichage identifiée, l’attaquant remplace les valeurs de test par de véritables requêtes sur d’autres tables, par exemple pour extraire les identifiants et mots de passe stockés dans la table des comptes :
produit.php?id=-1 UNION SELECT login,mot_de_passe,3 FROM utilisateurs--
Cette technique permet théoriquement d’extraire n’importe quelle table accessible par le compte de base de données utilisé par l’application, y compris des tables sans rapport apparent avec la page exploitée.
Explorer la structure de la base avant extraction
Avant d’extraire des données précises, un attaquant interroge généralement les tables système d’information (information_schema sous MySQL et PostgreSQL) afin de lister les tables et colonnes existantes, sans connaissance préalable du schéma de la base.
UNION SELECT table_name,2,3 FROM information_schema.tables--
- L’injection UNION ajoute une requête SELECT entièrement contrôlée par l’attaquant
- Le nombre de colonnes se détermine via des clauses ORDER BY successives
- Un identifiant inexistant (-1) force l’affichage exclusif des données injectées
- Les tables information_schema permettent de cartographier la base avant extraction

-
Add a note