Qu’est-ce que l’injection de Code et Comment l’Éviter
Les vulnérabilités d’injection de code sont un terme général qui décrit les vulnérabilités qui peuvent être exploitées par un attaquant pour injecter et exécuter du code malveillant.
Cette vulnérabilité est généralement due à l’absence de validation des données non fiables. Les applications qui évaluent directement le code sans le valider au préalable seraient vulnérables à ce type d’attaque.
L’injection de code est parfois confondue avec d’autres vulnérabilités telles que l’injection de commandes et. Il convient de noter que l’injection de code est un type de vulnérabilité différent, par lequel un attaquant injecte du code au lieu de commandes du système d’exploitation. Cela signifie qu’en ce qui concerne les vulnérabilités d’injection de code, l’attaquant est limité par la fonctionnalité de langage de l’application.
Limitations des attaquants
Lors de l’exploitation de telles vulnérabilités, les attaquants sont limités par le langage de l’application (tel que PHP/Python). Cependant, dans la plupart des cas, l’attaquant peut tirer parti des fonctionnalités de l’interpréteur pour passer de l’injection de code à l’Injection de commandes.
Par exemple, si un attaquant injecte du code PHP dans une application Web, il sera limité par les fonctionnalités disponibles par l’interpréteur PHP. Lorsque l’attaque par injection se produit, l’interpréteur PHP exécuterait le code injecté et dépendrait de la fonctionnalité de l’interpréteur, un attaquant pourrait tirer parti des fonctions d’exécution de programme disponibles en PHP telles que system() ou shell_exec afin d’exécuter des commandes système.
L’Impact d’une injection de code
L’impact qu’aurait une attaque réussie peut varier en fonction de plusieurs facteurs tels que le langage utilisé par l’application, les fonctionnalités disponibles par application, etc.
Cependant, dans la plupart des cas, une attaque réussie pourrait compromettre complètement la confidentialité, l’intégrité et la disponibilité de l’application et de ses données.
Exemple
Imaginez une application Web qui transmet des données non fiables, telles que l’entrée de l’utilisateur à une fonction PHP eval(). La fonction eval() évalue simplement une chaîne en tant que code PHP tant qu’elle a une syntaxe PHP valide et se termine par un point-virgule.
<?php
backupsauvegarde = “”;
$ input=GET_GET;
eval(“\backupbackup=\inputinput;”);
?>
Étant donné que l’application transmet l’entrée de l’utilisateur à la dangereuse fonction PHP eval() et qu’aucune validation n’est effectuée, l’application serait vulnérable aux attaques par injection de code.
Un attaquant pourrait exploiter cette faiblesse en fournissant l’entrée 1; phpinfo(); comme indiqué ci-dessous:
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; phpinfo();
Exécuter des commandes système du système d’exploitation
Après avoir vérifié la vulnérabilité, un attaquant peut exécuter des commandes système en exploitant les fonctions de l’interpréteur qui permettent l’exécution des commandes. Dans ce cas, la fonction system() est utilisée.
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; system(‘whoami’) ;
La commande whoami affiche le nom d’utilisateur de l’utilisateur actuel lorsqu’elle est invoquée. Cela signifie que lorsque l’application
transmet l’entrée de l’utilisateur à la fonction eval(), l’interpréteur PHP exécutera la commande whoami sur le système d’exploitation sous-jacent
.
Une fois que l’attaquant peut exécuter des commandes système, il peut obtenir un shell interactif sur le système
vulnérable et mener d’autres attaques contre d’autres systèmes du réseau interne du système compromis.
Prévention
Quel que soit le langage utilisé, les vulnérabilités d’injection de code peuvent être évitées en suivant les meilleures pratiques
décrites ci-dessous:
- Évitez d’évaluer des données non fiables
◦ Sauf si cela est strictement requis, n’évaluez pas directement les données non fiables à l’aide de fonctions dangereuses telles que eval(). * Traitez toutes les données comme non fiables
◦ Notez que les données non fiables ne se réfèrent pas uniquement aux entrées fournies via des formulaires HTML. Les informations contrôlées par les utilisateurs telles que les cookies, les en-têtes de requête HTTP et les fichiers téléchargés doivent être traitées comme non fiables.
- Validezdonnées non fiables
◦ Validez toujours l’entrée utilisateur côté serveur.
◦ Si l’utilisateur est censé soumettre une entrée dans un format spécifique tel que la date, le code postal, les numéros, l’adresse e-mail
, etc., assurez-vous que la saisie de l’utilisateur correspond au format attendu.
◦ Si l’application attend une valeur dans un ensemble limité d’options, suivez une approche de liste blanche et assurez-vous que
l’entrée soumise est l’une des options autorisées.
- Durcir l’interpréteur
◦ Par exemple, la fonctionnalité de l’interpréteur PHP doit être limitée à la fonctionnalité minimale requise pour que l’application fonctionne. Cela pourrait rendre beaucoup plus difficile pour les attaquants d’exécuter des commandes système. Par exemple, les fonctions d’exécution du programme PHP pourraient être désactivées en modifiant le php.fichier ini.
- Analyse statique
◦ Effectuer des activités d’analyse statique pour identifier les vulnérabilités liées à une évaluation dangereuse.
- VAPT
◦ Effectuer régulièrement des activités d’évaluation de la vulnérabilité et de test de pénétration pour identifier et atténuer ces faiblesses.