Cybercursus

L'injection UNION-based

12 min · Intermédiaire · 5 août 2026

Sommaire
  1. Combiner deux requêtes avec UNION
  2. Trouver le nombre de colonnes à l’aveugle
  3. Extraire des données d’une autre table
Emplacement publicitaire 1

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.

Emplacement publicitaire 2

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.

Que doit vérifier une injection UNION SELECT pour fonctionner ?
Comment déterminer le nombre de colonnes d'une requête à l'aveugle ?
Emplacement publicitaire 3

Pour aller plus loin

Commentaires

Recherche