Tous les articles
Injection06/09/20265 min

Injection de commande : quand un champ texte parle au serveur

Certains sites transmettent un bout de texte du visiteur directement au système d’exploitation. Un attaquant peut alors exécuter ses propres commandes, pas les vôtres.

Le principe

Certaines fonctionnalités — convertir un fichier, tester une connexion réseau, générer un PDF — appellent en coulisses un programme du système d’exploitation, avec un morceau de texte fourni par le visiteur inséré dans la commande envoyée.

Si ce texte n’est pas isolé correctement, un attaquant peut y glisser un caractère spécial (point-virgule, esperluette, tube) qui termine la commande prévue par le développeur et démarre la sienne à la suite, dans le même souffle.

Un exemple concret

Un outil « tester la connectivité » qui exécute en coulisses ping suivi de l’adresse fournie. Si le visiteur saisit 8.8.8.8 puis un caractère de séparation suivi d’une commande d’identification, et que le site n’isole pas correctement l’entrée, le serveur exécute réellement DEUX commandes à la suite : le ping attendu, puis celle de l’attaquant.

Cette seconde commande peut révéler sous quel compte tourne le serveur, lister des fichiers, ou bien pire. Remplacez l’exemple inoffensif par une commande de téléchargement et d’exécution, et c’est l’accès complet à la machine.

Pourquoi c’est grave

Contrairement à une injection SQL qui compromet une base de données, une injection de commande compromet directement le SERVEUR lui-même : lire n’importe quel fichier système, installer une porte dérobée persistante, rebondir vers le reste du réseau interne de l’entreprise.

OWASP la classe sous A03:2021 – Injection. C’est généralement considérée comme l’une des failles web les plus graves qui existent, souvent notée au maximum de l’échelle de sévérité (CVSS), parce que le résultat final est la prise de contrôle du serveur, sans détour.

Comment s’en protéger

Éviter à tout prix d’appeler un interpréteur de commande shell avec du texte utilisateur inséré directement dedans. Quand un appel à un programme externe est vraiment nécessaire, utiliser les fonctions qui passent les arguments sous forme de LISTE séparée, jamais une chaîne de caractères concaténée à la main.

Concrètement, en Python, subprocess.run(["ping", "-c", "1", ip], shell=False) et jamais os.system("ping " + ip). Valider strictement le format attendu en amont : une adresse IP doit correspondre à un motif d’adresse IP, rien d’autre n’est accepté.

Comment SauronSec la détecte

Un jeton unique et inoffensif est inséré dans une commande d’écho bénigne. Si ce jeton exact revient dans la réponse SANS que la commande d’écho elle-même n’apparaisse littéralement à côté — preuve qu’il a bien été exécuté et non simplement affiché tel quel — c’est la preuve d’exécution réelle.

En complément, une variante temporelle (une commande qui fait attendre le serveur un temps précis et proportionnel à la charge envoyée) confirme sans le moindre doute, même dans les cas où rien n’est visible dans la réponse elle-même.

Ces failles sont-elles sur votre site ?

SauronSec les détecte, les prouve, et vous livre le correctif — sans faux positif.

Prêt à scanner sans le moindre doute ? Demander un audit