Lignes directrices

Injection 101

L'une des catégories de vulnérabilités les plus connues est celle des vulnérabilités par injection, en particulier, ce qui ne surprend personne, l'enfant-vedette incontesté : l'injection SQL. Il est difficile d'éviter d'entendre parler de l'injection SQL dans le monde de la technologie, c'est pourquoi nous allons en parler. 

Avec l'injection SQL, il est possible de manipuler le comportement d'une requête SQL pour qu'elle fasse le travail d'un attaquant. 

Il existe également de nombreux autres types d'injection qui, bien que différents en apparence, fonctionnent tous selon le même principe. 

Pour résumer, les types d'injection les plus courants sont les suivants :

  • Injection SQL
  • Cross-Site Scripting (injection HTML/Javascript)
  • Traversée de chemin (injection de chemin/Url)
  • Injection de commande
  • Injection de code 

Un peu d'injection 101

Si vous regardez la liste précédente des types d'injection, ils ont tous une chose en commun : ils impliquent tous une chaîne de caractères, qui est exécutée par un interpréteur, qui fait ensuite ce que la chaîne représente. Nous avons marqué l'"entrée utilisateur" par des crochets.     

Type Exemple de saisie Comment il est interprété
SQL SELECT name FROM users WHERE username = '{admin}' (nom d'utilisateur) Sélectionne la colonne "Nom" de toutes les lignes du tableau des utilisateurs dont le nom d'utilisateur est "admin".
HTML {John Smith} Indique le nom "John Smith" en caractères gras
Chemin d'accès /var/www/app/documents/{privacy-policy.pdf} Pointe le fichier `privacy-policy.pdf` dans le dossier `/var/www/app/documents/`.
Commandement ping {8.8.8.8} Envoie une série de pings ICMP à l'adresse IP `8.8.8.8`.
Code const name = '{John Smith}'; Fixe la variable constante `nom` à la valeur `John Smith`.

Que se passerait-il donc si l'insertion des données par l'utilisateur n'était pas sécurisée ? Que pourrait faire un pirate ? Là encore, tout ce qui se trouve entre les crochets est considéré comme une "entrée utilisateur" dans ce scénario.

Type Exemple de saisie Comment il est interprété
SQL - Injecté SELECT name FROM users WHERE username = '{1' UNION SELECT passwordhash from users WHERE username = 'admin}' Sélectionne le "Nom" de toutes les lignes du tableau des utilisateurs dont le nom d'utilisateur est "admin", et le hachage du mot de passe pour les utilisateurs dont le nom d'utilisateur est "admin".
HTML - Injecté {} Afficher le nom "John Smith" en caractères gras
Chemin - Injecté /var/www/app/documents/{../../../../../../etc/shadow} Pointe vers le fichier `shadow` dans le dossier `/etc/`.
Commande - Injecté ping {8.8.8.8 && ls . } Envoie une série de pings ICMP à l'adresse IP `8.8.8.8`, et affiche le contenu du répertoire courant avec `ls`
Code - Injecté const name = '{John Smith'; exec('ls .'); # }'; Définit la variable constante `name` à la valeur `John Smith`, puis exécute la commande système `ls .

Dans ces exemples, notez comment l'entrée peut être utilisée pour influencer le résultat de l'entrée de l'utilisateur. 

C'est l'essence même de l'injection. Il s'agit d'influencer ce qui est transmis à l'interprète, afin de lui faire faire quelque chose d'autre que ce que le programmeur original avait prévu.

Il ne s'agit là que des éléments de base à prendre en considération. Nous avons séparé certains des différents types d'injection sur leurs propres pages parce qu'ils méritent un peu plus d'attention. 

Vous pouvez les trouver ici :

Injection de commande‍

Traversée de chemin‍

Injection SQL‍

Scripts croisés (Cross-Site Scripting)