Cover Image

Qu'est ce qu'une injection de commande système ?


Une injection de commande système est une technique de piratage courante utilisée pour exécuter des commandes directement sur le système d’exploitation d’un serveur web. Cette technique permet à l’attaquant de prendre le contrôle total du système d’exploitation et de l’utiliser à des fins malveillantes.

L’attaque se produit lorsque les attaquants parviennent à insérer des commandes malveillantes dans des champs de formulaire ou d’autres entrées utilisateur de l’application web. Si les développeurs n’ont pas correctement filtré et validé ces entrées, l’attaquant peut exploiter cette faille pour exécuter des commandes sur le système d’exploitation du serveur. Exemple d’une injection de commande système :

Supposons qu’un site web dispose d’un formulaire qui permet aux utilisateurs de vérifier si un site web est en ligne ou hors ligne en entrant l’adresse URL dans un champ de formulaire. Le code côté serveur utilise la fonction exec() pour exécuter une commande système qui vérifie si le site web est en ligne en envoyant une requête HTTP à l’adresse URL soumise. Voici un exemple de code :

<?php
if(isset($_POST['submit'])){
    $url = $_POST['url'];
    $command = "curl -I " . $url;
    exec($command, $output, $result);
    if ($result == 0 && strpos($output[0], '200 OK') !== false) {
        echo "Le site web est en ligne.";
    } else {
        echo "Le site web est hors ligne.";
    }
}
?>
  • Dans ce cas, si un attaquant soumet une commande malveillante dans le champ d’URL, il peut exécuter des commandes système sur le serveur.
  • Par exemple, si l’attaquant entre l’URL suivante dans le champ de formulaire :
example.com; rm -rf /

Le serveur exécutera la commande curl -I example.com; rm -rf /, qui envoie une requête HTTP à example.com et supprime tous les fichiers du serveur. Cela peut causer des dommages considérables.

Comment prévenir une injection de commande système :

Pour prévenir une injection de commande système, les développeurs doivent suivre certaines pratiques de sécurité recommandées, notamment :

  • Valider et filtrer toutes les entrées utilisateur, y compris les champs de formulaire, les cookies et les en-têtes HTTP. Les développeurs peuvent utiliser des fonctions telles que “mysqli_real_escape_string” pour échapper les caractères spéciaux et les requêtes préparées pour valider les entrées utilisateur.

  • Utiliser des techniques de codage sécurisées, telles que le codage de type “whitelist” pour s’assurer que les entrées utilisateur contiennent uniquement des caractères autorisés. Il est également important de limiter l’accès aux fichiers sensibles sur le serveur et de ne pas utiliser de fonctions obsolètes ou non sécurisées.

  • Effectuer régulièrement des mises à jour du logiciel et des correctifs de sécurité pour s’assurer que toutes les vulnérabilités connues sont corrigées.

  • Surveiller régulièrement l’activité du serveur pour détecter toute activité suspecte ou toute tentative d’intrusion.

Il est important de mettre en œuvre ces pratiques de sécurité dès le début du développement de l’application web et de les maintenir tout au long de la durée de vie de l’application.

Comment éviter l’injection de commande système dans l’exemple de vérification de site web ?

Dans l’exemple de vérification de site web présenté précédemment, le code côté serveur utilise la fonction exec() pour exécuter la commande système qui vérifie si le site web est en ligne. Cependant, cette fonction peut être utilisée pour exécuter n'importe quelle commande système, y compris des commandes malveillantes.

Pour éviter une injection de commande système dans ce cas, les développeurs doivent valider et filtrer correctement toutes les entrées utilisateur et utiliser des fonctions de système d’exploitation sécurisées pour exécuter des commandes système.

Pour valider et filtrer les entrées utilisateur, les développeurs peuvent utiliser des fonctions telles que preg_match() pour s’assurer que l’URL soumise ne contient que des caractères alphanumériques et des caractères autorisés. Les développeurs peuvent également limiter les caractères autorisés pour l’URL soumise, en ne permettant que les caractères valides pour les adresses web.

En outre, plutôt que d’utiliser la fonction exec() pour exécuter des commandes système, les développeurs devraient utiliser des fonctions de système d’exploitation sécurisées, telles que shell_exec() ou proc_open(). Ces fonctions permettent de spécifier explicitement la commande à exécuter et d’échapper correctement les caractères spéciaux pour éviter une injection de commande système.

Enfin, il est important de rester vigilant et de surveiller régulièrement l’activité du serveur pour détecter toute activité suspecte ou toute tentative d’intrusion. En cas de soupçon d’une injection de commande système, il est important de prendre des mesures immédiates pour protéger le système et les données sensibles.

Voici une version patchée du code présenté précédemment pour éviter une injection de commande système :

<?php
if(isset($_POST['submit'])){
    $url = $_POST['url'];
    
    /* Vérifier si l'URL est valide en utilisant une expression régulière (RegEx) */
    if(preg_match('/^[a-zA-Z0-9.\/:]+$/',$url)){
        
        /* Échapper les caractères spéciaux */
        $url = escapeshellarg($url);
        
        /* Exécuter la commande système "en toute sécurité" (on sait jamais) */
        $command = "curl -I " . $url;
        $result = shell_exec($command);
        
        /* Vérifier la réponse du serveur distant */
        if (strpos($result, '200 OK') !== false) {
            echo "Le site web est en ligne.";
        } else {
            echo "Le site web est hors ligne.";
        }
    } else {
        echo "URL invalide.";
    }
}
?>

Dans cette version patchée, nous avons ajouté une validation d’URL en utilisant une expression régulière pour s’assurer que l’URL soumise ne contient que des caractères alphanumériques et des caractères autorisés. Nous avons également utilisé la fonction escapeshellarg() pour échapper correctement les caractères spéciaux et éviter toute injection de commande système. Enfin, nous avons utilisé la fonction shell_exec() pour exécuter la commande système de manière “sécurisée”.

En appliquant ces changements, nous pouvons éviter une injection de commande système dans cet exemple spécifique et assurer la sécurité des utilisateurs et des données sur le serveur web.