L'injection UNION-based
12 min · Intermédiaire · 5 août 2026
Combiner deux requêtes avec UNION
L’opérateur UNION combine les résultats de deux requêtes SELECT en un seul jeu de résultats. C’est un outil légitime du langage SQL — mais il devient une arme quand une des deux requêtes est injectée par un attaquant.
Prenons une page produit qui exécute la requête suivante, où id vient de l’URL :
SELECT nom, prix FROM produits WHERE id = 1 UNION impose une contrainte stricte : les deux requêtes combinées doivent retourner le même nombre de colonnes, de types compatibles.
Trouver le nombre de colonnes à l’aveugle
Avant de pouvoir écrire une injection UNION, il faut connaître le nombre de colonnes de la requête d’origine — généralement inconnu de l’attaquant. La technique classique consiste à incrémenter un ORDER BY jusqu’à provoquer une erreur :
1 ORDER BY 1 --
1 ORDER BY 2 --
1 ORDER BY 3 -- (erreur : la colonne 3 n'existe pas) Une erreur sur ORDER BY 3 indique que la requête d’origine ne retourne que deux colonnes.
Extraire des données d’une autre table
Une fois le nombre de colonnes connu, une requête UNION SELECT portant sur une autre table peut être injectée à la place de l’identifiant attendu :
1 UNION SELECT identifiant, mot_de_passe FROM utilisateurs -- Si l’application affiche le résultat de la requête sans distinguer sa provenance, les colonnes nom et prix affichées à l’écran contiennent en réalité un identifiant et un mot de passe issus d’une table totalement différente.
Essaie-le toi-même sur la base boutique-vulnerable (mêmes tables produits et utilisateurs que ci-dessus) :
SELECT nom, prix FROM produits WHERE id = 1 ℹ️ Info
Cette technique suppose que le résultat de la requête est directement affiché à l’utilisateur. C’est le cas le plus favorable à l’attaquant ; d’autres variantes existent lorsque ce n’est pas le cas, mais elles dépassent le cadre de ce chapitre.