PHP Injection de ligne de commande


Exemple

Problème

De la même manière que l'injection SQL permet à un attaquant d'exécuter des requêtes arbitraires sur une base de données, l'injection en ligne de commande permet à quelqu'un d'exécuter des commandes système non fiables sur un serveur Web. Avec un serveur incorrectement sécurisé, cela donnerait à un attaquant un contrôle total sur un système.

Supposons, par exemple, qu'un script permette à un utilisateur de répertorier le contenu d'un répertoire sur un serveur Web.

<pre>
<?php system('ls ' . $_GET['path']); ?>
</pre>

(Dans une application du monde réel, on utiliserait les fonctions ou objets intégrés de PHP pour obtenir le contenu du chemin. Cet exemple concerne une simple démonstration de sécurité.)

On pourrait espérer obtenir un paramètre de path similaire à /tmp . Mais comme toute entrée est autorisée, le path pourrait être ; rm -fr / . Le serveur web exécuterait alors la commande

ls; rm -fr /

et essayez de supprimer tous les fichiers de la racine du serveur.

Solution

Tous les arguments de commande doivent être échappés en utilisant escapeshellarg() ou escapeshellcmd() . Cela rend les arguments non exécutables. Pour chaque paramètre, la valeur d'entrée doit également être validée .

Dans le cas le plus simple, nous pouvons sécuriser notre exemple avec

<pre>
<?php system('ls ' . escapeshellarg($_GET['path'])); ?>
</pre>

Suivant l'exemple précédent avec la tentative de suppression de fichiers, la commande exécutée devient

ls '; rm -fr /'

Et la chaîne est simplement passée en paramètre à ls , plutôt que de terminer la commande ls et d'exécuter rm .

Il convient de noter que l'exemple ci-dessus est maintenant sécurisé de l'injection de commandes, mais pas de la traversée de répertoires. Pour résoudre ce problème, il convient de vérifier que le chemin normalisé commence par le sous-répertoire souhaité.

PHP offre une variété de fonctions pour exécuter des commandes système, notamment exec , passthru , proc_open , shell_exec et system . Tous doivent avoir leurs intrants soigneusement validés et échappés.